「Apacheをデフォルト設定で利用するのは危険と聞いたけど・・・」
「Apacheのセキュリティ対策を実施したい」
「ディレクトリ内一覧を非表示にしたい」
このような場合には、この記事の内容が参考となります。
この記事では、Apacheセキュリティ対策としてディレクトリ内一覧を非表示する方法を解説しています。
本記事の内容
- ディレクトリ内一覧の表示はセキュリティホール(インシデント)になる
- Optionsディレクティブ
- Optionsディレクティブの変更
それでは、上記に沿って解説していきます。
ディレクトリ内一覧の表示はセキュリティホール(インシデント)になる
まず、次の画像をご覧ください。
怖いですね~。
「秘密.jpg」や「secret.txt」が、剥き出しのままです。
なんと、Apacheではデフォルトでこの設定になっています。
こんな脆弱性は、デフォルトで閉じておいて欲しいところです。
そして、こんな脆弱性を生んでいるのがOptionsディレクティブになります。
Optionsディレクティブについて、次で説明します。
Optionsディレクティブ
Apache公式では、次のようにOptionsディレクティブを説明しています。
Optionsディレクティブは、特定のディレクトリに対して どの機能が使用可能かを制御します。
optionには、以下のモノを設定できます。
- All
- ExecCGI
- FollowSymLinks
- Includes
- IncludesNOEXEC
- Indexes
- MultiViews
- SymLinksIfOwnerMatch
- None
ディレクトリ内一覧の表示制御に関係するのは、Indexesです。
Indexesを設定すれば、ディレクトリ内一覧が表示されてしまいます。
こいつを設定しないようにすれば、ディレクトリ内一覧が非表示となります。
では、そのように設定を変更していきます。
次は、Optionsディレクティブの変更を説明します。
Optionsディレクティブの変更
Optionsディレクティブを変更するには、その記述場所を特定する必要があります。
検索で特定する前に、「コンテキスト」について説明しておきます。
Optionsディレクティブは、次の4つがコンテキストに記載されています。
- サーバ設定ファイル
- バーチャルホスト
- ディレクトリ
- .htaccess
これは、設定の適用範囲を意味しています。
.htaccess以外は、Apacheの設定ファイルとなります。
Apacheの設定ファイルについては、次の記事で説明しています。
コンテキストについては、具体的な記述場所を見ればわかりやすいです。
それでは、Apacheのデフォルト設定から確認します。
/etc/apache2/apache2.conf
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
デフォルトでは、この設定が適用されています。
この記述は、コンテキストで言うなら「ディレクトリ」に該当します。
ここでは、「Indexes」が記述されているのを確認できます。
そして、これらの設定は「/var/www/」以下に適用されます。
ただし、それ以下のディレクトリに個別に設定すれば、そちらが優先されます。
設定内容が、上書きされるということです。
したがって、次のような内容を記述することになります。
Optionsは「ディレクトリ」で設定しておけば、問題はないでしょう。
<Directory /var/www/html/> Options FollowSymLinks AllowOverride None Require all granted </Directory>
で、この設定をどこに記述するかということが次のポイントになります。
バーチャルホストのことを考慮した場合、次のファイルが妥当でしょう。
/etc/apache2/sites-enabled/000-default.conf
別に「apache2.conf」に記述しても、動きますけどね。
記述する場所は、以下の箇所にしておきます。
コンテキストが「バーチャルホスト」であるなら、次のように記述することになります。
まあ、普通はしませんけどね。
ファイルの変更は、Apacheの再起動で反映させます。
$ sudo systemctl restart apache2
この状態で再度、丸見えだったディレクトリにブラウザでアクセス。
無事にディレクトリ内の一覧が非表示となりました。
これで、Apacheの脆弱性を一つ潰すことができました。
以上、Optionsディレクティブの変更を説明しました。