CFNでWAF Web ACL入門 – ALB向け

CloudFormationでWAF Web ACL入門

CloudFormationを使用してWAF Web ACLを作成する

AWS WAF(Web Application Firewall)はAWSが提供するセキュリティサービスです。
WAFはいくつかのサービスで構成されていますが、今回はWAF入門ということで、CloudFormationを使用してWeb ACLを作成します。

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

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

あわせて読みたい
WAF Web ACLをCloudFrontに適用する 【WAF Web ACLをCloudFrontに適用する】 AWS WAFは以下の4種類のリソースに適用することができます。 ALB CloudFront API Gateway AppSync 今回はCloudFrontに適用する...

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

あわせて読みたい
WAF Web ACLをAPI Gatewayに適用する 【WAF Web ACLをAPI Gatewayに適用する】 AWS WAFは以下の4種類のリソースに適用することができます。 ALB CloudFront API Gateway AppSync 今回はAPI Gatewayに適用す...

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

あわせて読みたい
WAF Web ACLをAppSyncに適用する 【WAF Web ACLをAppSyncに適用する】 AWS WAFは以下の4種類のリソースに適用することができます。 ALB CloudFront API Gateway AppSync 今回はAppSyncに適用する方法を...

構築する環境

Diagram of introduction to WAF Web ACL with CloudFormation.

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にアタッチする方法は、以下のページをご確認ください。

あわせて読みたい
プライベートサブネット内のインスタンスをALBにアタッチする 【プライベートサブネット内のインスタンスをALBにアタッチする構成】 プライベートサブネット内に設置されたインスタンスを、ALBにアタッチする方法を確認します。 AWS...

プライベートサブネット内のEC2でyumを実行する方法については、以下のページをご確認ください。

あわせて読みたい
プライベートサブネットのインスタンスでyum/dnfを実行する 【プライベートサブネット内のインスタンスでyum/dnfを実行する構成】 プライベートサブネット内のインスタンスで、yum/dnfを実行する方法を確認します。 今回は以下の2...

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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

あわせて読みたい
CloudFormationのネストされたスタックで環境を構築する 【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を確認します。

WAF Web ACL 1.

確かにWeb ACLが作成されています。

WAF Web ACL 2.

ルールにAWS-AWSManagedRulesAmazonIpReputationListが含まれており、ルールにマッチしなかったトラフィックへの対応がAllowに設定されています。

WAF Web ACL 3.

このWeb ACLがALBに適用されています。

動作確認

準備が整いましたので、ALBにアクセスします。

Result of accessing the ALB through the WAF Web ACL 2.

正常にアクセスできました。
Web ACLのフィルタを通過できたということになります。

コンソール画面からCloudWatchメトリクスと、サンプリングされたトラフィック情報を確認します。

Result of accessing the ALB through the WAF Web ACL 1.

先ほどのアクセスを受けて、収集されたデータが表示されています。
CloudWatchメトリクスの図を見ると、今回用意したルールではブロックされませんでしたので、「ALL AllowRequests」や「fa-045 AllowedRequest」の値がカウントされています。
サンプリングされたリクエストを見ると、先ほどのアクセスに関する情報(送信元アドレスや許可/ブロック、通信日時)が収集されていることがわかります。

まとめ

WAF入門ということで、CloudFormationを使用してWeb ACLを作成し、実際の挙動を確認しました。