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

ディレクトリ一覧を公開していないとは?Index of /が出る原因・リスク・Apache・nginx・IISでの無効化方法

ディレクトリ一覧を公開していないとは、index.htmlのないディレクトリでファイル名一覧(Index of /)を表示させないことです。原因とサーバー別の既定値、Options -Indexes等の無効化設定、診断基準を解説します。

結論(ディレクトリ一覧を公開していない)

ディレクトリ一覧を公開していないとは、Webサーバーがファイル名の一覧ページを自動生成して返さない状態のことです。URLがディレクトリを指し、そこにindex.htmlなどの既定ファイルがないときでも、「Index of /path」などのページを返しません。一覧が見えると、リンクしていない資料、作業途中のファイル、バックアップ、個人情報を含むCSVまで簡単に見つかります。OWASP ASVS 5.0.0 V13.4.3は、明示的な意図がない限りディレクトリ一覧を公開しないよう求めています。

この記事のポイント

  • ディレクトリ一覧(ディレクトリリスティング、インデックス表示)は、index.htmlなどがないディレクトリでサーバーが自動生成するファイル名一覧です。
  • nginxのautoindexとIISのdirectoryBrowseは既定で無効ですが、Apacheは継承された設定からIndexesが有効になっていることがあります。
  • 一覧表示はディレクトリごとに判定されるため、/images/・/pdf/・/uploads/など下層ディレクトリが狙われます。
  • Apacheは Options -Indexes、nginxは autoindex off、IISは directoryBrowse enabled="false" で無効化します。
  • セキュリティAIチェッカーは下層ディレクトリを最大2件確認し、HTTP 200かつ一覧ページ特有の文言があれば×と判定します。
診断項目名ディレクトリ一覧を公開していない
項目IDpublic.directory-listing
分類公開ファイル・情報露出
重大度・配点の重み中(medium) 重み 3
関連する標準・ガイドラインOWASP ASVS 5.0.0 V13.4.3(Webサーバーは明示的な意図がない限りディレクトリ一覧をクライアントへ公開しない/L2)、OWASP WSTG-CONF-04(古い・バックアップ・未参照ファイルの確認:列挙したディレクトリの一覧表示を確認)、CWE-548(Exposure of Information Through Directory Listing)、IPA「安全なウェブサイトの作り方」2.1-5)(公開を想定していないファイルをウェブ公開用ディレクトリに置かない)

ディレクトリ一覧を公開していないとは

ディレクトリ一覧を公開していないとは、Webサーバーがディレクトリ内のファイル名一覧を自動生成して返さない状態のことです。

Webサーバーは、URLがディレクトリ(/files/ のように末尾が /)を指し、そこに index.html などの既定ファイルがない場合、設定によってそのディレクトリ内のファイル名一覧を自動生成して返します。これを「ディレクトリ一覧(ディレクトリリスティング、インデックス表示)」と呼びます。

一覧が見えると、リンクされていない資料、作業途中のファイル、バックアップ、個人情報を含むCSVなど、本来公開するつもりのなかったファイルまで簡単に見つけられてしまいます。セキュリティAIチェッカーのこの項目は、サイト内で見つかった下層ディレクトリにアクセスし、一覧ページが返らないかを確認します。

サーバー別の挙動と既定値

サーバー一覧表示を制御する設定既定値一覧ページの特徴
Apache httpdOptions Indexes(mod_autoindex)配布設定やディストリビューションにより有効な場合がある<title>Index of /path</title>、<h1>Index of /path</h1>
nginxautoindex on/offoff<title>Index of /path/</title>
IIS<directoryBrowse enabled="true">/"false"false見出しが「ホスト名 - /path/」、上位への [To Parent Directory] リンク
TomcatDefaultServlet の listingsfalse「Directory Listing For [/path]」
Python http.server 等常に一覧—「Directory listing for /path」

nginxの公式文書は、ngx_http_autoindex_module が末尾 / のリクエストを処理して一覧を生成し、通常はindexファイルが見つからない場合に呼ばれると説明しています。IISの公式文書は directoryBrowse の enabled 既定値を false としています。Apacheは Options の指定次第で、継承された設定から Indexes が有効になっていることがあります。

なぜディレクトリ一覧を公開してはいけないのか

OWASP ASVS 5.0.0 V13.4.3(L2)は、Webサーバーは明示的な意図がない限りディレクトリ一覧をクライアントへ公開しないことを求めています。OWASP WSTG-CONF-04も、列挙したディレクトリの一覧表示を確認するよう求めています。IPA「安全なウェブサイトの作り方」2.1-5)は、公開を想定していないファイルをウェブ公開用ディレクトリに置かないよう求めています。

ディレクトリ一覧についてよくある誤解

  • 「トップページに index.html があるから大丈夫」:一覧表示はディレクトリごとに判定されます。/images/、/pdf/、/uploads/、/js/ など、index.html を置かない下層ディレクトリが狙われます。
  • 「一覧に出ても重要なファイルはない」:一覧は「今」の状態を示します。職員が一時的に置いたファイルや、CMSが自動生成したエクスポートファイルが、ある日突然見える状態になります。
  • 「robots.txtで隠している」:robots.txtは検索エンジンへの依頼にすぎず、アクセス制御ではありません。むしろ隠したいディレクトリ名を公開することになります。

Apacheの /icons/ のような同梱のデフォルトファイルは「Webサーバー/CMSのデフォルトファイル」、.bak・.old などの残置ファイルは「旧版・バックアップファイルの露出」、管理ファイルの公開は「代表的な管理ファイルが公開されていない」で確認します。このページは「ディレクトリの一覧表示」に絞って解説します。

ディレクトリ一覧を公開していないの診断基準(セキュリティAIチェッカー)

取得対象

  1. トップページと追加ページ(トップページを含め最大3ページ)のHTMLから、同一オリジンのURL(<a>・<link>・<script>・<img>・<iframe> の href/src、フォームの action、JavaScript中の location=・fetch( 等)と、Ver2巡回で確認したページ・API候補を集めます。
  2. 各URLのパスから最後のファイル名を除いたディレクトリ部分(例:/shisei/files/a.pdf → /shisei/files/)を取り出し、重複を除きます。
  3. ルート / を除いた先頭2件を確認対象とし、対象オリジンにディレクトリのパスを連結したURLへ、リダイレクトを追跡せずにGETします(タイムアウト5秒。180KBを超える応答は先頭180KBだけで判定)。確認先は常に診断対象のオリジンで、別ホストへは送りません。

一覧ページの署名

応答がHTTP 200で、本文が次のいずれかに一致した場合を「一覧表示」と数えます(大文字小文字を区別しない)。

署名想定する対象
<title> 直後の index of /Apache、nginx、LiteSpeed など
<h1> 直後の index of /同上
directory listing forTomcat、Python http.server など
[to parent directory]IISのディレクトリ参照

判定条件

判定条件得点への影響
○ 問題なし(pass)確認したディレクトリのいずれも一覧を返さない(403、404、リダイレクト、通常ページ、通信失敗を含む)重み3を満点で加算
△ 要確認(warn)使用しない—
× 要改善(fail)1件以上が200かつ一覧の署名に一致重み3に対して0点
対象外(na)ルート以外のディレクトリ候補が見つからない分母・分子から除外

一覧ページ特有の文言を必須にしているため、ディレクトリURLに通常のトップページを200で返すサイト(soft-404)は○になります。確認するのは最大2ディレクトリなので、○は「確認した範囲で一覧表示なし」を意味し、サイト全体で無効化されていることの証明ではありません。根拠欄には「n/m件でディレクトリ一覧の内容署名が一致」のように件数を表示します。

自治体サイトでの判定例

状況判定
/material/files/group/3/ にアクセスすると「Index of /material/files/group/3」が表示される×
/css/ が403 Forbidden、/shisei/ が通常のカテゴリページ○
トップページが外部CDNの資源だけを参照し、同一オリジンの下層URLが見つからない対象外

ディレクトリ一覧を公開しているとどんなリスクがあるか

  • 未公開資料の漏えい:公開前の報道資料、入札予定価格を含む資料、職員名簿、個人情報入りの申込データなどが一覧から発見されることがあります。
  • バックアップ・設定ファイルの発見:.bak、.old、.zip、.sql、.env などの残置ファイルが一覧で見えると、ソースコードやデータベースの認証情報が漏れる起点になります。
  • 攻撃面の把握:ディレクトリ構成、使用ライブラリのバージョン入りファイル名、管理用スクリプトの存在が分かり、次の攻撃の計画に使われます。
  • 検索エンジン経由の拡散:一覧ページは検索エンジンにクロールされ、「intitle:"index of"」のような検索語で第三者に発見されることがあります。

ディレクトリ一覧を無効化する設定方法(Apache・nginx・IIS・Next.js・CMS)

Apache httpd

# httpd.conf または仮想ホスト設定(推奨)
<Directory "/var/www/html">
    Options -Indexes +FollowSymLinks
    AllowOverride FileInfo AuthConfig Limit Options=Indexes
    Require all granted
</Directory>
# .htaccess(ドキュメントルートに置くと配下すべてに適用)
Options -Indexes

Options で +/- の付いた指定と付かない指定を混在させると、Apache 2.4では構文エラーになります。また .htaccess で Options を使うには、上位設定で AllowOverride Options(または Options=Indexes)が許可されている必要があり、許可がないと500エラーになります。上の例の AllowOverride 行は、.htaccess で使える指示子を限定する一例です。既存の AllowOverride All などをこの行に置き換えると、既存の .htaccess にある許可外の指示子(Options +FollowSymLinks など)で500エラーになるため、既存の AllowOverride は変えずに Options 行だけを修正するのが安全です。

nginx

server {
    # 既定はoffだが、継承元で有効化されていないか確認
    autoindex off;
}

include されている設定ファイルも含めて grep -rn autoindex /etc/nginx/ で確認します。

IIS

<!-- web.config -->
<configuration>
  <system.webServer>
    <directoryBrowse enabled="false" />
  </system.webServer>
</configuration>
appcmd.exe set config "Default Web Site" -section:system.webServer/directoryBrowse /enabled:"False"

Next.js(Vercel)・静的ホスティング

Vercelや主要な静的ホスティングは、既定ではディレクトリ一覧を生成しません。オブジェクトストレージ(Amazon S3、Azure Blob Storage等)を公開している場合は、バケットやコンテナーの一覧取得権限を公開していないか確認します。

CMS

CMSのアップロード先ディレクトリ(WordPressの wp-content/uploads/ など)は一覧表示の対象になりやすい場所です。サーバー設定で無効化したうえで、空の index.html を置く方法は補助策にとどめます(新しいサブディレクトリには効かないため)。

修正後の確認方法

for d in /images/ /files/ /uploads/ /css/ /js/; do
  code=$(curl -s -o /tmp/dl.html -w "%{http_code}" "https://www.example.lg.jp$d")
  if grep -qiE "index of /|directory listing for|\[to parent directory\]" /tmp/dl.html; then
    echo "$d $code 一覧表示あり"
  else
    echo "$d $code"
  fi
done

修正後はセキュリティAIチェッカーで再診断し、この項目が○になることを確認します。

サイトを壊さないための注意点

  • 一覧表示を前提に、ファイル配布ページの代わりにディレクトリURLを案内している場合があります。無効化する前に、該当URLへのリンクや案内文を検索し、必要なら一覧ページを通常のHTMLとして作成してください。
  • .htaccess への Options -Indexes 追加で500エラーになった場合は、AllowOverride で Options が許可されていません。行を削除して元に戻し、サーバー管理者(レンタルサーバーの場合はコントロールパネル)で設定します。
  • 一覧を止めても、ファイル名を推測されれば直接取得されます。公開不要なファイルはWeb公開領域から移動・削除してください。

よくある質問(FAQ)

ディレクトリ一覧(ディレクトリリスティング)とは何ですか?

URLがディレクトリ(末尾が / )を指し、そこにindex.htmlなどの既定ファイルがない場合に、Webサーバーがそのディレクトリ内のファイル名一覧を自動生成して返す機能です。Apacheやnginxでは「Index of /path」という見出しのページになります。

トップページに index.html があれば大丈夫ですか?

大丈夫ではありません。一覧表示はディレクトリごとに判定されるため、/images/、/pdf/、/uploads/、/js/ など index.html を置かない下層ディレクトリが狙われます。

.htaccess に Options -Indexes を書いたら500エラーになりました。

上位設定のAllowOverrideでOptionsの上書きが許可されていません。行を削除して元に戻し、サーバー管理者(レンタルサーバーの場合はコントロールパネル)で設定します。

空の index.html を置けば対策になりますか?

補助策にとどまります。新しく作られたサブディレクトリには効かないため、サーバー設定で一覧表示そのものを無効化したうえで使います。

robots.txt で隠せば問題ありませんか?

robots.txtは検索エンジンへの依頼にすぎず、アクセス制御ではありません。むしろ隠したいディレクトリ名を公開することになります。

ディレクトリ一覧の公開は、セキュリティAIチェッカーでどう判定されますか?

サイト内で見つかったルート以外の下層ディレクトリを最大2件確認し、HTTP 200かつ一覧ページ特有の文言に一致するものが1件でもあれば「× 要改善」、なければ「○ 問題なし」、確認できる下層ディレクトリがなければ「対象外」です。○は確認した範囲で一覧表示がないことを意味します。

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

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

参考資料