ミケネコ研究所 ミケネコ研究所 > htaccess リファレンス > ホスト/IP 制限

ホスト/IP 制限

ホストまたは IP アドレスを用いて、リソースへのアクセスを制限します。


利用例


特定のホストのアクセスを制限する

次の例は、特定のホストからのアクセスを拒否する .htaccess の設定例です。このように書かれた .htaccess を編集し、アクセス制限したいディレクトリに置いてください。そのディレクトリ以下すべてのリソースは、指定されたホストからの要求に対して 403 forbbidden を返してアクセスを拒否します。

# アクセス制限
order allow,deny
allow from all
deny from ppp01.aaa.ne.jp    # ppp01.aaa.ne.jp を拒否
deny from .bbb.co.jp         # ???.bbb.co.jp を拒否
deny from .go.jp             # 当局によるアクセスを拒否
deny from 130.90.            # 130.90.???.??? を拒否

特定のホストのアクセスだけを許可する

次の例は逆に、特定のホストからだけのアクセスを許可し、他の全てを拒否する設定例です。order の順序が逆になっている点に注目してください。

# いくつかのドメインのみ、アクセス許可
order deny,allow
deny from all
allow from .mikeneko-u.ac.jp   # ミケネコ大学からのアクセスを許可する
allow from .mikeneko.ne.jp     # ミケネコNETからのアクセスを許可する
allow from localhost           # 端末に直接繋がったマシンからのアクセスを許可する

次の例は、応用例です。日本人と思われるアドレスのみを許可することで、海外や、匿名プロキシーなどからのアクセスを未然に防ぐ、過激な手段です。日本の発信元なら、何かトラブルが起こっても連絡がつくことが多いのですが、海外や匿名ホストではなかなか連絡できないし、発信元が判明しにくいのを逆にとって、悪用されがちです。この設定は掲示板の運営サイトなどで特に有効です。

# 日本人のみをアクセス許可する、過激な手段
order deny,allow
deny from all
allow from .jp
allow from .bbtec.net  # .jp ではないが、Yahoo BB  は許可しよう
allow from .il24.net   # .jp ではないが、Interlink は許可しよう

次の例は、携帯電話からのアクセスのみを許可する例です。どこの IP アドレス範囲を許可すればいいかは、携帯電話メーカーのサイトで公開されているものをそのまま利用しています(平成15年11月現在)。IPアドレスに続けて「/24」という文字列などがくっついているのはネットマスク表現です。これについてはもう少し先で説明しています。

order deny,allow
deny from all

# iモード端末からのみを許可する
allow from 210.153.84.0/24
allow from 210.136.161.0/24

# ボーダフォン端末からのみを許可する
allow from 211.8.159.128/25 
allow from 210.169.193.192/26 
allow from 211.127.183.0/24 
allow from 210.146.60.128/25 
allow from 210.134.83.32/27 
allow from 211.8.49.160/27 

# 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

次のように書くと、当然のことながら全員拒否となります。

# 全員拒否
order deny,allow
deny from all

サイト運営者すらアクセスできない設定が、いったいなんの役に立つのかとお思いかもしれませんが、CGI プログラムのみが利用するディレクトリなどは、HTTP 経由でアクセスする必要がありません。したがって、全員拒否 htaccess 制限を敷いておくと安全です。

アクセス拒否したい HTTP メソッドを制限する

次の例は、特定のホストからのアクセスを、特定の HTTP メソッドに限って制限する例です。<Limit> ブロックで囲います。

# <Limit> の例
<Limit GET POST>
order allow,deny
allow from all
deny from .aaa.ne.jp
</Limit>

この例では、.aaa.ne.jp からのアクセスのうち、GET と POST メソッドでのアクセスに限って拒否します。しかし困ったことに、HEAD 等のほかのメソッドについては許してしまいます!<Limit> を記述した方が強力なアクセス制限だという誤解を、大勢の人が信じています。

通常利用において <Limit> を記述して何かメリットが得られるということは、ほとんどありません。拒否したいときはすべての HTTP メソッドについて拒否したいと思うでしょう。Apache サーバが <Limit> ブロックをインタープリットする時間も短くなりますので、必要がないのなら <Limit> は書かないほうがよいでしょう

ゆえに、次の例は穴が開いています。

# GET のみの、穴あきアクセス制限
<Limit GET>
order allow,deny
allow from all
deny from .aaa.ne.jp
</Limit>

POST に対してはアクセス制限がかかっていないので、アクセス制限を突破することが可能です。

ホスト制限のパフォーマンス問題

次は、210.160.0.0 の IP アドレスからのアクセスを制限している設定例です。

# IP ベースのアクセス制限
order allow,deny
allow from all
deny from 210.160.0.0

IP アドレスによるホスト制限は、パフォーマンスに影響を与えません。一方、次の例は ???.aaa.ne.jp のホストからのアクセスを制限している設定例です。

# ホストベースのアクセス制限
order allow,deny
allow from all
deny from .aaa.ne.jp

通常このようなホスト制限を行うと、Web サーバのパフォーマンスが体感ベースで落ちてしまいます。なぜホストを制限すると負荷が大きくなるのでしょうか?

Apache の設定では、パフォーマンスを優先させるためにデフォルトで DNS 逆引きを行わない設定になっていますが、ホスト制限を行うことによって、ホスト名 ???.aaa.ne.jp を IP アドレスに変換する DNS 逆引き作業が発生してしまうからです。

しかも、もっとひどいことが起こります。たとえば、このサイトをご覧下さい。当研究所の研究員が作成した個人ページですが、無数の画像が散りばめられております。しかし珍しいことではなく、たいがいの HTML には画像が貼り付けられています。1つの HTML から呼び出される画像が仮に 10 個あるとしましょう。もしこのサイトが、ホスト名ベースのアクセス制限を行っている場合、DNS サーバに対して、なんと実に

HTML + 10 個の画像 = 11 回(*)

もの問い合わせを行っていることになります。これは悪夢です。一般に画像をたくさん使うと重く感じるというのは、画像のダウンロード時間ではなく、実は DNS サーバに接続する回数が原因であった、ということはあり得る話です。

これを改善するよい方法を提案しましょう。画像のアクセスについては、アクセス制限を行わないことにするのです。幸いにも上記のサイトは ./image/ ディレクトリにまとめて画像を置いているので、そのディレクトリに

# すべてのアクセスを許す
order allow,deny
allow from all

と書かれた .htaccess ファイルを置いておきます。すると最も下位のこの .htaccess 設定が優先されますので、./image/ ディレクトリへのアクセス制限は無効になり、誰もがアクセスでき、画像のアクセスについては DNS 逆引きが発生しなくなり、パフォーマンスは改善されます。

パフォーマンスを気にするなら、画像を分けて保管しておくとよいでしょう。ディレクトリ構造を載せておきます。

□ public_html
│ .htaccess ← 通常のアクセス制限が施されている。
└ □ image
    .htaccess ← すべてのアクセスを許すように設定した

(*) : 11 回というのは最悪の例です。HTTP 1.1 に対応したブラウザであれば、keep-alive 機能によって、問い合わせの回数は 1〜3 回ほどに減るでしょう。

ネットマスクでのアクセス制限

行儀の悪い訪問者やロボットがあなたのウェブを巡回し、どうにも我慢ならなくなって、ついにあなたの組織はアクセス制限を敷く決断をしたとします。通常ですとホストベースのアクセス制限を敷けばよいでしょう。

しかし今回の敵は違いました。ホスト名の得られない逆引き不能な IP アドレスでアクセスして来るのです。まずは whois のサービスを使って組織を調べると、次のようなクエリーが得られました。

ブラックミケネコ研究所 (Dark Mikeneko Lab.)
  DARKMIKE [20.30.195.128 <-> 20.30.195.191] 20.30.195.128/26

どうやらブラックミケネコ研究所という団体のようです(**)。相手は、IP アドレスを 20.30.195.128 〜20.30.195.191 まで変化させてアクセスしてくることがわかりました。この IP アドレスの範囲をアクセス制限するのには、どうすればよいでしょうか。

order allow,deny
allow from all
deny from 20.30.195.

上の例は、ひとつの解といえるでしょうか。確かにこれでブラックミケネコ研究所の人間は、アクセスしてこれなくなりますが、同時に無関係の 20.30.195.0 〜 20.30.195.127 という範囲の団体もアクセスできなくなってしまいます。この範囲に大事な取引先が含まれているかもしれません。この設定では不適切です。

もっとも適切な解は、次の設定です。ネットマスクで表現された IP アドレスを使いましょう。

order allow,deny
allow from all
deny from 20.30.195.128/26

20.30.195.128/26 はネットマスクで表現された IP アドレスの範囲をあらわし、20.30.195.128 〜20.30.195.191 の範囲を指しています。これについて少しだけ解説しましょう。

IP アドレスは 20.30.195.128 のような各 8 ビットの数字がピリオドで区切られた表現で記述されています。20.30.195.128 をビットストリングに直すと 00010100 00011110 11000011 10000000 となります。26 ビットマスクで表現された IP アドレスとは、先頭 26 ビットを固定し、残りのビットを自由に変化させて得られる IP アドレスのことを指します。すなわち、

20.30.195.128/26 が表す範囲

20.30.195.128 : 00010100 00011110 11000011 10000000
20.30.195.129 : 00010100 00011110 11000011 10000001
20.30.195.130 : 00010100 00011110 11000011 10000010
20.30.195.131 : 00010100 00011110 11000011 10000011
〜
20.30.195.191 : 00010100 00011110 11000011 10111111

これだけの範囲のアドレスを表すことができます。

また、全く同値のネットマスクの表現として、20.30.195.128/255.255.255.192 という表現方法もあります。255.255.255.192 をビットストリングに直すと 111111111 11111111 11111111 11000000 (1 が 26 個) となり、やはり 26 ビットマスクを表します。.htaccess ではこちらの表現もサポートされています。

** : これは架空の団体です!!


リファレンス


allow

allow from host
# すべてのアクセスを許可
allow from all

# 該当するホストの許可
allow from www.aaa.com

# 後方一致するホストの許可
allow from .aaa.bbb.com

# IP アドレスでの許可
allow from 130.140.0.1

# 前方一致する IP アドレスでの許可
allow from 130.140.0.

# ネットマスクで記述された IP の範囲の許可
allow from 130.130.0.0/255.255.0.0
allow from 130.130.0.0/16

allow from に続けて、許可するホストを指定します。host には次のようなものが選べます。

allow from all
すべてのホストのアクセスを許可します。

allow from ホスト名
指定したホストからのアクセスを許可します。ホスト名は後方一致です。

allow from IPアドレス
指定した IP アドレスからのアクセスを許可します。IP アドレスは前方一致です。

allow from ネットアドレス/ネットマスク
ネットマスクを用いた指定を行います。130.130.0.0/255.255.0.0 や、130.130.0.0/16 は、130.130.0.0 〜 130.130.255.255 の範囲を指定されたことになります。

deny

deny from host
# すべてのアクセスを拒否
deny from all

# 該当するホストを拒否
deny from www.aaa.com

# 後方一致するホストを拒否
deny from .aaa.bbb.com

# 該当する IP アドレスを拒否
deny from 130.140.0.1

# 前方一致する IP アドレスを拒否
deny from 130.140.0.

# ネットマスクで記述された IP の範囲を拒否
deny from 130.130.0.0/255.255.0.0
deny from 130.130.0.0/16

deny from に続けて、拒否したい host を記述します。

HostNameLookups

HostNameLookups [ on | off | double ]
HostNameLookups on

on にすると、すべてのアクセスにおいて DNS ルックアップ (*)を行い、パフォーマンスが低下します。サーバ負荷を考え、Apache 1.3 以降ではデフォルトで off となっています。double は DNS の 二重リバースルックアップ(**)を行います。

アクセス制限を施している場合で、ホスト名による比較が必要になった場合は、HostNameLookups の設定に関わらず、double の設定が用いられます。

* 【DNS ルックアップ】: DNS の逆引きのこと。DNS (ドメインネームサーバー) に IP アドレスを問い合わせて、クライアントのホスト名を得ます。DNS ルックアップには、体感できる程度の時間を消費します。

** 【DNS 二重リバースルックアップ】 : 一度逆引きをしてから、順引きをすること。非常に時間を消費します。

<Limit>

<Limit method method...>
...
</Limit>
# GET と POST メソッドのみ、アクセス制限を敷く
<Limit GET POST>
order allow,deny
allow from all
deny from .aaa.ne.jp
</Limit>

HTTP メソッドによるアクセス制限を、<Limit> 〜 </Limit> で囲まれたブロックに適用します。<Limit> はアクセスを制限したい HTTP メソッドを限定するものですから、単にアクセス制限を施したいだけならば <Limit> は不要です。

method には制限をかけたいメソッドを記述します。メソッドの種類は GET、POST、HEAD、PUT、DELETE、CONNECT、OPTIONS です。method に記述されなかったメソッドについては、アクセスが制限されません。

order

order ordering
order deny,allow
order allow,deny
order mutual-failure

allowdeny の優先順位を決めます。ordering の内容は、つぎのどれかです。

deny,allow
denyallow よりも優先されます。
allow,deny
allowdeny よりも優先されます。
mutual-failure
allow にはあるけど、deny には無いホストのアクセスを許可します。

ミケネコの htaccess リファレンス http://mikeneko.creator.club.ne.jp/~lab/web/htaccess/