CDNETWORKS CDNでhtaccessを使ってIPアドレスによるアクセス制限をしてみた件


はじめに

CDNETWORKSにてCDNを利用しているWEBアプリにて、特定のIPからしかアクセス出来ないようにするために、htaccessにて制限をかけようとしてたのだけど、ハマったので忘備録。

通常のhtaccess制限だと以下のようになるのだがー

htaccess
order deny,allow
deny from all
allow from 123.xx.xxx.xxx

この場合、制御は、拒否→許可、の順番で、まず全て拒否して、123.xx.xxx.xxxからのアクセスのみ許可されるという流れ。
しかし、これでは上手くいかなかった。

CDN利用上の根本問題

CDNのエッジサーバを経由してサーバ側にアクセスをすると、もちろんの事ながら自身のサーバから見ると、実際にアプリに到達するIPアドレスが、アクセス元のIPアドレスから全部CDNを経由したものに変わってしまう。
しかもそのIPは都度、変わってしまうという。。。

X-Forwarded-Forの活用

これだとIPアドレスによる制限がかけられないのだけど、それを解決する方法としてはX-FORWARDED-FORヘッダを活用しようと思い立つ。

X-Forwarded-For (XFF) とは、HTTPヘッダフィールドの一つ。HTTPプロキシサーバまたは負荷分散装置(ロードバランサ)を経由してウェブサーバに接続するクライアントの送信元IPアドレスを特定する際のデファクトスタンダードである。このヘッダはSquidキャッシング・プロキシサーバの開発者により初めて導入された。のちに、IETFのネットワーク作業部会 (Network Working Group) が同種のHTTPヘッダForwardedを RFC 7239 で提唱している。

それを利用する事で、アクセス元のIPアドレスをロードバランサやプロキシを挟んだとしてもそのままアプリに通知する事が出来るようになるらしい。

CDN側の設定

まずはCDNETWORKSのCDNカスコンにログインして実クライアントIPをX-Forwarded-Forに挿入するように設定変更。

htaccessの配置

実際のコードは以下。
allowipは変数名なのでなんでもよい。
こうやって記述することで、CDN経由上でも指定のIPアドレスのみ許可してやることが出来た。

htaccess
SetEnvIf X-Forwarded-For 123.456.789.001 allowip1
SetEnvIf X-Forwarded-For 123.456.789.002 allowip2

order deny,allow
deny  from all
allow from env=allowip1
allow from env=allowip2

指定のIPアドレスのみ拒否する場合も書き方は同じ。まあ拒否設定はCDN側のHotlink Protection機能でも挙動可能だけど。というかCDN上にキャッシュしてあるコンテンツへのアクセス禁止はCDN側にやらせないと実現できないのでそちらを活用すべし。

htaccess
SetEnvIf X-Forwarded-For 123.xx.xxx.xxx denyip

order allow,deny
allow from all
deny from env=denyip

でもって出来た.htaccessファイルを制限掛けたいフォルダ直下に配置してやると完成!
IPアドレスの範囲指定をした場合には、CIDR形式でのレンジ表記で書いてやると実現可能なり。