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 に組み込まれている必要があります。