こんにちは、つくぼし(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の全般的なテンプレートについて知りたい方は、以下の記事も併せてご参照ください。
以上、つくぼしでした!