CloudFormationを使用してWAF Web ACLを作成する
AWS WAF(Web Application Firewall)はAWSが提供するセキュリティサービスです。
WAFはいくつかのサービスで構成されていますが、今回はWAF入門ということで、CloudFormationを使用してWeb ACLを作成します。
WAFをAPI Gatewayに適用する方法については、以下のページをご確認ください。
WAFをCloudFrontに適用する方法については、以下のページをご確認ください。
WAFをAPI Gatewayに適用する方法については、以下のページをご確認ください。
WAFをAppSyncに適用する方法については、以下のページをご確認ください。
構築する環境
WAF Web ACLを作成します。
今回は入門ということで、デフォルトで用意されているAWSマネージドルールを使用します。
作成したWeb ACLをALBに適用します。
ALBはプライベートサブネット内のEC2インスタンスをアタッチします。
EC2インスタンスは最新版のAmazon Linux 2とします。
EC2インスタンスにApacheをインストールし、Webサーバとして動作させ、自身のインスタンスIDを返すように設定します。
ApacheはS3上に構築されたyumリポジトリからインストールします。
CloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。
https://github.com/awstut-an-r/awstut-fa/tree/main/045
テンプレートファイルのポイント解説
本ページでは、WAFを中心に取り上げます。
プライベートサブネット内のEC2をALBにアタッチする方法は、以下のページをご確認ください。
プライベートサブネット内のEC2でyumを実行する方法については、以下のページをご確認ください。
WAF Web ACL
まずWeb ACL本体を確認します。
Resources:
WebACL:
Type: AWS::WAFv2::WebACL
Properties:
DefaultAction:
Allow: {}
Name: !Ref Prefix
Rules:
- Name: !Sub "${ManagedRuleVendor}-${ManagedRuleName}"
OverrideAction:
None: {}
Priority: 0
Statement:
ManagedRuleGroupStatement:
Name: !Ref ManagedRuleName
VendorName: !Ref ManagedRuleVendor
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: !Sub "${ManagedRuleVendor}-${ManagedRuleName}"
SampledRequestsEnabled: true
Scope: REGIONAL
VisibilityConfig:
CloudWatchMetricsEnabled: true
MetricName: !Ref Prefix
SampledRequestsEnabled: true
Code language: YAML (yaml)
順番に設定を確認します。
DefaultActionプロパティはルールに適合しなかったトラフィックに関する設定です。
「Allow」か、「Block」のどちらかを選ぶことができ、またそれぞれのアクション時の挙動をカスタマイズすることができます。
今回は「Allow」とし、特にカスタマイズを行いません。
Nameプロパティで作成するWeb ACLの名前を設定します。
Rulesプロパティはトラフィックの許可/ブロックを定義するルールに関する項目です。
今回はAWSマネージドルールと呼ばれる最初から用意されているルール(グループ)の中から、「AWS-AWSManagedRulesAmazonIpReputationList」を使用するように設定します。
OverrideActionプロパティは使用するルールのアクションを修正することができる項目です。
今回は修正を行いませんので、Noneプロパティに空のオブジェクトを設定します。
Priorityプロパティはルール同士の優先順位に関する項目です。
0から順番に採番し、小さい数字が設定されたルールから評価される仕組みです。
今回は1つのマネージドルールを使用しますので、「0」を設定します。
Statementプロパティで使用するルールそのものを設定します。
マネージドルールを使用する場合はManagedRuleGroupStatementプロパティを使用します。
このプロパティ内部のNameおよびVendorNameプロパティで、どのマネージドルールを使用するかを指定します。
今回はそれぞれ「AWSManagedRulesAmazonIpReputationList」、「AWS」を設定します。
VisibilityConfigはCloudWatchおよびサンプリングしたトラフィックに関する設定です。
CloudWatchMetricsEnabledプロパティはCloudWatchによるメトリクス収集の要否を設定できます。
SampledRequestsEnabledプロパティでルールにマッチしたトラフィックを収集するかどうかを設定できます。
今回は両方とも「true」に設定して有効化します。
なお本プロパティはルール単位とWeb ACL全体に存在します。今回は両方とも同様の設定とします。
ScopeプロパティはWeb ACLを適用するリソースに関係がある項目です。
Web ACLをCloudFrontに適用する場合は「CLOUDFRONT」、それ以外のリソースの場合は「REGIONAL」となります。
今回はALBですから後者となります。
Web ACLをリソースに関連づける
続いてWeb ACLをAWSリソースに関係付ける方法を確認します。
Resources:
WebACLAssociation:
Type: AWS::WAFv2::WebACLAssociation
Properties:
ResourceArn: !Ref ALBArn
WebACLArn: !GetAtt WebACL.Arn
Code language: YAML (yaml)
AWS::WAFv2::WebACLAssociationリソースを作成することで、Web ACLとリソースを関係付けることができます。
ResourceArnプロパティに対象リソースのARNを設定します。
今回はALBにWeb ACLを適用しますので、ALBのARNを指定します。
WebACLArnプロパティで、適用するWeb ACLを設定します。
先ほど定義したWeb ACLのARNを指定します。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- EC2インスタンスのID:i-0cdb269f94e8255b2
- ALB名:fa-045-ALB
- ALBのURL:http://fa-045-alb-48262996.ap-northeast-1.elb.amazonaws.com/
AWS Management Consoleから、WAFを確認します。
確かにWeb ACLが作成されています。
ルールにAWS-AWSManagedRulesAmazonIpReputationListが含まれており、ルールにマッチしなかったトラフィックへの対応がAllowに設定されています。
このWeb ACLがALBに適用されています。
動作確認
準備が整いましたので、ALBにアクセスします。
正常にアクセスできました。
Web ACLのフィルタを通過できたということになります。
コンソール画面からCloudWatchメトリクスと、サンプリングされたトラフィック情報を確認します。
先ほどのアクセスを受けて、収集されたデータが表示されています。
CloudWatchメトリクスの図を見ると、今回用意したルールではブロックされませんでしたので、「ALL AllowRequests」や「fa-045 AllowedRequest」の値がカウントされています。
サンプリングされたリクエストを見ると、先ほどのアクセスに関する情報(送信元アドレスや許可/ブロック、通信日時)が収集されていることがわかります。
まとめ
WAF入門ということで、CloudFormationを使用してWeb ACLを作成し、実際の挙動を確認しました。