apacheで携帯キャリアからのIPによるアクセス許可設定を楽に、かつ安全に運用する方法

User-Agentではなく、IPアドレスできちんと制限したい場合のお話。もちろんキャリアが公開しているIPアドレスを書いておけばいいのだけど、変更があった場合に漏れなく対応したいっていう。思いつきで書いてみる。

追記

IPアドレスを所持していて、かつそのPTRレコードを自由に設定できる人(ISPとか) の場合は、自分のIPをdocomoドメインとかに登録できるので、詐称されちゃうな。

追記の追記

と思ったけど、apacheのドキュメントを良く見ると、allow にドメインを設定した場合

Apache は HostnameLookups の設定に関わらず、クライアントの IP アドレスに対して DNS の 2 重逆引きを行ないます。 ホスト名からオリジナルの IP アドレスを順引きします。 順引きと逆引きが一致し、ホスト名が該当した場合にのみ、 アクセスが許可されます。

となっているので、PTRレコードに携帯のドメインを記述されても大丈夫だった。

1. IPアドレスを列挙して許可する

キャリアが公開しているWebページからIPアドレスを取得して、

allow from 210.153.84.0/24
allow From 210.136.161.0/24

と書き並べていく。もちろん、手動で確認なんてしてられないので
DSASの中の人のPerl を使ったり、WWW::MobileCarrierJP::* モジュール使って取ってくる。ただし、取ってくるだけでは反映されないので

  1. WebページをチェックしてIP帯域を取得
    1. 変更があればapacheのconfig (allow from )形式にして保存
    2. apache 再起動 (httpd.confから↑のファイルをincludeする設定にしておく)

とかまでスクリプトで自動化しておけば、キャリアの更新に遅れずについていける。と思ったんだけど、自動で再起動かけて起動しなかったら・・・とか、スクリプトをミスってアクセス許可用のconfigが空になったままapache再起動したら・・・とか考えると小心者の僕には出来ませんでした。

2. 逆引きで許可する

お手軽に設定できる。大きな欠点は、アクセスされるごとに逆引きで判定しているるのでwebサーバ、DNSサーバに負荷がかかる。小規模なサイトならこれでもいいかな。

allow from .docomo.ne.jp

負荷以外にも、この設定は他力本願で、

  • DNSサーバに依存している
  • キャリアがIP帯域追加する時に、PTRレコードに逆引き登録されることをアテにしている

こんなことになっています。たぶんこれで大丈夫だけど。

3. IPアドレスと逆引きの組み合わせ

上2つの折衷案。まずキャリアのIP帯域は1番同様に定期的に確認して、configに吐いておく。で、configをincludeしつつ逆引きの許可も最後に書いておく。

include allow_docomo.conf
include allow_ezweb.conf
include allow_softbank.conf
allow from .docomo.ne.jp
allow from .ezweb.ne.jp
allow from .jp-c.ne.jp .jp-d.ne.jp .jp-h.ne.jp .jp-k.ne.jp
allow from .jp-n.ne.jp .jp-q.ne.jp .jp-r.ne.jp .jp-s.ne.jp .jp-t.ne.jp
allow from .vodafone.ne.jp .softbank.ne.jp 

こうしとけば、configに記述しているIP帯域からのアクセスは逆引きなしで許可できて、config以外のIPでも逆引きできれば許可できる。後は何かメンテするタイミングで、includeしているconfigを確認しつつapacheを適当に再起動しとけばいいかも。とか。

補足

softbankは逆引きが盛りだくさんなのでよくわからない。jp-X.ne.jpドメインについては

$ echo jp-{a..z}.ne.jp | xargs -n1 whois

とやってネームサーバがvodafoneになってるのを拾ってきたから大丈夫だと思うけど。