Shinobilayer: SoftLayerにおけるCDN拡張機能 - Country Filtering（国別フィルタリング）

#1. はじめに
SoftLayerにおけるCDNの拡張機能を紹介する記事です。
下記リンクを参照して、CDNのベンダーポータルに事前にログインできるようにしておいて下さい。
http://qiita.com/testnin2/items/ae2b2034334732c806e7

SoftLayerのCDNではEdgeCastを利用していますが、EdgeCastにおけるコンテンツを保護するための主な機能としては、

* Country Filtering 
* HTTP Rules Engine
* HTTP Secure (HTTPS)
* Token Authorization（トークン認証）

の4つが考えられます[（参考：コンテンツを保護する。）](https://my.edgecast.com/uploads/ubers/1/docs/ja-JP/webhelp/w/CDNHelpCenter/default.htm#HTTP_and_HTTPS_Data_Delivery/Securing_Your_Content_-_HTTP.htm%3FTocPath%3DHTTP%252FHTTPS%25E3%2581%25AB%25E3%2582%2588%25E3%2581%25A3%25E3%2581%25A6%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E3%2582%2592%25E9%2585%258D%25E4%25BF%25A1%25E3%2581%2599%25E3%2582%258B%2520%7C%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2586%25E3%2583%25B3%25E3%2583%2584%25E3%2582%2592%25E4%25BF%259D%25E8%25AD%25B7%25E3%2581%2599%25E3%2582%258B%7C_____0)

今回は、まずはこのCountry Filteringを紹介します。
![EdgeCast16b.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/987a47cd-4def-717d-23e6-6dc98f1b3686.jpeg)



#2. Country Filtering（国別フィルタリング）とは
Country filteringとは、「ある国からのみアクセスを許可する」とか「ある国からはアクセスを許可しない」といった設定が可能な機能です。
主な注意点としては、

1. 追加Add-onを購入しなくても利用可能です。
2. Country Filteringはどのように国を定義しているのかが曖昧です。どのIPがどの国に属すのかという明確な識別方法がある訳ではありません。そのため、想定外のIPアドレスからのアクセスが許可されたり禁止される可能性があります。そもそもインターネットという経路保障もなく実際の利用者もはっきりしない世界で、100%アクセス元の国情報を識別するのは無理だと思いますが。。。-> **2016/03/06追記。Ticketで確認してみたところ、EdgeCastは[MaxMind](https://www.maxmind.com/ja/geoip-demo)を使っているそうです。**
3. 設定に最大1時間かかるようです。[参考：国別フィルタリング設定 (ジオブロッキング)](https://my.edgecast.com/uploads/ubers/1/docs/ja-JP/webhelp/w/CDNHelpCenter/default.htm#HTTP_and_HTTPS_Data_Delivery/Country_Filtering.htm%3FTocPath%3DHTTP%252FHTTPS%25E3%2581%25AB%25E3%2582%2588%25E3%2581%25A3%25E3%2581%25A6%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E3%2582%2592%25E9%2585%258D%25E4%25BF%25A1%25E3%2581%2599%25E3%2582%258B%2520%7C%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2586%25E3%2583%25B3%25E3%2583%2584%25E3%2582%2592%25E4%25BF%259D%25E8%25AD%25B7%25E3%2581%2599%25E3%2582%258B%7C%25E5%259B%25BD%25E5%2588%25A5%25E3%2583%2595%25E3%2582%25A3%25E3%2583%25AB%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0%25E8%25A8%25AD%25E5%25AE%259A%2520%28%25E3%2582%25B8%25E3%2582%25AA%25E3%2583%2596%25E3%2583%25AD%25E3%2583%2583%25E3%2582%25AD%25E3%2583%25B3%25E3%2582%25B0%29%7C_____0)
4. 国別フィルタリング設定とトークン認証設定は、同じフォルダーには適用できないようです。ただし、階層が違うとOKみたいです。[参考：国別フィルタリング設定とトークン認証を併用してコンテンツを保護する](https://my.edgecast.com/uploads/ubers/1/docs/ja-JP/webhelp/w/CDNHelpCenter/default.htm#HTTP_and_HTTPS_Data_Delivery/TBA_Country_Filtering.htm%3FTocPath%3DHTTP%252FHTTPS%25E3%2581%25AB%25E3%2582%2588%25E3%2581%25A3%25E3%2581%25A6%25E3%2583%2587%25E3%2583%25BC%25E3%2582%25BF%25E3%2582%2592%25E9%2585%258D%25E4%25BF%25A1%25E3%2581%2599%25E3%2582%258B%2520%7C%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2586%25E3%2583%25B3%25E3%2583%2584%25E3%2582%2592%25E4%25BF%259D%25E8%25AD%25B7%25E3%2581%2599%25E3%2582%258B%7C%25E5%259B%25BD%25E5%2588%25A5%25E3%2583%2595%25E3%2582%25A3%25E3%2583%25AB%25E3%2582%25BF%25E3%2583%25AA%25E3%2583%25B3%25E3%2582%25B0%25E8%25A8%25AD%25E5%25AE%259A%2520%28%25E3%2582%25B8%25E3%2582%25AA%25E3%2583%2596%25E3%2583%25AD%25E3%2583%2583%25E3%2582%25AD%25E3%2583%25B3%25E3%2582%25B0%29%7C_____2)

#3. Country Filteringの設定方法

1. HTTP Large -> Country Filtering<br>
![EdgeCast10.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/bd44d920-c2f2-3dc4-8e30-af1815603458.jpeg)
2. 「Add Country Filter」を選択。ちなみに画面中のCDN Help Center（Administering Country Filtering Configurations)をクリックすることでマニュアルを確認することができます。）<br>
![EdgeCast11.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/f7294737-7139-2385-0e81-d44a2948e034.jpeg)
3. アクセス対象のPATHを指定し、Block（不許可）とAllow（許可）を選択。（ちなみにこのPATHは再帰的に適用されるみたいなので、/としておけば、/hogeも/hoge/mogeもルール対象になるようだ）<br>
![EdgeCast12.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/e6dded40-76ce-78d3-cea3-8e93e8c1822f.jpeg)
4. Country Codeを選択。今回は日本からのみアクセスを許可したいので、JPのみを選択。こうすることで、再帰的にルートディレクトリ配下も日本からのみのアクセスになる。<br>
![EdgeCast13.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/9e82944a-c3fe-a331-49b6-ad3c9a9f54f8.jpeg)

最終状態はこちら。
![EdgeCast14.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/dc2cf1be-f513-5347-bc64-c23effe90e0c.jpeg)

#4. 動作実験

東京データセンター上の仮想サーバーと、シンガポールデータセンター上の仮想サーバーからのアクセスを確認してみました。ルート直下のファイルだけでなく、再帰的に階層下のファイルもフィルタリング対象になっていることが分かります。

```text:東京データセンターの仮想サーバーからアクセス
# # curl -I http://xxx.xxxx.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: text/html; charset=UTF-8
Date: Fri, 04 Mar 2016 05:59:39 GMT
Etag: "112188-f-510c58e169680"
Last-Modified: Sun, 08 Mar 2015 11:52:42 GMT
Server: ECAcc (hnd/0527)
X-Cache: HIT
Content-Length: 15

# curl -I http://xx.xxxx.com/images/ninja.png
HTTP/1.1 200 OK
Accept-Ranges: bytes
Content-Type: image/png
Date: Fri, 04 Mar 2016 07:25:32 GMT
Etag: "11214d-52cb-50f5a3ee19e00"
Last-Modified: Wed, 18 Feb 2015 10:26:00 GMT
Server: ECAcc (hnd/05FA)
X-Cache: HIT
Content-Length: 21195
```

```text:シンガポールデータセンターの仮想サーバーからアクセス
# curl -I http://xxx.xxxx.com
HTTP/1.1 403 Forbidden
Content-Type: text/html
Date: Fri, 04 Mar 2016 06:00:26 GMT
Server: ECAcc (sin/BF60)
Content-Length: 345

# curl -I http://xxx.xxxx.com/images/ninja.png
HTTP/1.1 403 Forbidden
Content-Type: text/html
Date: Fri, 04 Mar 2016 06:02:09 GMT
Server: ECAcc (sin/BF87)
Content-Length: 345

```

FirefoxからみたHTTPリクエストの結果
![EdgeCast18.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/1a980b09-77d9-b2bc-bda4-fde5f080caea.jpeg)


#5. さらにセキュリティーを強化するために（Origin Server側のセキュリティ強化）
ベンダーポータルから、「HTTP Large -> Customer Origin」を選択し、「The following CDN IPs can access your origin」のセクションをみると、各拠点のEdge ServerがどのIPアドレスからOrigin Serverにアクセスしに来ているかがわかります（言語設定を日本語にすると、「以下のCDN IPがオリジンからアクセス可能です」と書かれていますが、翻訳が間違っていますね。正確には「以下のCDN IPからオリジンにアクセスされます」です。）。確かにOrigin Serverのアクセスログを見たらこの範囲を使われていました。
![EdgeCast15_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/998d1293-221b-8fd0-71a6-8eef9f30093f.jpeg)


例えば、日本からしかアクセスさせるつもりがないのであれば、ここに記載されているIPアドレス範囲からのみOrigin Serverにアクセスできるようにアクセス制御をすれば、Origin Serverが直接攻撃されるリスクを減らすことが可能になります。日本国内のEdge ServerからしかアクセスできないようにOrigin Server側でFirewall設定をしておけば、Country Filteringを構成しておかなくても国外からのアクセスを防御できるように見えますが、予期しないアクセスはなるべく前段でブロックする方が望ましいでしょう。

#2016/03/04補足
もし日本からしかアクセスされないのであれば、**（日本のユーザーからは通常日本のEdge Serverを利用するハズだから）Edge ServerとしてTokyo, Tokyo(NRT2), OsakaからしかアクセスできないようにOrigin ServerでFirewall設定すれば良いように思いますが、必ずしも日本のEdge Serverが使われる保証はありません。**インターネットはエンドユーザーが経路制御できないので、プロバイダーの構成によっては日本のエンドユーザーからのアクセスが日本のEdge Serverに引き込まれずに、海外のEdge Serverに向かってしまうこともあるようです。確実性を求めるなら、Edge ServerのIPアドレスレンジは全部登録した方が良いのかもしれません。エンドユーザーがどのEdge Serverにアクセスするかは、端末から`tracert wpc.xxxxxx.edgecastcdn.net`でも切り分け可能です。

以下は、Country Filteringで日本からのみアクセス許可を設定した際の、私の実験結果です。（Origin ServerはSingaporeに作りました）

- 私の自宅からのアクセス: アクセス可能
- SoftLayerのTokyo DC上の仮想サーバーからのアクセス: アクセス可能
- SoftLayerのSingapore DC上の仮想サーバーからのアクセス: アクセス不可（403 Forbidden）
- Sydney在住の人からのアクセス： アクセス不可（403 Forbidden）
- 会社からのアクセス: アクセス可能 （ただし、Sydney経由になっていたので、Origin ServerはSydneyのEdge Serverからアクセスできる必要がある。Edge Serverからのアクセスがブロックされていると、504 - Gateway Timeoutになってしまう）<br>
![EdgeCast17.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/a4778881-8ded-bb7a-17af-f188fa34cbe8.jpeg)