UNIX的なアレ:gihyo.jp出張所
第9回 知っておきたいApacheの基礎知識 その5
前回はユーザにコンテンツを返すためのDocumentRootの設定をしてきました。今回はDocumentRootの設定に引き続き,各種ディレクトリやファイルへの設定をする方法を紹介していきたいと思います。
この設定をいれることで,DocumentRoot内で一部のファイルに対してアクセス制限をかけたりすることができるようになります。
よく使われる設定
それでは,まず頻繁に使用される設定を紹介していきたいと思います。
| 項目 | Optionsの設定 |
|---|---|
| 記述 | Options Indexes FollowSymLinks |
| 説明 | Optionsの引数に,使用をしたいOptionをスペース区切りで追記していく。上記はIndexesとFollowSymlinksという機能を使用した場合の設定例。 |
| 項目 | Allow Overrideの設定 |
|---|---|
| 記述 | AllowOverride None |
| 説明 | .htaccessで設定を上書きするかどうかの設定。Noneで上書きができない状態となっている。 |
| 項目 | アクセス制限の設定 |
|---|---|
| 記述 | Order allow,deny Allow from all Deny from example.com |
| 説明 | アクセス制限をかけるための設定。Orderは,Allow/Denyの順番をどちらから先にかけるかを設定することができる。allow,deny はブラックリスト方式,deny,allow はホワイトリスト方式のアクセス制限をかける際に使用をする。Allow from, Deny fromはそれぞれ受け入れるホストと許可をするホストを記述する。 |
その他にも設定可能な項目はたくさんありますが,頻繁に利用されるものをここで記載いたしました。
さまざまなディレクティブ
各ディレクトリやファイルに対して設定を行う方法はapacheでは3種類あります。
それぞれの役割をまとまると下表のとおりになっています。
表 ディレクティブ
| ディレクティブ名 | 説明 |
|---|---|
| Directory ディレクティブ | OSのディレクトリからみた構造にマッチする |
| Files ディレクティブ | ファイル名にマッチする |
| Location ディレクティブ | URLとして送られてきた文字列にマッチする |
それではサンプルのhttpd.confを例にとってひとつずつ説明をしていきましょう。
Directory ディレクティブ
httpd.confのサンプルの,65行目~70行目の部分で使用しています。
<Directory "/usr/local/apache2/htdocs"> # Directoryディレクティブの設定
Options Indexes FollowSymLinks # Indexes,FollowSymLinksの設定
AllowOverride None # .htaccessでの設定の上書きを許可しない
Order allow,deny # allow/denyを適用する順番
Allow from all # すべてのユーザからのアクセスを許可する
</Directory> # Directoryディレクティブの終了
これはOSから見た/usr/local/apache2/htdocs以下のディレクトリに対して,<Directory "/usr/local/apache2/htdocs">から</Directory>までに記載されている設定を適用する,という意味になります。
指定したディレクトリ以下には,すべて適用されるという点には注意してください。
上記の場合ですと,「Allow from all」というようにすべてのユーザからのアクセスを許可しているので,対象のディレクトリ以下はすべて見ることができる設定となっています。
Files ディレクティブ
httpd.confのサンプルの,75行目~78行目の部分で使用しています。
<FilesMatch "^\.ht"> # FilesMatchディレクティブの設定
Order allow,deny # allow/denyを適用する順番
Deny from all # すべてのユーザからのアクセスを拒否する
</FilesMatch> # FilesMatchディレクティブの終了
Filesディレクティブでは,ファイル名を指定します。上記の場合は,正規表現が利用できるFilesMatchを使用していますので,「^.ht」にマッチするファイルへのアクセスが拒否されている設定です。
.htaccessなどのアクセス制限ファイルは,ユーザーからは直接見れる必要はありません。そのため,このような設定が入れることでアクセスの制限をかけるようにしています。
Location ディレクティブ
httpd.confのサンプルの,224行目~228行目の部分で使用しています(サンプルではコメントアウトされています)。
<Location /server-status> # Locationディレクティブの設定
SetHandler server-status # server-statusの設定
Order deny,allow # deny/allowを適用する順番
Deny from all # すべてのユーザからのアクセスを拒否する
</Location> # Locationディレクティブの終了
Locationディレクティブは,ユーザからのリクエストURLに対して設定をかけることができます。たとえば,http://servername/index.htmlというリクエストがきた場合は,「/index.html」がLocationディレクティブにマッチします。
上記の例ですと,http://servername/server-statusというリクエストが来た場合はすべてのリクエストを拒否をするという設定です。
なお,上記の例は少し特殊なパターンです。Apacheは「/server-status」というリクエストを送るとApacheのステータスを返す機能を持っています。server-statusというディレクトリやファイルは存在はしないので,このような場合はLocationディレクティブで制限をかけます。
各種ディレクティブの正規表現
Filesディレクティブでは使用していましたが,Directory,Files,Locationそれぞれ正規表現を使用することができます。正規表現を使用したい場合は,ディレクティブにDirectoryMatch,FilesMatch,LocationMatchを使用をするか,~を記述します。
正規表現を使用できることは非常に便利ですが,多数のアクセスを受けると高負荷になってしまう可能性もあります。適用させる場所には,注意して使用をするようにしましょう。
最後に
今回は,Directory,Files,Locationディレクティブについて説明をしてきました。
DocumentRootに指定した中でアクセス制限をかけたりなど非常に便利な機能ですが,使いすぎるとどんどんと設定が複雑になってしまいます。たとえば,ユーザに見せたくない情報をDocumentRoot内に設置してDenyで防ぐことはお勧めできません。最初からDocumentRoot外におく設計をしておくようにしましょう。そちらのほうが設定もわかりやすくなりますし,思わぬ事故も防ぐことができます。
無駄な設定を増やさずに,シンプルな設定で構築をするように心がけるようにしましょう。

