AWS

WAF Web ACLをCloudFrontに適用する

スポンサーリンク
WAF Web ACLをCloudFrontに適用する AWS
スポンサーリンク
スポンサーリンク

WAF Web ACLをCloudFrontに適用する

AWS WAFは以下の4種類のリソースに適用することができます。

  • ALB
  • CloudFront
  • API Gateway
  • AppSync

今回はCloudFrontに適用する方法を確認します。

なおWAFをALBに適用する方法については、以下のページをご確認ください。

WAFをAPI Gatewayに適用する方法については、以下のページをご確認ください。

WAFをAppSyncに適用する方法については、以下のページをご確認ください。

構築する環境

Amazon.co.jp: AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版 : NRIネットコム株式会社, 佐々木 拓郎, 林 晋一郎, 金澤 圭: 本
Amazon.co.jp: AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版 : NRIネットコム株式会社, 佐々木 拓郎, 林 晋一郎, 金澤 圭: 本
Diagram of applying WAF Web ACL to CloudFront.

WAF Web ACLを作成します。
地理制限を行います。
具体的にはルールグループを自作し、その中に日本(JP)からのアクセスをブロックするルールを設定します。
作成したWeb ACLをCloudFrontに適用します。

CloudFrontディストリビューションを作成します。
オリジンにS3バケットを指定します。
CloudFrontにOAIを作成し、S3バケットポリシーでOAIからのアクセスのみを許可する制限を行います。

Lambda関数を作成します。
この関数をCloudFormationカスタムリソースとして設定します。
この関数の働きですが、スタック生成・削除時に、自動的にバケットにオブジェクト生成・削除を実行するように設定します。
生成するオブジェクトは静的ウェブサイトホスティング用のindex.htmlとします。
関数のランタイムはPython3.8とします。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

awstut-fa/051 at main · awstut-an-r/awstut-fa
Contribute to awstut-an-r/awstut-fa development by creating an account on GitHub.

テンプレートファイルのポイント解説

本ページでは、CloudFrontにWAFを適用する方法を中心に取り上げます。

WAFの基本的な事項については、以下のページをご確認ください。

WAFで地理制限する方法については、以下のページをご確認ください。

CloudFrontのオリジンにS3バケットを指定し、OAIを使用する方法については、以下のページをご確認ください。

CloudFormationのカスタムリソースについては、以下のページをご確認ください。

CloudFrontに適用するWAFを作成するリージョン

CloudFrontにWAFを適用する際に、最初に気をつけるべきポイントはWAFを作成するリージョンです。

For CLOUDFRONT, you must create your WAFv2 resources in the US East (N. Virginia) Region, us-east-1.

AWS::WAFv2::WebACL

上記の通り、CloudFrontにWAFを適用する場合は、リージョンに制限がありますのでご注意ください。

Web ACL

Resources: RuleGroup: Type: AWS::WAFv2::RuleGroup Properties: Capacity: 10 Name: !Sub "${Prefix}-GeoRestrictionRuleGroup" Rules: - Action: Block: {} Name: !Sub "${Prefix}-GeoRestrictionRule" Priority: 0 Statement: GeoMatchStatement: CountryCodes: - JP VisibilityConfig: CloudWatchMetricsEnabled: true MetricName: !Sub "${Prefix}-GeoRestrictionRule" SampledRequestsEnabled: true Scope: CLOUDFRONT VisibilityConfig: CloudWatchMetricsEnabled: true MetricName: !Sub "${Prefix}-GeoRestrictionRuleGroup" SampledRequestsEnabled: true WebACL: Type: AWS::WAFv2::WebACL Properties: DefaultAction: Allow: {} Name: !Sub "${Prefix}-WebACL" Rules: - Name: !Sub "${Prefix}-WebACL-GeoRestriction" OverrideAction: None: {} Priority: 0 Statement: RuleGroupReferenceStatement: Arn: !GetAtt RuleGroup.Arn VisibilityConfig: CloudWatchMetricsEnabled: true MetricName: !Sub "${Prefix}-WebACL-GeoRestriction" SampledRequestsEnabled: true Scope: CLOUDFRONT VisibilityConfig: CloudWatchMetricsEnabled: true MetricName: !Ref Prefix SampledRequestsEnabled: true
Code language: YAML (yaml)

Web ACLとACL用のルールグループを定義し、地理制限を設定します。
ポイントは両リソースのScopeプロパティです。
このプロパティの設定方法については、以下の通りに説明されています。

Specifies whether this is for an Amazon CloudFront distribution or for a regional application. A regional application can be an Application Load Balancer (ALB), an Amazon API Gateway REST API, or an AWS AppSync GraphQL API. Valid Values are CLOUDFRONT and REGIONAL.

AWS::WAFv2::WebACL

今回はCloudFrontにWAFを適用しますので、本プロパティに「CLOUDFRONT」を設定します。

CloudFront

Resources: Distribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: DefaultCacheBehavior: AllowedMethods: - GET - HEAD CachedMethods: - GET - HEAD Compress: true ForwardedValues: Cookies: Forward: none QueryString: false TargetOriginId: !Ref BucketName ViewerProtocolPolicy: allow-all DefaultRootObject: index.html Enabled: true Origins: - DomainName: !Ref BucketRegionalDomainName Id: !Ref BucketName S3OriginConfig: OriginAccessIdentity: !Sub "origin-access-identity/cloudfront/${OAI}" PriceClass: PriceClass_All WebACLId: !Ref WebACLArn
Code language: YAML (yaml)

ポイントはWebACLIdプロパティです。
このプロパティに先述のWAFのARNを指定します。

ALBに対してWAFを適用する際は、AWS::WAFv2::WebACLAssociationリソースを作成し、これに両者のARNを指定する方法で関連付けました。
以下の引用の通り、CloudFrontの場合はこのリソースは使用しませんのでご注意ください。

For Amazon CloudFront, don’t use this resource. Instead, use your CloudFront distribution configuration. To associate a web ACL with a distribution, provide the Amazon Resource Name (ARN) of the AWS::WAFv2::WebACL to your CloudFront distribution configuration.

AWS::WAFv2::WebACLAssociation

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

今回はスタックを作成するリージョンに気をつけてください。
AWS CLIでスタックを作成する場合、以下で示したコマンドの通り、regionオプションでus-east-1リージョンを指定してください。

aws cloudformation create-stack \ --stack-name [stack-name] --template-url https://[bucket-name].s3.[region].amazonaws.com/[folder-name]/fa-051.yaml --capabilities CAPABILITY_IAM --region us-east-1
Code language: Bash (bash)

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • S3バケット:fa-051
  • CloudFrontディストリビューションのドメイン:https://d1pvh6f3ahqkqz.cloudfront.net/
  • WAFの名前:fa-051-WebACL

AWS Management Consoleからもリソースを確認します。
まずCloudFrontです。

WAF Web ACLs are applied to CloudFront.

CloudFrontディストリビューションが作成され、AWS WAFが適用されていることがわかります。

次にWeb ACLを確認します。

WAF for CloudFront is created in the Global region.

Web ACLが「Global(CloudFront)」のリージョンに作成されている点がポイントです。
CloudFormationスタックを作成したus-east-1ではありませんのでご注意ください。

WAF Web ACLs are applied to CloudFront.

Web ACL側からも、このACLがCloudFrontに適用されていることがわかります。

動作確認

準備が整いましたので、日本からCloudFrontにアクセスします。

Access to CloudFront was blocked.

アクセスが拒否されました。
日本からアクセスしたため、CloudFrontに到達する前に、WAF Web ACLによってフィルタリングされたということです。

確認のために、地理制限のアクションを変更します。

WAF action changed from block to count.

ルールのアクションをブロックからカウント、つまりルールは生かしつつ、ルールに該当するトラフィック数を数えるだけに変更しました。

改めてCloudFrontにアクセスします。

CloudFront was accessible.

CloudFrontにアクセスできるようになりました。
ルールのアクションがブロックからカウントだけになり、アクセスが可能になったためです。

まとめ

WAF ACLをCloudFrontに適用する方法を確認しました。

タイトルとURLをコピーしました