概要
やりたいこと
CloudFormation を利用して AWS WAF v2 (new) にAWS Managed Rules on AWS WAF を設定する。
以前、CloudFormation を利用して AWS WAF v1 (classic) にルールを追加した。
Terraform でやりたかったが、Terraform は現在 AWS WAF v2 に未対応。がんばって進行中のようだ。
- New resource r/aws_wafv2_web_acl by pvanbuijtene · Pull Request #12688 · terraform-providers/terraform-provider-aws
- Issues · terraform-providers/terraform-provider-aws
AWS WAF v2
AWS WAF についてはこの資料が詳しい。
AWS WAF v2 と v1 で主な変更点は以下。今回はマネージドルールを利用するためメインとなるのはルール適用数のほう。
- ルール適用数(10個 -> 1500WCU)
- AND/OR/NOT によるルール(Statement)の組み合わせ
v1 では 10 個のルールまでしか適用できなかった。
v2 では個数ではなく重み付けした数値(キャパシティユニット)で制限し、その数は 1500WCU となる。
この値は結構ギリギリで、何も考えないで全ルール適用はできない(後述)。
AWS Managed Rules on AWS WAF
今回は下記で作った環境への防御を考える。
テストのために全てのルールを適用したかったが、合計 capacity が 1975WCU になり、上限の 1500WCU を超えてしまう。
そのため、サービスにあったルールを選別して適用する。
owasp-juice-shop を守ると仮定してルール選定を行う。合計キャパシティは 1475 でギリギリ。
- Linux(EC2), Node.js で動作
- DB は存在する
No | Rule | capacity | 使用 |
---|---|---|---|
1 | Admin protection | 100 | ☓ |
2 | Amazon IP reputation list | 25 | ○ |
3 | Anonymous IP List | 50 | ○ |
4 | Core rule set | 700 | ○ |
5 | Known bad inputs | 200 | ○ |
6 | Linux operating system | 200 | ○ |
7 | PHP application | 100 | ☓ |
8 | POSIX operating system | 100 | ○ |
9 | SQL database | 200 | ○ |
10 | Windows operating system | 200 | ☓ |
11 | WordPress application | 100 | ☓ |
CloudFormation でデプロイ
準備
こちらを参照し、 aws cloudformation コマンドを利用できるようにしておく。
作業ディレクトリと cloudformaion 用のテンプレートファイルを作成。
$ mkdir awswaf_v2 $ cd awswaf_v2 $ touch waf_v2.yaml
スタックを作成。
$ aws cloudformation create-stack --stack-name aws-waf-v2-test --region ap-northeast-1 --template-body file://waf_v2.yaml
AWS WAF v2 用の空の WebACL を作成
AWS::WAFv2::WebACL のサンプルを参考に、空の WebACL を作成。
ALB へアタッチ予定のため、Scope には REGIONAL を指定。
AWSTemplateFormatVersion: 2010-09-09
Description: Create WebACL example
Resources:
ExampleWebACL:
Type: AWS::WAFv2::WebACL
Properties:
Name: ExampleWebACL
Scope: REGIONAL
Description: This is an example WebACL
DefaultAction:
Allow: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: ExampleWebACLMetric
構文チェックして問題ないことを確認。
$ aws cloudformation validate-template --template-body file://waf_v2.yaml { "Parameters": [], "Description": "Create WebACL example" }
反映する。
$ aws cloudformation deploy --stack-name aws-waf-v2-test --template-file waf_v2.yaml Waiting for changeset to be created.. Waiting for stack create/update to complete Successfully created/updated stack - web-acl-test
AWS WAF コンソールより Web ACL が作成されていることを確認。
AWS Managed Rules を追加
7 個分の AWS Managed Rules を追加する。
Priority は適当。
AWSTemplateFormatVersion: 2010-09-09
Description: Create WebACL example
Resources:
ExampleWebACL:
Type: AWS::WAFv2::WebACL
Properties:
Name: ExampleWebACL
Scope: REGIONAL
Description: This is an example WebACL
DefaultAction:
Allow: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: ExampleWebACLMetric
- Name: AWSManagedRulesCommonRuleSet
Priority: 0
OverrideAction:
Count: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesCommonRuleSetMetric
Statement:
ManagedRuleGroupStatement:
VendorName: AWS
Name: AWSManagedRulesCommonRuleSet
ExcludedRules: []
- Name: AWSManagedRulesKnownBadInputsRuleSet
Priority: 1
OverrideAction:
Count: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesKnownBadInputsRuleSetMetric
Statement:
ManagedRuleGroupStatement:
VendorName: AWS
Name: AWSManagedRulesKnownBadInputsRuleSet
ExcludedRules: []
- Name: AWSManagedRulesAmazonIpReputationList
Priority: 2
OverrideAction:
Count: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesAmazonIpReputationListMetric
Statement:
ManagedRuleGroupStatement:
VendorName: AWS
Name: AWSManagedRulesAmazonIpReputationList
ExcludedRules: []
- Name: AWSManagedRulesAnonymousIpList
Priority: 3
OverrideAction:
Count: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesAnonymousIpListMetric
Statement:
ManagedRuleGroupStatement:
VendorName: AWS
Name: AWSManagedRulesAnonymousIpList
ExcludedRules: []
- Name: AWSManagedRulesSQLiRuleSet
Priority: 4
OverrideAction:
Count: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesSQLiRuleSetMetric
Statement:
ManagedRuleGroupStatement:
VendorName: AWS
Name: AWSManagedRulesSQLiRuleSet
ExcludedRules: []
- Name: AWSManagedRulesLinuxRuleSet
Priority: 5
OverrideAction:
Count: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesLinuxRuleSetMetric
Statement:
ManagedRuleGroupStatement:
VendorName: AWS
Name: AWSManagedRulesLinuxRuleSet
ExcludedRules: []
- Name: AWSManagedRulesUnixRuleSet
Priority: 6
OverrideAction:
Count: {}
VisibilityConfig:
SampledRequestsEnabled: true
CloudWatchMetricsEnabled: true
MetricName: AWSManagedRulesUnixRuleSetMetric
Statement:
ManagedRuleGroupStatement:
VendorName: AWS
Name: AWSManagedRulesUnixRuleSet
構文チェックで問題ないことを確認後、デプロイ。
$ aws cloudformation validate-template --template-body file://waf_v2.yaml $ aws cloudformation deploy --stack-name aws-waf-v2-test --template-file waf_v2.yaml
Web ACL に 7個のルールが追加されていることを確認。
ALB にアタッチ
AWS::WAFv2::WebACLAssociation を利用する。
WebACL は同じ CloudFormation で管理しているが、ALB は Terraform で管理しているため ARN をベタ書きしている。。
WebACLAssociation:
Type: AWS::WAFv2::WebACLAssociation
Properties:
ResourceArn: "arn:aws:elasticloadbalancing:ap-northeast-1:657885203613:loadbalancer/app/webserver-alb/3c8d60490de0199e"
WebACLArn: !GetAtt WebACL.Arn
ALB にアタッチされていることを確認。
ALB 側からも確認できる。
作ったリソースが不要な場合は削除しておく。
aws cloudformation delete-stack --stack-name aws-waf-v2-test
コードは github にアップしといた。
参考
AWS WAFを完全に理解する ~WAFの基礎からv2の変更点まで~
AWS Managed Rules for AWS WAF を構成するCloudFormationテンプレートを作ってみた
コメント