aws

AWS CloudFront 〜 ALB 〜 Webサーバ間で一連のアクセス制限を行う CFはIP制限 & ALBはCF経由のアクセスのみ許可 & サーバはALB経由のみ許可

以下のようなインフラ構成の各ポイントにおいて、それぞれ表題のアクセス制限をかけてみます。

CloudFront〜ALB〜Webサーバのインフラ構成図

【クライアント〜CloudFront間】

CDNはどこからでも高速にアクセスできるぜ!が売りの一つではありますが、開発環境のみアクセス制限をかけたいことがあると思います。
アクセス制限には、クエリに特定の文字が含まれてることや、リクエスト送信元の国 など様々な方法で縛ることができます。
今回はWAFを使用して社内IPのみ許可します。

【CloudFront〜ALB間】

ALBへ直接アクセスすることを禁止します。
HTTPヘッダにCloudFrontで設定したTokenもどきの文字列があるときのみ許可します。

【ALB〜Webサーバ(EC2)間】

Webサーバへ直接アクセスすることを禁止します。
セキュリティグループでALB経由のアクセスのみ許可します。

スポンサーリンク

構築手順

セキュリティグループ作成

EC2とALBにそれぞれ割り当てるセキュリティグループを作成します。
基本的な手順は、こちらの過去記事 を参考にしてください。

【ALB用】

80番ポートALL解放 で作成します。

AWSマネジメントコンソールのインバウンドルール設定画面


【EC2用】

80番ポートのソースに上記で作成したALB用セキュリティグループ自体を指定します。作成時にカスタムを選択するとセキュリティグループの候補が自動的に表示されます。

AWSマネジメントコンソールのインバウンドルール設定画面

EC2 作成

最終的なアクセス先となるWebサーバを作成します。

基本的な手順は、こちらの過去記事 を参考にしてください。
忘れずにEC2用のセキュリティグループを割り当てください。

ALB 作成

ロードバランサーを作成します。

基本的な手順は、こちらの過去記事 を参考にしてください。
忘れずにALB用のセキュリティグループを割り当てください。

今回はそれに加えてリスナールールを設定します。

左ペイン [ ロードバランサー ] → [ リスナータブ ] → [ ルールの表示/編集 ] をクリックします。

AWSマネジメントコンソールのロードバランサー設定画面


次の画面では画面上部の プラスボタン でルールの追加、えんぴつボタンで既存ルールの編集ができます。
以下のように HTTP ヘッダの X-Test-Tokentest1234 という文字列が設定されているときのみターゲットグループ(作成済みのEC2) に転送するように設定します。

ここで設定した X-Test-Token は後ほどCloudFrontでも使用します。

最後に設定したデフォルトはエラーとして 404 を返すようにします。

AWSマネジメントコンソールのリスナールール設定画面

WAF作成

CloudFrontにIP制限をかけるWAFを作成します。まずIP Setsを作成しそれをACLに割り当てる流れでいきます。

IP sets 作成

まずアクセスを許可するIPリストを定義します。

左ペインの [ IP sets ] をクリックし、プルダウンで [ Global(CloudFront)]を選択、 [ Create IP set ] を押下します。

AWSマネジメントコンソールのWAF設定画面

次の画面で以下のように入力します。 [ IP addresses ] が複数ある場合は以下のように複数行に渡って入力します。

AWSマネジメントコンソールのWAF設定画面

Web ACLs 作成

IP Setsと同様に [ Global(CloudFront)]を選択、 [ Create web ACL ] を押下します。

AWSマネジメントコンソールのWAF ACL設定画面
Describe web ACL and associate it to AWS resources

以下を入力し、Associated AWS resources – optional は特に何も選択せず Next 押下します。

【Web ACL details】

項目
Nametest-acl
CloudWatch metric nametest-acl
Resource typeCloudFront distributions
Region自動的に Global(CloudFront) が選択される
Add rules and rule groups

【Rules】

Add my own rules and rule group を選択

AWSマネジメントコンソールのWAF ACL設定画面

【Rule type】

IP set を選択。

【Rule】

Name に test-rule を入力。

【IP set】

以下を入力し Add rule 押下。

項目
IP set作成した test-ip-set を選択
IP address to use as the
originating address
Source IP address
ActionAllow

【Default web ACL action for requests that don’t match any rules】

[ Default action ] で [ Block ] を選択し、[ Next ]押下。

Set rule priority

test-rule にチェックを選択し、[ Next ] 押下。

Configure metrics

【Amazon CloudWatch metrics】
【Request sampling options】

それぞれ利用するならば適宜チェックを入れ、[ Next ]押下。

CloudFront作成

最後にCloudFrontを作成します。ここで今までに作成したWAF、ALBを割り当てます。

[ Create Distribution ] → [ Web ] → [ GetStarted ] を押下。 
以下を入力します。これ以外は(今回は)すべてデフォルトのままで大丈夫です。

【Origin Settings】

項目備考
Origin Domain Name 作成したALBのドメイン自動で候補が表示されます。
Origin Custom Headers
Header Name
X-Test-TokenALBに設定したものと同一にします。
Origin Custom Headers
Value
test1234ALBに設定したものと同一にします。

【Distribution Settings】

項目備考
AWS WAF Web ACLtest-acl作成したACLです

テスト

これで構築完了したのでCurlコマンドで、それぞれのポイントにアクセスしてみます。

まずEC2への直接アクセスはタイムアウトとなります。

% curl -m 2 -w '%{http_code}\n' http://xxxxxxx.ap-northeast-1.compute.amazonaws.com 
000
curl: (28) Connection timed out after 2000 milliseconds
% 


ALBへのアクセスはヘッダのX-Test-Token がないときや値が間違っている場合、404となります。

% curl -m 2 -w '%{http_code}\n' http://xxxxxxx.ap-northeast-1.elb.amazonaws.com/
Not Found404
% 
% curl -m 2 -w '%{http_code}\n' -H 'X-Test-Token:testoreore' http://xxxxxx.ap-northeast-1.elb.amazonaws.com/
Not Found404
%
% 
### ヘッダを正常に指定すればOK
% curl -m 2 -w '%{http_code}\n' -H 'X-Test-Token:test1234' http://xxxxxx.ap-northeast-1.elb.amazonaws.com/
Hello World.
200
% 


CloudFrontへのアクセスは許可IPではない場合、403でCloudFrontデフォルトのエラー画面が表示されます(変更可)。

% curl -m 2 -w '%{http_code}\n' https://xxxxxx.cloudfront.net/ 

....

Generated by cloudfront (CloudFront)
Request ID: xxxxxxxxxyyyyyyyyyzzzzzzzz==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>403
%
% 
### 許可IPの端末からのリクエストであればOK. 成功レスポンス。
% curl -m 2 -w '%{http_code}\n' https://xxxxxx.cloudfront.net/ 
Hello World.
200
% 

余談

CloudFrontのIPレンジはこちらで確認できる。のでALBのリスナールール(やWAF)を利用すればCloudFront〜ALB間はIP制限はできそう。

だがこのIPレンジが固定とは特に書いてないので変動があった場合、事故る可能性がある。Tokenもどきが無難か。。?

参考

〃 ̄∇)ゞアリガトォーーーーーーーーーーーーーーー♪

AWS WAFV2でIPアドレス制限してみた
CloudFront専用のALBをリクエストルーティングで設定してみた
CloudFront エッジサーバーの場所と IP アドレス範囲
AWS WAF