Web サーバーのアクセス制御
Web サーバーを構築する際に、クライアントのアクセス制御を行うことで不必要なアクセスをなくす。
1. はじめに
Apache の設定ファイルは、httpd.conf、srm.conf、 access.conf と三種類ありますが、Apache 1.3.9 ぐらいからほとんど httpd.conf のみで行います。Apache 2.0 では、srm.conf, access.conf は無くなります。そこで、設定はすべて httpd.conf で行なうものと思って作業してください。また、.htaccess を利用しても設定が行えます。アクセス制御するには、mod_access モジュールが Apache に組み込まれている必要があります(明示的にはずさない限りデフォルトで組み込まれます)。
2. AllowOverride, Optionsといったキーワード
AllowOverride により <Directory>指示子で指定したディレクトリに対して利用できる機能を設定
All |
すべての有効な指示子を許可 |
None |
すべての指示子を無効 |
AuthConfig |
認証ディレクティブの使用を許可 (AuthUserFile, requireなど) |
FileInfo |
ドキュメントタイプをコントロールするディレクティブの使用を許可 (AddType, DefaultTypeなど) |
Indexes |
ディレクトリインデクスをコントロールするディレクティブの使用を許可 (DirectoryIndex, AddIconなど) |
Limit |
ホストへのアクセスをコントロールするディレクティブの使用を許可 (allow, deny, order) |
Options |
特定のディレクトリの設定をコントロールするディレクティブの使用を許可 (Options, XBitHack) |
さらに Options で制御(無効化されたオプションを有効化させる場合は前に「+」をつける。逆に有効なものを無効にするには「-」をつける )
All |
MultiViewsを除いた全てのものが利用可能 |
ExecCGI |
CGIの実行を許可 |
FollowSymLinks |
ディレクトリにシンボリックリンクの利用を許可 |
Includes |
サーバサイドインクルード(SSI)機能を許可 |
IncludesNOEXEC |
#includeと#exec以外のSSIを許可 |
Indexes |
DirectoryIndex(例:index.html)がない場合、そのディレクトリ以下のファイルを表示することを許可 |
SymLinksIfOwnerMatch |
実体とリンクの所有者が同じ場合、シンボリックリンクの利用を許可 |
MultiViews |
ドキュメントのロケールに基づいたコンテンツを配信 |
3. Order, Allow, Deny といったキーワード
アクセス制御は、<Directory>
, <Files>
, <Location>
などといったディレクティブに内で allow
, deny
を使用して制御します。まず、order
により許可/拒否の順番を決定し、allow
, deny
により許可/拒否するクライアントを決定します。
3.1. order
Order deny,allow |
deny, allow の順番で評価されます。allow で指定したもの以外は拒否するような設定をしたいときにこのオーダーを利用します。
Order deny,allow Deny from all Allow from .jpこの場合、.jp ドメインのクライアントからのみアクセスを許可します。 |
Order allow,deny |
allow, deny の順番で評価されます。deny で指定したもの以外は許可するような設定をしたいときにこのオーダーを利用します。
Order allow,deny Allow from all Deny from 192.168.0.0/24この場合、192.168.0.0/24の IP Address となるクライアントからのアクセスを禁止します。 |
Order Mutual-failure |
allow に存在し、deny に存在しないクライアントがアクセスを許可されます。このオーダーの使用は推奨されていないので詳細は記述しません。 |
3.2. allow / deny
allow では、アクセスを許可するクライアントを指定します。 deny では、アクセスを拒否するクライアントを指定します。
allow/deny from all |
すべてのクライアントにマッチします。 |
allow/deny from domain.name |
指定したドメインを持つクライアントにマッチします。 |
allow/deny from 192.168.0.1 |
指定した IP Address を持つクライアントにマッチします。
192.168.0.1 ------ IP Address 192.168.0 -------- 192.168.0 ネットワーク内 192.168.0.0/24 --- 192.168.0.0/24 ネットワーク内 192.168.0.0/255.255.255.0 |
allow/deny from env=env-variable |
環境変数 env-variable が設定されているとマッチします。 |
4. 実用的(?)なアクセス制御
4.1. 特定のクライアントからのアクセスを拒否する
通常どのクライアントからもアクセス可能だがアクセスして欲しくないクライアントを拒否したい場合、Order allow,deny
というオーダーを利用します。
Order allow,deny Allow from all Deny from foobar.co.jp # ドメイン foobar.co.jp を持つクライアントを拒否 Deny from 192.168.0.0/24 # ネットワーク 192.168.0.0/24 からのクライアントを拒否
また、これだけでなく、どのクライアントからアクセスして欲しくないファイルがある場合にも利用できます。
<Files ~ "^\.ht"> Order allow,deny Deny from all # .ht から始まるファイル名を持つファイルのアクセスを拒否 </Files>
4.2. 特定のクライアントからのアクセスのみ許可する
指定したクライアントのみアクセス可能にする場合、Order deny,allow
というオーダーを利用します。
Order deny,allow Deny from all Allow from foobar.co.jp # ドメイン foobar.co.jp を持つクライアントを許可 Allow from 192.168.0.0/24 # ネットワーク 192.168.0.0/24 からのクライアントを許可
携帯電話向けのサイトを構築したので PC やワークステーションからアクセスして欲しくない場合、以下のように携帯電話が使用する IP Address のみを許可するように設定します。
Order deny,allow Deny from all # i-mode Allow from 210.153.84.0/24 Allow from 210.136.161.0/24 # ボーダフォン Allow from 210.134.83.32/27 Allow from 210.146.7.192/26 Allow from 210.146.60.128/25 Allow from 210.151.9.160/27 Allow from 210.169.193.192/26 Allow from 210.228.189.0/24 Allow from 211.8.49.160/27 Allow from 211.8.159.128/25 Allow from 211.127.183.0/24 # EzWeb Allow from 210.169.40.0/24 Allow from 210.196.3.192/26 Allow from 210.196.5.192/26 Allow from 210.230.128.0/24 Allow from 210.230.141.192/26 Allow from 210.234.105.32/29 Allow from 210.234.108.64/26 Allow from 210.251.1.192/26 Allow from 210.251.2.0/27 Allow from 211.5.2.128/25 Allow from 211.5.7.0/24 Allow from 218.222.1.0/24 Allow from 61.117.0.0/24 Allow from 61.117.1.0/24 Allow from 61.117.2.0/26 Allow from 61.202.3.0/24 Allow from 219.108.158.0/26 Allow from 219.125.148.0/24 Allow from 222.7.56.0/24
4.3. 特定のブラウザからのアクセスのみ許可する
クラックプログラムなどで不正アクセスをされるのを防ぐために、きちんとしたブラウザからのみアクセスを許可するといった設定をします。以下の設定では、Internet Explorer, Netscape, Opera, Safari など主要なブラウザからはアクセスすることが可能になります。おまけで、google からも許可しよう。(しかし、ブラウザーの情報は簡単に偽装できてしまいます)
SetEnvIf User-Agent "Mozilla" AllowedBrowser SetEnvIf User-Agent "GoogleBot" AllowedBrowser <Files *> Order deny,allow Deny from all Allow from env=AllowedBrowser </Files>
SetEnvIf を利用することで、クライアントからのいろいろな情報をもとにアクセス制御を行うことが出来ます。この機能を利用するには、 mod_setenvif モジュールが Apache に組み込まれている必要があります。