Apacheのセキュリティ機能の構成要素と設定
Apacheにおけるアクセス制限には、Apacheの設定ファイル(httpd.conf)を使う方法と、制限を設けたいディレクトリに「.htaccess」という名称のファイルを作成する方法の2種類がある。.htaccessには、そのディレクトリ以下のコンテンツ(サブディレクトリも含む)に対する制限を記述する。
/home |
├ |
ichishi/ |
| |
├ |
public_html |
| |
| |
├ |
.htaccess |
|
| |
├ |
images/ |
|
|
| |
└ |
icon.jpg |
|
|
├ |
cgi-bin/ |
|
|
| |
└ |
access.cgi |
|
|
├ |
members/ |
|
|
| |
├ |
|
.htaccess |
|
|
| |
├ |
…… |
|
図 .htaccessの影響範囲。.htaccessが置かれたディレクトリとそのサブディレクトリにも及ぶが、さらに.htaccessがある場合はそちらが使われる |
重要なことは、アクセス制限を行う設定ファイルはhttpd.confではなく.htaccessを使うこと。.htaccessの名前が限定されていること(httpd.confのAccessFileNameディレクティブで規定)。.htaccessによる制限の影響範囲は、そのディレクトリのコンテンツ(ファイル)だけでなくサブディレクトリに含まれるファイルにまで及ぶこと。サブディレクトリにさらに.htaccessが置かれている場合は、その内容が優先することである(図)。
httpd.confにも記述できるのに、なぜディレクトリに.htaccessを用意するのだろうか? それは、.htaccessを使えばApacheの管理者以外に対してもコンテンツへのアクセス制限の管理を任せられるからである(編注)。
編注:もう1つ重要な点は、httpd.confに記述した場合は設定を変更するたびにApacheの再起動が必要だが、.htaccessであればApacheの再起動なしにアクセス制限の設定変更が可能なことにある。 |
通常、Apacheの設定ファイルは限られた管理者によってのみ編集される。それに対し、Webサーバでコンテンツを公開するのは管理者だけとは限らない。特に、ユーザーディレクトリを利用して、多くのユーザーにコンテンツ配信を許可する場合、いちいちユーザーの要求に合わせてアクセス制限を設けてはいられない。各ユーザーに.htaccessファイルを作成・管理させれば、管理者は面倒から解放される。
■.htaccessファイルで制限可能な範囲の設定
各ディレクトリに.htaccessファイルを配置したアクセス制限を設ける場合、以下の点についても理解しておきたい。
AllowOverrideディレクティブは、.htaccessファイルによるアクセス制限やディレクトリ固有の設定について、指定可能な範囲を制限する。このディレクティブには、5種類のオプションと、その5種類すべてを指定する「All」、すべてを不可にする「None」オプションがある。5つのオプションすべてを指定するのと、Allオプションを指定するのは同じであり、
と指定すれば、それは「.htaccessファイルで指定できるすべてのアクセス制限を利用する」ということである。
All/None以外には、次のオプションがある。これらを複数指定する場合は、
AllowOverride Options Limit |
のように、空白(半角スペース)で区切って記述する。
- AuthConfig
ユーザー認証に関する指定を可能にする。
- FileInfo
MIME-Typeの指定やエラードキュメントの指定など、ドキュメントタイプに関する指定を可能にする。
- Indexes
ファイル一覧の表示やファイル名が省略された場合にデフォルトで表示されるファイル名など、ディレクトリインデックスに関する指定を可能にする。
- Limit
アクセス制限を行うためのallow、deny、orderの指定を可能にする。
- Options
オプション命令(Optionsディレクティブ)の指定を可能にする。
コラム .htaccessファイルへの読み込み制限の設定 |
不正アクセスを試みようとする者に.htaccessファイルの内容を読み取られるのは望ましくない。しかし、.htaccessファイルはコンテンツと同じディレクトリに配置される。従って、何の防御策も施さなければ、コンテンツ・ファイルと同じように容易に読み取ることができてしまう。そうした事態を防ぐために、Apacheの設定ファイルには以下のように記述されている。
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files> |
これは、.htで始まるファイルについて、読み取りを拒否する設定である。最初から設定ファイルに記述されているはずだが、再度確認しておきたい。もし記述されていなかったり、「#」を先頭に付けてコメントアウトされているようなら修正して有効化すべきだ。 |
■IP認証を定義する3つの要素と記述方法
アクセス制限1つ設定するにも、理解しなければならない事柄は多い。しかし、IP認証に関する制限内容の記述は思いのほか簡単だ。「order」「allow」「deny」の3つさえ理解していれば、どのような制限も表現できる。
orderは、その後に続くallow(許可)とdeny(拒否)の評価順を指定する。例えば、
とすれば、allowを先に、denyを後に評価する。基本的にアクセスを拒否し、allowで明記されているアクセスを許可する。逆に、
とあれば、denyを先に、allowを後に評価する。基本的にアクセスを許可し、denyの記述にマッチしたアクセスを拒否する。
allowとdenyの使い方も難しくはない。
と記述するか、または
と記述する。例えば、atmarkit.co.jpドメインからのアクセスのみを許可するなら、
allow from .atmarkit.co.jp |
とするわけだ。また、すべての対象からアクセスの許可/拒否を行う場合は
または
と記述できる。
上記の内容を総合すると、atmarkit.co.jpドメインからのアクセスのみを許可(それ以外からのアクセスは拒否)する場合、以下の3行で表現できる。
order deny,allow
deny from all
allow from .atmarkit.co.jp |
ここではドメイン名を使った認証を例にしたが、ホスト名やIPアドレスで指定することもできる。その場合は、ドメイン名の部分を置き換えればいい。
もう1つ付け加えるなら、複数のドメイン名やIPアドレスを指定する方法だろう。対象を複数にするには、それに応じて複数の行を記述することになる。例えば、atmarkit.co.jpとtis.co.jpからのアクセス、さらに192.168.1.*(つまりイントラネット)からのアクセスを許可する場合、記述する内容は以下のとおりになる。
order deny,allow
deny from all
allow from .atmarkit.co.jp
allow from .tis.co.jp
allow from 192.168.1. |
■アクセス制限を行う範囲の指定
制限内容の記述は理解できたとしても、問題は、その記述をどこに書けばいいのか、ということである。ファイルとしてはhttpd.confと.htaccessの2種類があることはすでに説明したが、それらのファイルにどう記述すればいいのかを明確にしていない。
まず、httpd.confへの記述について解説しよう。httpd.confは、Apacheで構築されるWebサイト全体の設定をつかさどる。従って、このファイルにアクセス制限を記述するには、その制限対象を明確にしなければならない。
httpd.confでアクセス制限を設定できる対象は、以下の3つである。
1.実ディレクトリ
実ディレクトリに対する設定は、<Directory>〜</Directory>ディレクティブに記述する。このディレクティブは、
<Directory "/usr/local/apache/htdocs"> |
のようにディレクトリ名を指定するが、
という指定は全ディレクトリ共通の設定(デフォルト設定)として用いられる特別な記法だ。
実ディレクトリを指定した制限の設定は.htaccessファイルを用意することに等しく、ディレクトリ単位でのアクセス制限に有効である。
例えば、/usr/local/apache/htdocsというディレクトリ以下に対してアクセス制限を設けるならば、以下のように記述する。
<Directory "/usr/local/apache/htdocs">
order deny,allow
deny from all
allow from .atmarkit.co.jp
</Directory> |
2.仮想ディレクトリ
実ディレクトリに対して設定するのと同様に、仮想ディレクトリに対しても設定を行うことができる。この場合には、<Location>〜</Location>ディレクティブを用いる。仮想ディレクトリの場合は、制限対象を直感的に把握するのが実ディレクトリよりも難しいものの、仮想ディレクトリに対するマッピングの変更に影響を受けない利点がある。
この場合の記述方法は、<Directory>ディレクティブと同様なので、サンプルについては省略する。
3.ファイル
ファイル単位でのアクセス制限も可能で、<Files>〜</Files>ディレクティブを用いる。このディレクティブを普通に指定すると、サイト全体に共通する設定となる。ただし、<Directory>ディレクティブや<Location>ディレクティブの中に記述することで、特定のディレクトリ内のみを対象とすることもできる。
例えば、次のように記述すれば、/usr/local/apache/htdocsというディレクトリ以下の、拡張子が画像形式(gif、jpeg、jpg、png)のファイルのみを対象にすることができる。
<Directory "/usr/local/apache/htdocs">
<Files ~ "\.(gif|jpe?g|png)$">
order deny,allow
deny from all
allow from .atmarkit.co.jp
</Files>
</Directory> |
このように、<Files>ディレクティブにおけるファイルの指定には「正規表現」を用いる。もちろん、特定のファイル名を指定することもできるが、この例のように正規表現を用いる場合の方が多いだろう。
■.htaccessのアクセス制限記述方法
.htaccessに制限を設定する場合、ディレクトリを明確にする必要はない。なぜなら、.htaccessファイルを保存したディレクトリ以下が対象になることは、わざわざ指定しなくても明白だからである。従って、.htaccessファイルにおいては、必要であれば<Files>ディレクティブを用いて対象となるファイルを指定する以外あり得ない。
<Files>ディレクティブでファイル単位の制限を行う必要がなければ、以下のように直接制限内容を記述する。
order deny,allow
deny from all
allow from .atmarkit.co.jp |
|