[AWS]営業資料を全支店で共有するためにS3とCloudFrontをIPアドレス制限で活用する方法

Amazon Web Services

会社の資料としては、営業用・システム用など部署によってエクセル・ワード・パワーポイント・PDF・画像・動画などなど様々な種類の資料が溢れいています。
システム系の資料であれば外部から閲覧する必要もないので全社的なファイルサーバに入れておけば各支店のシステム担当者が同じ資料を閲覧することができます。

営業用の資料となると、事務処理に関するものはファイルサーバで管理は十分ですが、商品の変更や新発売、キャンペーンなどによってカタログの入替が必要だったり、iPadを活用していればプレゼンテーション用の動画の差し替えが必要だったりと煩雑になってきます。

しかも各支店の全営業員へとなると配布するのも大変になります。
そこで最近は営業社員向けにポータルサイトを作成して資料を管理する方法も増えてきていますが、ファイルサーバの中のファイルとポータルサイト側に載せたファイルが混在しちゃいませんか?

「新しい資料ができたから営業へ配布しないと」

「ポータルサイトの新着を更新して」

あっ、ファイルサーバにファイルアップするの忘れてた・・・

ポータルサイトはあくまでも営業社員のみの資料を掲載する目的ですので、会社としての資料はファイルサーバ側で管理できることが望ましいのに対して、『早く配布しないといけない』という意識の方が強くなるのでプライオリティーの高いはずのファイル管理が疎かになってしまいます。

そこで、ファイル管理にもファイル配信にも使える方法を考えてみました。

まずは、AWSのS3を利用してファイルを管理します。
ファイルサーバを自社内で持つとなると、サーバ構築はもちろんバックアップや回線、残容量の管理の問題もあります。
数年間経ってファイルサーバの中を見てみると【作ってから再利用していない】ってファイル多くないですか?振り返れば必要ないけど、それでも取っておきたいファイルなんです。
容量の問題があるから○年間使用がなければ強制的に消すってされても困るんです。ってありませんか?
カメラの性能が上がった分だけファイルの容量も大きくなってきています。ピントがずれた使えない写真でも・・・

だからこそAWSのS3をファイルサーバとして活用するメリットが高くなってきています。
そこでS3を活用し、社内ネットワークからはファイルサーバ、社外のタブレットから(VPN経由)はコンテンツ配信として利用することでファイルの管理の一元化、システム負担を減らしたいと考えました。
ファイルの中には機密情報もあるのでもちろんIP制限は必須です。

S3だけだと動画の配信が厳しい場合もあり、CloudFrontも利用したいと考えていますのでこちらは後述します。

S3にIP制限を設定する

1.バケットを作成します

2.S3が公開設定になっていないか確認します

【Static website hosting】が無効になっていることを必ず確認しておいてください。
S3はHTTPサーバとしても機能します。有効になっていると全世界に向けてファイルを配信してしまうことになるので気をつけましょう。

3.テスト用のファイルをS3のバケットへ設置します

適当にテキスト文字を打ち込んだファイルをアップロードします。

4.アップロードしたファイルのプロパティでファイルへのリンク先を確認
まだこの時点ではアクセスが出来ないようになっていますが、S3にあるファイルを直接閲覧できるリンクが発行されています。

5.リンク先にアクセスしてアクセスできないことを確認する
この時点でファイルの中身が見えるとバケットが全公開になっていということになります。ファイルサーバとしては致命的な設定ミスが生じています。

6.アクセス権限のバケットポリシーを設定する
許可したIPアドレスでしかバケットに接続できないように設定します。
設定するには記述を書かないといけないのですが、AWSではその記述を生成してくれる画面があります。
AWS Policy Generator
http://awspolicygen.s3.amazonaws.com/policygen.html

必要な項目を埋めていきます

Select Type of Policy:S3 Bucket Policy
Effect:Allow
principal:*
AWS Service:Amazon S3
Actions:All Actions(‘*’)
ARN:arn:aws:s3:::バケット名/*

Add Condition(Option)をクリックして
Condition:IpAddress
Key:SourceIp
Value:許可したいIPアドレス

ボタンになった【Add Condition】をクリックして設定を保存させて【Add Statement】をクリック

生成されるコードは

こんな感じ

このコードをアクセス権限のバケットポリシーに保存します。

さあ、これで先ほどのテキストファイルにアクセスして見てください。
正常にアクセスできれば成功です。

成功したら先ほどのバケットポリシーのIPアドレスを書き換えてみてください。
書き換えてアクセス拒否になれば指定されたIPアドレス以外ではアクセスできないことがきちんと確認できました。

各支店のIPアドレスを設定に追加していけば各拠点からしかアクセスできないS3バケット(ファイルサーバ)の出来上がりです。
新しいファイルが出来上がり、配布が必要になった場合にはファイルのリンクをポータルへ貼り付けてしまえばユーザーはクリックしてダウンロードが可能ですので、勝手にファイルを書き換えられることもなければファイルサーバとポータルサイト側でファイルの整合性がとれなくなることもなくなります。

S3から動画の配信をさせることも可能ですが、動画ファイルだとどうしてもファイル容量が大きくなってしまいます。動画ファイルだけでなくパワーポイントやPDFファイルなどでも容量が大きなファイルだと客先でプレゼンしようと思ってダウンロードしたくてもS3のリージョンは東京ですので遠方地だと回線の問題もありダウンロードに時間が掛かってしまいます。

そこで、ファイル容量が大きなファイル(ファイル自体の更新が頻繁に実施されないファイル)はCloudFrontを使ってCDN配信(Content Delivery Network:コンテンツ・デリバリ・ネットワーク)させる方がメリットがあります。

但し、CloudFrontを使用するとそれこそ世界中にファイルのキャッシュが広がってしまうので、こちらもIPアドレスで制限を設けてしまいましょう。

CloudFrontでIP制限をする

1.まずはCloudFrontのディストリビューションを作成します。

ここでは作り方は割愛します。

2.ディストリビューションを作ったらプロパティを見てみましょう

【AWS WAF Web ACL】の項目に何も設定されていませんね。
AWSから提供されているWAFの機能を使ってIP制限を実施します。

3.WAFの設定画面に移動する
セキュリティ、アイデンティティ、コンプライアンスの項目にある【WAF & Shield】の項目になります。

ここでWAF用の【Web ACL(ウェブアクセスコントロールリスト)】を作成しますが、CloudFrontを使うときに気をつけなければいけないのが【Filter】の項目です。
CloudFrontはリージョン設定はありませんので【Global】に切り替える必要があります。

リージョンを切り替えたら次に進んで項目を埋めていきます。
このときに、先ほどCloudFrontに作成したディストリビューションを設定します。(後でも設定・変更は可能です。)

次へ進むと、何を基準としてコントロールするかの項目が出てきます。
ここではIPを指定したいので【IP match conditions】の【Create condition】選択します。

許可したいIPアドレスを登録していきます。

登録を完了させると【IP match conditions】の部分に設定した名称が表示されているのが確認できます。

次へ進むと
先ほど作成したWeb ACL(allow_ip_list)を適応させるルールを作ることになります。

ルールの名称を決めて
下部の【Add conditions】へうつります。

先ほど作成したWeb ACL(allow_ip_list)のIPアドレスを許可したいので下記のように設定します。

・does
 下記の設定を元に制御する

・originate from an IP address in
 IPアドレスに対して

・allow_ip_list
 指定するIPアドレスの入ったWeb ACL

ルールを新規登録したら前の画面に戻るので、そのルールに対して許可するのか拒否するのかの挙動を決めます。

【If a request matches all of the conditions in a rule, take the corresponding action】の項目は、『ルールに適応した場合はどうしますか?』という内容なので、【Allow】を選択します。
※ここは複数のルールを適用することもできます。

【If a request doesn’t match any rules, take the default action】は『ルールに適応しなかったらどうするの?』という内容なので【Block all requests that don’t match any rules】を選択します。

ルール適用の最後の確認画面にたどり着きました。
【AWS resources using this web ACL】の部分に、IPアドレスでアクセス制限をしたいCloudFrontのディストリビューションがきちんと設定できているか確認します。

Web ACLsが増えているか最初の画面で確認します。

最後にCloudFrontの画面に戻り、WAF設定を適用したいディストリビューションのプロパティを確認してみてください

【AWS WAF Web ACL】の項目に作成したACLの名前が入っていますね。

これで設定は完了です。
CloudFrontのディストリビューションに割り当てられたドメインを元にS3に設置したファイルへアクセスすれば許可したIPアドレスからのみ閲覧が可能となります。
しかし、気をつけないといけないのがCloudFrontがキャッシュを広げるまで時間が掛かります。
ファイル自体がまだキャッシュされていないときはS3に該当するファイルを取得しにいく仕組みなので、今度はS3側でCloudFrontの許可をしていないことになりアクセスが拒否されます。

キャッシュが広がるのを待っていると至急の資料の配布が遅くなってしまうので、S3のバケットへCloudFrontからのアクセスを許可する設定を追加します。
CloudFrontの設定からワンクリックでバケットポリシーを追加できるので難しくありません。

CloudFrontの該当ディストリビューションのOriginの編集モードへ入ります。
【Grant Read Permissions on Bucket】の項目の『Yes, Update Bucket Policy』を選択して編集を完了させればバケットポリシーにCloudFrontからのアクセス許可権限が追加されます。

バケットポリシーを見てみると下記のように追加されているのが分かります。

これで正常にアクセスできるのが確認できます。
WAFで制御できているか確認するには、Web ACLに設定したIPアドレスを架空のIPアドレスに変更してみてください。

下記のような画面がでれば許可されたIPアドレスではないのでWAFでブロックされたことが分かります。

社内用のサービスとしてクラウドを利用する場合はなんといっても大切な情報がインターネット上に流出しないかという懸念が一番大きいかと思います。
もちろん設定次第では思わぬ落とし穴がありますが、細かな設定ができるAWSはかなり便利な使い方ができます。

全部ダメ! or 細かく設定したらいいよ

と、うまく設定できていないときは迷宮入りクラスですが、逆に言えば『ちょっとしたミスでも大きな事故が起こりにくい』と言えます。(大きな事故とは情報流出のことで社内的には大惨事になってしまいますが・・・)