• 診断項目 No.71/127
  • 公開ファイル・情報露出
  • 重大度 中(medium)

robots.txtに機密パスを列挙していないか?Disallowの危険性・正しい隠し方・診断基準

robots.txtに機密パスを列挙していないかの確認方法を解説。Disallow: /admin/ などは攻撃者に地図を渡す行為です。RFC 9309の仕様、noindexや認証との使い分け、Apache・nginxの保護設定と診断基準を紹介します。

結論(robots.txtに機密パスを列挙していない)

robots.txtに機密パスを列挙していないとは、誰でも取得できるrobots.txtのDisallow行に、/admin/や/backup/のような管理・バックアップ・内部用のパスを書いていない状態です。RFC 9309はrobots.txtがアクセス制御の代わりにならず、列挙したパスは公開され発見可能になると明記しています。見られてはいけないものは認証で保護するか削除し、検索結果からの除外はnoindexで行います。

この記事のポイント

  • robots.txtはクローラーへのお願いで、ブラウザや攻撃ツールは参照しないため、Disallowはアクセス制御になりません。
  • Disallow: /admin/ や /backup/ は、攻撃者に「ここに重要なものがある」という地図を渡すことになります。
  • 検索結果から外したいページはnoindexを使い、noindexを読ませるためrobots.txtでは拒否しません。
  • robots.txtからパスを消す前に、そのパスの保護(削除・認証)を済ませるのが正しい順序です。
  • セキュリティAIチェッカーは、Disallowに/admin・/backup・/private・/internal・/secretで始まるパスがあれば△と判定します。
診断項目名robots.txtに機密パスを列挙していない
項目IDpublic.robots
分類公開ファイル・情報露出
重大度・配点の重み中(medium) 重み 2
関連する標準・ガイドラインRFC 9309 Robots Exclusion Protocol(2022年9月)。第3節で「アクセス制御の代わりにはならない」と明記、OWASP WSTG-INFO-03(Webサーバーのメタファイルから情報漏えいを確認)、OWASP ASVS 5.0.0 V13.4.5(内部向けのドキュメントや監視エンドポイントを意図なく公開しない)、CWE-200(権限のない者への機密情報の露出)

robots.txtに機密パスを列挙していないとは

robots.txtに機密パスを列挙していないとは、robots.txtの Disallow 行に、管理・バックアップ・内部用を示すパスを書いていない状態のことです。

robots.txtは、検索エンジン等のクローラーに「どのURLを巡回してよいか」を伝えるためのテキストファイルで、サイトのルート(/robots.txt)に置きます。誰でも取得できるファイルであり、記載したパスはそのまま公開情報になります。

# 好ましくない例:管理画面とバックアップの場所を公開している
User-agent: *
Disallow: /admin/
Disallow: /backup/

管理画面やバックアップ置き場を検索結果に出したくないという理由で、Disallow: /admin/ や Disallow: /backup/ のように書いてしまうと、「ここに重要なものがある」という地図を攻撃者に渡すことになります。RFC 9309は、robots.txtが有効なセキュリティ対策の代替ではないことを明記しており、OWASP WSTGでもrobots.txtは調査(偵察)の最初の確認対象です。

この項目は、robots.txtの Disallow 行に、管理・バックアップ・内部用を示す代表的なパス名が列挙されていないかを確認します。サイトマップに非公開ページが載っている問題は「sitemapに非公開ページを含めていない」で別に確認します。

robots.txtの仕様とセキュリティ上の位置付け

robots.txtの仕様の要点(RFC 9309)

  • User-agent、Allow、Disallow の行でグループを構成します。Disallow のパスは前方一致で評価されます。
  • フィールド名の後のコロンの前後には空白を置けます(Disallow : /x も有効)。
  • クローラーは少なくとも5回のリダイレクトを追跡すべきとされています。
  • 4xxのときクローラーはすべてのURLにアクセスしてよく、5xxのときは全面的に禁止と見なします。
  • 解析上限は少なくとも500KiBです。キャッシュは原則24時間までです。
  • 第3節: robots.txtは有効なコンテンツ保護策の代替ではなく、列挙したパスは公開され発見可能になります。WSTGもクローラーが Disallow を意図的に無視し得ることを指摘し、最新版(latest)ではAIクローラーがrobots.txtを無視する例にも触れています。

検索結果に出さない方法との違い

Googleの公式ドキュメントは、robots.txtが「Googleの検索結果にページを表示させないための仕組みではない」と説明し、robots.txtで拒否したページでも他サイトからリンクされていればURLが検索結果に出ることがあるとしています。検索結果から除外したい場合は noindex(metaタグまたは X-Robots-Tag ヘッダー)を使い、そもそも見られてはいけないものは認証で保護するか、公開領域から削除します。

目的正しい手段robots.txtの役割
クロール負荷の調整robots.txt本来の用途
検索結果からの除外noindex(クロールを許可したうえで)拒否するとnoindexが読まれない
第三者からの閲覧防止認証・IP制限・削除役に立たない(むしろ場所を教える)

記述パターンの評価

robots.txtの記述評価理由
Disallow: /search/問題なし検索結果ページの大量巡回を防ぐ一般的な負荷対策
Disallow: /cgi-bin/問題なし古くからの定型的な記述
Disallow: /admin/要確認管理画面の位置を示す
Disallow: /backup/要確認バックアップの存在を示す。公開領域に置くこと自体が問題
Disallow: /internal/docs/要確認内部向け資料の存在を示す
Disallow: / (全拒否)運用上の確認が必要本番に残すと検索結果から消える
Sitemap: https://…/sitemap.xml問題なしサイトマップの場所の案内

本当に隠したいパスを書く代わりに、上位の無関係な名前のディレクトリでまとめる工夫も見られますが、それも「隠すことによる安全」にすぎません。保護は認証で行い、robots.txtには公開しても困らない情報だけを書く、という原則で整理するのが確実です。

robots.txtについてよくある誤解

  • 「Disallowすれば誰も見られない」:robots.txtはお願いであり、ブラウザや攻撃ツールはまったく参照しません。
  • 「管理画面を検索結果から隠すためにDisallowが必要」:管理画面は認証で保護されていれば検索結果に本文は載りません。noindexを返す、あるいはインターネットから到達できないネットワークに置くのが適切です。
  • 「robots.txtを置かないとよくない」:robots.txtは任意です。置かない場合、クローラーはすべてのURLを巡回してよいと解釈します。

robots.txtに機密パスを列挙していないの診断基準(セキュリティAIチェッカー)

取得方法

  • 診断の最終URLのオリジンに対し /robots.txt をGETします(リダイレクトは追跡しない、タイムアウト4秒、最大100,000バイト。上限を超える応答は先頭部分で打ち切って判定)。
  • ステータス200で、本文がHTMLではない(先頭1,000文字に <!doctype html>、<html>、<head>、<body>、<div>、<script> がない)ものをrobots.txtとして評価します。

判定条件

本文に次の正規表現(大小文字を区別しない)に一致する行があるかを確認します。

disallow\s*:\s*/(?:admin|backup|private|internal|secret)

/admin、/administrator、/backup、/backups、/private、/internal、/secret などで始まるパスが対象です。

判定条件得点への影響
○ 問題なし(pass)一致しない。根拠欄は「代表的な機密パス名は確認されません。」重み2 × 1.00
△ 要確認(warn)上記パターンに一致する Disallow がある。根拠欄は「機密性が疑われるパス名があります。」重み2 × 0.45
対象外(na)robots.txtがない(200以外)、または200でもHTML(CMSのエラーページ等)計算から除外

× 要改善(fail)はありません。パス名の列挙だけでは実害の有無が判断できず、実際に保護されているかは別途確認が必要なため、「要確認」の △ にしています。

判定の限界

  • 代表的な5語のみを対象にしています。/kanri/(管理)、/test/、/staff/、/cms/ など日本語ローマ字や製品固有のパスは対象外です。
  • Disallow: /wp-admin/ のように語の前に別の文字列がある場合は一致しません(WordPressの管理画面の場所は広く知られており、列挙による追加の情報漏えいは小さいため)。
  • 列挙されたパスが実際に認証で保護されているかは確認しません。
  • robots.txtへのリダイレクトは追跡しないため、/robots.txt を別URLへ転送している構成は対象外になります。

自治体サイトでの判定例

robots.txtの状態判定
Disallow: /admin/(管理画面の場所が分かる)△
Disallow: /cgi-bin/、Disallow: /search/(負荷対策として一般的)○
robots.txtが404対象外
存在しないURLにトップページHTMLを200で返すCMS対象外

robots.txtに機密パスを書くとどんなリスクがあるか

  • 攻撃対象の発見を容易にする:管理画面、旧システム、バックアップ置き場のURLが分かると、攻撃者はそこに絞ってパスワード総当たりや既知脆弱性の探索を行えます。
  • 保護漏れの露呈:「検索に出なければよい」という考えで認証をかけずに置かれた資料(内部向け文書、個人情報を含む名簿等)がDisallowに列挙されていると、URLを直接開くだけで閲覧されます。
  • 検索結果へのURL露出:robots.txtで拒否したページでも、外部からリンクされるとURLだけが検索結果に出ることがあります。

バックアップなどの管理ファイルそのものが取得できる問題は、「代表的な管理ファイルが公開されていない」で確認します。

robots.txtの機密パスへの対策(Apache・nginx・IIS・Next.js)

1. まず保護する

列挙されているパスについて、次のいずれかを行います。

  • 不要なら削除する。
  • 必要なら認証(ID・パスワード、多要素認証)やIP制限をかける。管理画面は庁内ネットワークやVPNからのみ到達できるようにする。

Apache(.htaccess)で管理画面をIP制限する例:

<IfModule mod_authz_core.c>
  <If "%{REQUEST_URI} =~ m#^/admin(/|$)#">
    Require ip 192.0.2.0/24
  </If>
</IfModule>

nginx:

location ^~ /admin/ {
    allow 192.0.2.0/24;
    deny all;
}

IIS:「IPアドレスおよびドメインの制限」機能で /admin 仮想ディレクトリに許可リストを設定します。

2. 検索結果から外したいページはnoindexにする

# Apache: 特定ディレクトリにnoindexヘッダーを付ける
<If "%{REQUEST_URI} =~ m#^/kanri/#">
  Header set X-Robots-Tag "noindex, nofollow"
</If>
location ^~ /kanri/ { add_header X-Robots-Tag "noindex, nofollow" always; }

Next.js(Vercel)では next.config.js の headers() で X-Robots-Tag を返すか、ページの metadata.robots で index: false を設定できます。noindexを読ませるため、そのパスはrobots.txtで拒否しないでください。

3. robots.txtを整理する

User-agent: *
Disallow: /cgi-bin/
Disallow: /search/
Sitemap: https://www.city.example.lg.jp/sitemap.xml

本当に負荷対策としてクロールを止めたいパスだけを残し、管理・内部用のパスは削除します。

4. 確認方法

curl -s https://www.city.example.lg.jp/robots.txt | grep -iE 'disallow\s*:\s*/(admin|backup|private|internal|secret)'
# 列挙していたパスに未認証でアクセスできないこと
curl -s -o /dev/null -w '%{http_code}\n' https://www.city.example.lg.jp/admin/

整理後はセキュリティAIチェッカーで再診断し、根拠欄が「代表的な機密パス名は確認されません。」になっていることを確認します。

検索流入を失わないための注意点(ガードレール)

  • robots.txtからパスを消す前に、そのパスの保護(削除・認証)を済ませてください。順序が逆だと、検索エンジンが巡回して内容が索引に載るおそれがあります。
  • Disallow: / を誤って本番に残すと、サイト全体が検索結果から消えていきます。テスト環境からのコピー時に注意します。
  • CMSが自動生成するrobots.txtを使っている場合は、CMS側の設定画面で編集します。
  • 整理の前後で、Google Search Consoleのrobots.txtレポートやURL検査で、主要ページがクロール可能なままであることを確認します(旧「robots.txtテスター」は2023年に廃止されています)。

よくある質問(FAQ)

robots.txtでDisallowすれば管理画面は見られませんか?

見られます。robots.txtはクローラーへのお願いであり、ブラウザや攻撃ツールはまったく参照しません。RFC 9309も、robots.txtが有効なコンテンツ保護策の代替ではないと明記しています。管理画面は認証やIP制限で保護してください。

管理画面を検索結果に出さないにはどうすればよいですか?

管理画面は認証で保護されていれば検索結果に本文は載りません。noindexを返す、あるいはインターネットから到達できないネットワークに置くのが適切です。robots.txtで拒否したページでも、他サイトからリンクされているとURLが検索結果に出ることがあります。

robots.txtは置かなければいけませんか?

robots.txtは任意です。置かない場合、クローラーはすべてのURLを巡回してよいと解釈します。404などの4xxのときクローラーはすべてのURLにアクセスしてよく、5xxのときは全面的に禁止と見なします。

Disallow: /wp-admin/ はセキュリティAIチェッカーで△になりますか?

なりません。判定は /admin などの語でパスが始まる場合だけで、/wp-admin/ のように語の前に別の文字列がある場合は一致しません。WordPressの管理画面の場所は広く知られており、列挙による追加の情報漏えいは小さいためです。

robots.txtから機密パスを消すときの注意点は何ですか?

消す前に、そのパスを削除するか認証で保護してください。順序が逆だと、検索エンジンが巡回して内容が索引に載るおそれがあります。整理の前後で、Google Search Consoleのrobots.txtレポートやURL検査で主要ページがクロール可能なままか確認します。

robots.txtがないと診断ではどうなりますか?

robots.txtが200以外の応答、または200でもHTML(CMSのエラーページ等)の場合は対象外となり、得点の計算から除外されます。リダイレクトは追跡しないため、/robots.txtを別URLへ転送している構成も対象外です。

セキュリティAIチェッカーを利用する

この項目を含む127項目を、URLを入れるだけで無料診断します。

参考資料