はじめに
Amazon Web Services(AWS)が提供する、Amazon CloudFront
や Amazon S3
と呼ばれるサービスを組み合わせることで、 HTMLやJavaScript、画像、ビデオなどで構成される静的Webサイトの配信基盤 を安価に構築することができます。本記事では、リソースのセットアップを自動で行うことのできる、AWS CloudFormation
を用いることで、これらの配信基盤を ミスなく迅速に構築 する手順をご説明します。なお、今回使用する CloudFormation テンプレートは、以下の GitHub リポジトリで公開しています。
TL;DR
以下の CloudFormation
テンプレートを実行することで、 静的Webサイトのホスティング基盤 を 迅速かつお手軽に実現 します。下にあるボタンをクリックすると、自身のAWSアカウント(Asia Pacific Tokyo - ap-northeast-1)で、この CloudFormation
テンプレートを実行することが可能となります。
作成されるAWSリソース全体のアーキテクチャ図は、前回の記事をご覧ください。このうち本記事では、以下のリソースに焦点を当ててご説明します。
Amazon CloudFront への AWS WAF のアタッチ
AWS WAFは、Webの脆弱性からWebアプリケーションを保護する Web Application Firewall で、 SQLインジェクションやクロスサイトスクリプティングなどの 一般的な攻撃パターンをブロック します。静的Webサイトのホスティング機能の一部を担う CloudFrontに AWS WAFをアタッチすることで、CloudFrontへの リクエストのモニタリング 、およびコンテンツへの アクセスのコントロール を可能とします。
AWS WAF
以下のテンプレートを用いて、AWS WAFを設定します。なお、 CloudFrontにアタッチするWAFは、北部バージニアリージョン(us-east-1)でデプロイ しなければいけません。
Resources:
WebACL:
Type: AWS::WAFv2::WebACL
Properties:
DefaultAction:
Allow: {}
Description: !Sub ACL for ${LogicalNamePrefix}
Name: !Ref LogicalNamePrefix
Rules:
- Name: AWSManagedRulesCommonRuleSet
OverrideAction:
Count: {}
Priority: 1
Statement:
ManagedRuleGroupStatement:
Name: AWSManagedRulesCommonRuleSet
VendorName: AWS
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesCommonRuleSet
SampledRequestsEnabled: false
- Name: AWSManagedRulesAdminProtectionRuleSet
OverrideAction:
Count: {}
Priority: 2
Statement:
ManagedRuleGroupStatement:
Name: AWSManagedRulesAdminProtectionRuleSet
VendorName: AWS
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesAdminProtectionRuleSet
SampledRequestsEnabled: false
- Name: AWSManagedRulesKnownBadInputsRuleSet
OverrideAction:
Count: {}
Priority: 3
Statement:
ManagedRuleGroupStatement:
Name: AWSManagedRulesKnownBadInputsRuleSet
VendorName: AWS
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesKnownBadInputsRuleSet
SampledRequestsEnabled: false
- Name: AWSManagedRulesAmazonIpReputationList
OverrideAction:
Count: {}
Priority: 4
Statement:
ManagedRuleGroupStatement:
Name: AWSManagedRulesAmazonIpReputationList
VendorName: AWS
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesAmazonIpReputationList
SampledRequestsEnabled: false
Scope: CLOUDFRONT
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: !Ref LogicalNamePrefix
SampledRequestsEnabled: false
WebACLAssociation:
Type: AWS::WAFv2::WebACLAssociation
Properties:
ResourceArn: !Ref TargetResourceArn
WebACLArn: !GetAtt WebACL.Arn
本テンプレートでは、 Default Action を Allow
に設定しており、 Ruleに一致しないリクエストは全て許可 します。また、WAFv2から導入された以下の マネージドルールを有効化 して、これらの ルールに一致するリクエストをカウント します。なお、 CloudWatchへメトリクスを送信 しますが、リクエストのサンプルの保存は行いません。CloudFrontにアタッチするWAFの Scope
は CLOUDFRONT を指定します。
優先順位 | ルール名 | 内容 |
---|---|---|
1 | AWSManagedRulesCommonRuleSet | 一般的に適用可能なルール |
2 | AWSManagedRulesAdminProtectionRuleSet | 公開されている管理ページへの外部アクセスをブロックするためのルール |
3 | AWSManagedRulesKnownBadInputsRuleSet | 無効であることがわかっており脆弱性の悪用または発見に関連するリクエストパターンをブロックするルール |
4 | AWSManagedRulesAmazonIpReputationList | Amazon 内部脅威インテリジェンスに基づくルール |
Amazon CloudFront
先ほど作成した AWS WAF
を Amazon CloudFront
にアタッチします。前回のテンプレートに以下の記述を追加します。
Resources:
CloudFront:
Type: 'AWS::CloudFront::Distribution'
Properties:
DistributionConfig:
WebACLId: !GetAtt WebACL.Arn
以上で、 マネージドルールを有効化したAWS WAFを作成して、CloudFrontにアタッチ することができました。これにより、CloudFront へのリクエストは、 AWS WAF で検査されたのちに CloudFront ディストリビューションで処理 されます。
関連リンク
- ワンクリックで配信基盤を構築 - CloudFormation を用いて簡単Webサイトホスティング
- CloudFrontにWAFをアタッチ - CloudFormation を用いて簡単Webサイトホスティング
- 特定のURLを定期的にモニタリングする - CloudFormation を用いて簡単Webサイトホスティング
- CloudFrontのリアルタイムログをKibanaで可視化する - CloudFormation を用いて簡単Webサイトホスティング