結論(security.txtを公開)
security.txtを公開するとは、脆弱性を見つけた人が「どこに連絡すればよいか」を示すテキストファイルを、RFC 9116に従って https://ドメイン/.well-known/security.txt に置くことです。必須フィールドはContact(1つ以上)とExpires(ちょうど1つ)で、HTTPSかつtext/plain; charset=utf-8で配信します。報告窓口が明示されていない自治体サイトでの報告の取りこぼしを、低コストで減らせます。
この記事のポイント
- 設置場所は/.well-known/security.txt(MUST)で、HTTPSで配信します。
- 必須フィールドはContact(1つ以上)とExpires(ちょうど1つ)で、Contactは記載順が優先順位を表します。
- Policy・Preferred-Languages・Canonical・Encryption・Acknowledgments・Hiringは推奨・任意のフィールドです。
- 報奨金(バグバウンティ)の有無とは無関係に設置でき、HTMLの問い合わせページでは代用できません。
- セキュリティAIチェッカーは、200・非HTML・行頭にContact:があるファイルを○とし、それ以外(リダイレクトを含む)は△と判定します。
| 診断項目名 | security.txtを公開 |
|---|---|
| 項目ID | public.security-txt |
| 分類 | 公開ファイル・情報露出 |
| 重大度・配点の重み | 低(low) 重み 1 |
| 関連する標準・ガイドライン | RFC 9116 A File Format to Aid in Security Vulnerability Disclosure(2022年4月)、OWASP WSTG-INFO-03(Webサーバーのメタファイルからの情報収集。security.txtを確認対象に含む)、IPA「情報セキュリティ早期警戒パートナーシップ」(脆弱性関連情報の届出制度。報告受付窓口の整備と関係が深い) |
security.txtを公開するとは
security.txtを公開するとは、Webサイトの脆弱性を見つけた人(研究者、利用者、セキュリティ企業)が「どこに連絡すればよいか」を、機械的にも人間にも分かる形で示すテキストファイルを置くことです。RFC 9116(2022年4月)で標準化され、https://ドメイン/.well-known/security.txt に置きます。
Contact: mailto:security@city.example.lg.jp
Contact: https://www.city.example.lg.jp/security/report.html
Expires: 2027-03-31T14:59:59.000Z
Preferred-Languages: ja, en
Canonical: https://www.city.example.lg.jp/.well-known/security.txt
Policy: https://www.city.example.lg.jp/security/policy.html
自治体サイトでは、問い合わせフォームや代表電話はあっても、「脆弱性の報告」を受け付ける窓口が明示されていないことが多くあります。その結果、善意の報告者が連絡先に迷って報告を諦めたり、一般の問い合わせ窓口に送った報告が担当部署に届かなかったりします。security.txtはこのすれ違いを減らすための低コストな仕組みです。
この項目は、security.txtが所定の場所に、連絡先(Contact)を含むテキストとして公開されているかを確認します。Expiresの期限は「security.txtの有効期限」、Content-Typeや重複など形式面は「security.txtのRFC 9116形式」で別に評価します。
security.txtの書き方と設置場所(RFC 9116の要件)
ファイルの要件
- 置き場所は
/.well-known/security.txt(MUST)。後方互換のためサイト直下/security.txtに置く(またはリダイレクトする)ことも認められますが、両方ある場合は.well-knownが優先されます。 - HTTPSで配信します(MUST)。
Content-Type: text/plain; charset=utf-8で配信します。- 必須フィールドは Contact(1つ以上)と Expires(ちょうど1つ)です。
- 推奨・任意のフィールド:
Encryption(暗号化鍵の場所)、Acknowledgments(謝辞ページ)、Preferred-Languages、Canonical(このファイルの正規URL)、Policy(脆弱性開示方針)、Hiring。 - OpenPGPのクリアテキスト署名を付けることが推奨されています(RECOMMENDED)。
- 研究者は、取得時にリダイレクトがあれば記録し、攻撃者の管理する先へ誘導されていないか注意すべきとされています。
Contactの書き方
Contact には mailto:、tel:、https: のURIを書きます。メールアドレスだけでなく、報告フォームのURLを併記すると、添付や暗号化の扱いを案内しやすくなります。Contactを複数書いた場合は、記載順が優先順位を表します。
フィールドの選び方
| フィールド | 必須/任意 | 自治体での使い方の例 |
|---|---|---|
| Contact | 必須(1つ以上) | 情報政策担当の共有アドレス、報告フォームURL |
| Expires | 必須(1つ) | 年度単位の見直し日(1年未満先) |
| Policy | 任意 | 報告の受付範囲、回答の目安、委託事業者との連携方針を説明したページ |
| Preferred-Languages | 任意 | ja, en(海外の研究者からの報告に備える) |
| Canonical | 任意 | このファイル自身の正規URL。複数ドメインで運用する場合の混乱防止 |
| Encryption | 任意 | 暗号化した報告を受ける場合の公開鍵の場所 |
| Acknowledgments | 任意 | 報告者への謝辞ページ |
コメント行は # で始めます。Policy のページには、報告の受付対象(本庁サイト、施設予約等の関連サイト)、受領確認の目安、報告者に求めること(実害を与える検証をしない等)を書いておくと、報告の質が上がります。
同じ組織の複数ドメインの扱い
security.txtはそのファイルを置いたホスト名に対して有効です。本庁サイト、観光サイト、施設予約などをサブドメインや別ドメインで運用している場合は、それぞれに置くか、主要なサイトに置いたうえで Policy に対象範囲を記載します。
security.txtについてよくある誤解
- 「security.txtを置くと攻撃を招く」:攻撃者は窓口の有無にかかわらず探索します。security.txtは善意の報告を受け取りやすくするための仕組みで、新たな攻撃面を開くものではありません。ただし掲載する連絡先は、迷惑メール対策と受付体制を前提に選びます。
- 「バグバウンティ(報奨金)を出さないと置けない」:報奨金の有無とは無関係です。
Policyで「報奨金はありません」「報告の取扱い」を説明できます。 - 「HTMLの問い合わせページで代用できる」:人間には読めても、自動化ツールや研究者の標準的な確認手順では見つけられません。
security.txtを公開の診断基準(セキュリティAIチェッカー)
取得方法
- 診断の最終URLのオリジンに対し
/.well-known/security.txtをGETします(リダイレクトは追跡しない、タイムアウト4秒、最大100,000バイト。上限を超える応答は先頭部分で打ち切って判定)。 - 次のすべてを満たすものを「有効なsecurity.txt」とみなします。
- ステータス200
- 本文がHTMLではない(先頭1,000文字に
<!doctype html>、<html>、<head>、<body>、<div>、<script>がない) - 行頭(空白可)に
Contact:があり、その後に値が続く(大小文字を区別しない)
判定条件
| 判定 | 条件 | 得点への影響 |
|---|---|---|
| ○ 問題なし(pass) | 有効なsecurity.txtがある。根拠欄は「Contact項目を含むsecurity.txtを確認しました。」 | 重み1 × 1.00 |
| △ 要確認(warn) | 404等で存在しない、HTMLのエラーページが200で返る、Contactがない、または /.well-known/security.txt がリダイレクトされている | 重み1 × 0.45 |
対象外(na)と × 要改善(fail)はありません。security.txtはすべての公開Webサイトに適用できる推奨事項であるため、ない場合は △(改善余地)とします。
判定の補足
- ソフト404(存在しないURLにもHTMLを200で返すCMS)では、HTML判定により「security.txtあり」と誤判定しないようにしています。
- リダイレクトは追跡しないため、
/.well-known/security.txtを別URLへ転送している構成は △ になります。RFC 9116は.well-knownへの設置をMUSTとしているため、ファイルを直接置く構成を推奨します。 - サイト直下の
/security.txtだけを置いている場合も △ です(後方互換の位置であり、正規の位置は.well-known)。 - 有効期限(Expires)は「security.txtの有効期限」で別に評価します。
自治体サイトでの判定例
| 応答の状態 | 判定 |
|---|---|
/.well-known/security.txt が404(国内自治体の多くはこの状態) | △ |
| CMSがトップページHTMLを200で返す(有効なsecurity.txtではない) | △ |
Contact: mailto:johosystem@city.example.lg.jp を含むテキストが返る | ○ |
security.txtがないとどんなリスクがあるか
- 報告の取りこぼし:脆弱性を見つけた第三者が窓口を見つけられず、報告されないまま放置される、あるいはSNS等で公開されてしまうおそれがあります。
- 報告の遅延:一般の問い合わせフォームに届いた報告が、情報システム担当に回るまでに時間がかかり、その間に悪用されるおそれがあります。
- 偽の窓口:security.txtが改ざんされると、報告が攻撃者に流れる可能性があります。Canonicalや署名、ファイルの変更監視で対策します。
security.txtがないこと自体が直接の脆弱性になるわけではないため、重大度はlowです。
security.txtの設置方法(Apache・nginx・IIS・Next.js・CMS)
1. 受付体制を決める
- 受付アドレス(例:
security@や情報政策課の共有アドレス)またはフォームを決め、受領確認・調査・委託事業者への連絡・回答までの流れを定めます。 - 必要に応じて、IPAの届出制度(情報セキュリティ早期警戒パートナーシップ)経由の連絡も受けられることを
Policyで案内します。
2. ファイルを設置する
Apache(静的ファイルとして設置):
# /.well-known/security.txt を置いたうえで、Content-Typeを明示
<Files "security.txt">
ForceType "text/plain; charset=utf-8"
</Files>
nginx:
location = /.well-known/security.txt {
alias /var/www/security/security.txt;
default_type text/plain;
charset utf-8; # Content-Typeに charset=utf-8 を付ける
}
IIS:.well-known フォルダを作成してファイルを置き、拡張子 .txt のMIMEが text/plain であることを確認します。ドットで始まるフォルダをリクエストフィルタリングで拒否している場合は、.well-known を除外します。
Next.js(Vercel):public/.well-known/security.txt に置くと静的配信されます。App Routerの Route Handler(app/.well-known/security.txt/route.ts)で Content-Type を付けて返すこともできます。
CMS(WordPress等):プラグインではなく、Webサーバーのドキュメントルートに直接ファイルを置くのが確実です。CMSのルーティングが全URLを捕捉する設定では、.well-known を除外します。
3. 設置後の確認方法
curl -sI https://www.city.example.lg.jp/.well-known/security.txt
curl -s https://www.city.example.lg.jp/.well-known/security.txt
ステータス200、Content-Type: text/plain; charset=utf-8、本文に Contact: と Expires: があることを確認します。あわせて、curl -sI の結果に Location: ヘッダー(リダイレクト)が含まれていないこと、掲載したアドレスへ試験メールを送り担当者に届くことも確認してください。最後にセキュリティAIチェッカーで再診断し、○ になることを確かめます。
設置時の注意点(ガードレール)
- ドットファイルを拒否するWebサーバー設定(
.git対策など)を入れている場合、/.well-known/を例外にしないと404/403になります。管理ファイルの拒否設定は「代表的な管理ファイルが公開されていない」で解説しています。 - 掲載したアドレスは公開されるため、スパムが増える前提で迷惑メールフィルタと担当者の確認手順を用意します。個人名のアドレスは避けます。
- Expiresは必須です。期限切れのファイルは信頼性が下がるため、更新日を年間スケジュールに組み込みます。
よくある質問(FAQ)
security.txtはどこに置けばよいですか?
https://ドメイン/.well-known/security.txt に置きます(RFC 9116のMUST)。後方互換のためサイト直下の/security.txtに置くことも認められますが、両方ある場合は.well-knownが優先されます。セキュリティAIチェッカーは.well-knownの位置だけを確認します。
security.txtに最低限書く必要がある項目は何ですか?
Contact(1つ以上)とExpires(ちょうど1つ)が必須です。Contactにはmailto:、tel:、https:のURIを書き、メールアドレスに加えて報告フォームのURLを併記すると、添付や暗号化の扱いを案内しやすくなります。
security.txtを置くと攻撃を招きませんか?
攻撃者は窓口の有無にかかわらず探索します。security.txtは善意の報告を受け取りやすくする仕組みで、新たな攻撃面を開くものではありません。ただし掲載する連絡先は公開されるため、迷惑メール対策と受付体制を前提に、個人名ではない共有アドレスを選びます。
バグバウンティ(報奨金制度)がなくてもsecurity.txtを置いてよいですか?
置いてかまいません。security.txtは報奨金の有無とは無関係です。Policyフィールドで示すページで「報奨金はありません」「報告の取扱い」を説明できます。
security.txtを別のURLへリダイレクトしているのに△になるのはなぜですか?
セキュリティAIチェッカーはリダイレクトを追跡しないため、/.well-known/security.txtを別URLへ転送している構成は△になります。RFC 9116は.well-knownへの設置をMUSTとしているため、ファイルを直接置く構成を推奨します。
設置したのにsecurity.txtが404や403になります。
.git対策などでドットで始まるパスを拒否するWebサーバー設定を入れている場合、/.well-known/を例外にしないと404/403になります。IISのリクエストフィルタリングやCMSのルーティングでも.well-knownを除外してください。
この項目を含む127項目を、URLを入れるだけで無料診断します。