CloudFormationでAWS WAFのカウントモードとブロックモードを切り替えてみた

2022.09.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、つくぼし(tsukuboshi0755)です!

AWS WAFには、通信の検知だけを行うカウントモードが存在する事はご存知でしょうか?

特に本番環境の場合、新規作成するWebACLは一旦カウントモードで運用し、一定期間の間で検知される通信を確認してからブロックモードに切り替える事で、本来ブロックしてはいけないアクセスがブロックされるリスクを最小限に止める事ができます。

今回はこのカウントモードブロックモードの切り替えを、パラメータ指定で簡単に切り替えられるCloudFormationを作ってみます!

リクエストに対するAWSマネージドルールの挙動

AWS WAFのAWSマネージドルールの場合、カウントモードのオン/オフを設定する事が可能です。 上記の設定を実施した場合の、リクエストに対するAWSマネージドルールの挙動は以下の通りです。

  • カウントモードオン: カウント有効(監視)
  • カウントモードオフ: カウント無効、かつブロック(拒否)

詳細については、以下のブログをご覧ください。

CloudFormationテンプレートの紹介

以下に実行するテンプレートを記載しています。

なお今回は、WebACLのみの作成とし(ログ設定はオフ)、カウントモードオン/オフ切り替え以外の説明は割愛します。
また、使用するマネージドルールは、AWSManagedRulesCommonRuleSetのみとします。

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
# ------------------------------------------------------------#
# Metadata
# ------------------------------------------------------------#
Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: WAF Configuration
        Parameters:
          - Sysname
          - Env
          - Scope
          - CountMode

# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------#
Parameters:
  Sysname:
    Type: String
    Default: cm
    Description: "Fill in the name of the system name."
  Env:
    Type: String
    Default: test
    Description: "Fill in the name of the environment."
  Scope:
    Type: String
    Default: REGIONAL
    AllowedValues:
      - REGIONAL
      - CLOUDFRONT
    Description: "Select REGIONAL(Application Load Balancer, API Gateway, AWS AppSync, Amazon Cognito User Pools) or CLOUDFRONT(Amazon CloudFront) in the scope of waf."
  CountMode:
    Type: String
    Default: false
    AllowedValues:
      - true
      - false
    Description: "Choose whether to set waf in count mode."


# ------------------------------------------------------------#
# Conditions
# ------------------------------------------------------------#
Conditions:
  IsCountMode:
    !Equals
      - !Ref CountMode
      - true

# ------------------------------------------------------------#
# Resources
# ------------------------------------------------------------#
Resources:
  WebAcl:
    Type: AWS::WAFv2::WebACL
    Properties:
      Name: !Sub ${Sysname}-${Env}-web-acl
      Scope: !Ref Scope
      DefaultAction:
        Allow: {}
      VisibilityConfig:
        CloudWatchMetricsEnabled: true
        SampledRequestsEnabled: true
        MetricName: !Sub ${Sysname}-${Env}-web-acl
      Rules:
        - Name: AWSManagedRulesCommonRuleSet
          Priority: 0
          OverrideAction: !If
            - IsCountMode
            - Count: {}
            - None: {}
          VisibilityConfig:
            SampledRequestsEnabled: true
            CloudWatchMetricsEnabled: true
            MetricName: AWSManagedRulesCommonRuleSetMetric
          Statement:
            ManagedRuleGroupStatement:
              VendorName: AWS
              Name: AWSManagedRulesCommonRuleSet
              ExcludedRules: []

テンプレートのハイライト箇所が、カウントモード切り替えに必要な設定となります。

セクションごとに説明します。

Parameters:
# (中略)
  CountMode:
    Type: String
    Default: false
    AllowedValues:
      - true
      - false
    Description: "Choose whether to set waf in count mode."

ParametersセクションでCountModeというパラメータを指定し、CloudFormationデプロイ時にtrue/falseを選択するようにします。

Conditions:
  IsCountMode:
    !Equals
      - !Ref CountMode
      - true

ParametersセクションでIsCountModeというパラメータを指定し、true/falseを返すようにします。

Resources:
  WebAcl:
    Type: AWS::WAFv2::WebACL
    Properties:
# (中略)
      Rules:
        - Name: AWSManagedRulesCommonRuleSet
          Priority: 0
          OverrideAction: 
            !If
            - IsCountMode
            - Count: {}
            - None: {}

ResourcesセクションのOverrideActionにて、IsCountModeがtrueであればCount(カウントモード)、falseであればNone(ブロックモード)でWebACLを設定します。

カウントモードとブロックモードの切り替え方法

WAFをカウントモードにする場合は、CloudFormationデプロイ時にCountModeにtrueを指定します。

対象WebACLのRuleタブで、ActionがOverride rule group action to countとなっていれば、そのマネージドルールはカウントモードとなっています。

逆にWAFをブロックモードにする場合は、CloudFormationデプロイ時にCountModeにfalseを指定します。

対象WebACLのRuleタブで、ActionがUse rule actionsとなっていれば、そのマネージドルールはブロックモードとなっています。

そしてCloudFormationの更新ボタンでCountModeをtrueまたはfalseで指定し直す事で、カウントモードとブロックモードを簡単に切り替える事ができます。

最後に

今回はWAFのカウントモードを簡単に切り替えられるCloudFormationを作ってみました。

なお、CloudFormationにおけるWAFの全般的なテンプレートについて知りたい方は、以下の記事も併せてご参照ください。

以上、つくぼしでした!