[AWS CLI] テンプレートを利用してWAFのACLを作成する

# テンプレートを用いたAccess Controll Listの作成
AWS WAFの英語版ドキュメントに公開されているURLを指定してCloudFormationのstackを作成すると、WAFにACLのサンプルを作成できる。
[Tutorial: Quickly Setting Up AWS WAF Protection Against Common Attacks](http://docs.aws.amazon.com/waf/latest/developerguide/tutorials-common-attacks.html)

> On the Select Template page, choose Specify an Amazon S3 template URL. For the template URL, enter https://s3.amazonaws.com/cloudformation-examples/community/common-attacks.json

作成されるRuleとConditionは以下の通り。

### ACL: CommonAttackProtection

  - CommonAttackProtectionSqliRule
    - URI contains SQL injection threat after decoding as URL. 
    - Query string contains SQL injection threat after decoding as URL. 
    - Query string contains SQL injection threat after decoding as HTML tags. 
    - Body contains SQL injection threat after decoding as URL.
    - Body contains SQL injection threat after decoding as HTML tags.

  - CommonAttackProtectionManualIPBlockRule
    - There are no IP addresses in this IP match condition.

  - CommonAttackProtectionXssRule
    - Body contains a cross-site scripting threat after decoding as URL.
    - Query string contains a cross-site scripting threat after decoding as URL.
    - Body contains a cross-site scripting threat after decoding as HTML tags.
    - Query string contains a cross-site scripting threat after decoding as HTML tags.
    - URI contains a cross-site scripting threat after decoding as URL.

  - CommonAttackProtectionLargeBodyMatchRule
    - The length of the Body is greater than 8192.

削除する場合は、stackをdeleteすればACL以下のすべてのオブジェクトがまとめて削除される。

## 費用
このACLで発生する費用は **9USD / Month**
(ACL 5USD × 1) + (Rule 1USD × 4) = 9USD
[料金 - AWS WAF | AWS - Amazon Web Services](https://aws.amazon.com/jp/waf/pricing/)

# AWS CLI
ここから先はAWS CLIで登録する手順。

まず、公式ドキュメントにあるStackを作成するためのサンプルポリシーをjsonで保存するか、自作でPolicy Documentを作成する。
[AWS Identity and Access Management によるアクセスの制御](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-iam-template.html)
今回は以下の自作のPolicy Documentを利用する。

```cloudformation_fullaccess_policy.json
{
    "Version":"2016-09-20",
    "Statement":[{
        "Effect":"Allow",
        "Action":[
            "cloudformation:*"
        ],
        "Resource":"*"
    }]
}
```

IAMのポリシーがアタッチされたユーザーでstack作成用のポリシーを作成する。
`create-policy`メソッドで`--policy-document`に先ほどのjsonを指定する。
同時に作成したポリシーのARNを取得しておく。

```bash
$ CF_POLICY_ARN=$( \
$   aws iam create-policy \
$     --policy-name AmazonCloudFormationFullAccess \
$     --policy-document file://cloudformation_fullaccess_policy.json \
$     --query 'Policy.Arn' \
$     --output text \
$ )
$ echo $CF_POLICY_ARN
```

上記のポリシーをユーザーにアタッチする。

```bash
$ aws iam attach-user-policy \
$   --user-name <USER_NAME> \
$   --policy-arn ${CF_POLICY_ARN}
```

続いて、ユーザーにWAFFullAccessポリシーをアタッチする。
あらかじめアタッチしておかないと、stackを作成する際にAccessDeniedExceptionでエラーになるので注意。

```bash
$ aws iam attach-user-policy \
$   --user-name <USER_NAME> \
$   --policy-arn 'arn:aws:iam::aws:policy/AWSWAFFullAccess'
```

stackを作成する。
10分ほど時間がかかるので放置。

```bash
$ aws cloudformation create-stack \
$   --stack-name 'commonattackprotection' \
$   --template-url 'https://s3.amazonaws.com/cloudformation-examples/community/common-attacks.json'
```

以下、作成されたWAFのオブジェクトを確認するコマンドの一覧。

```bash
# 全オブジェクト
$ aws cloudformation list-stack-resources
$ aws cloudformation describe-stack-resources
# ACL
$ aws waf list-web-acls
# Rule
$ aws waf list-rules
# Condition
$ aws waf list-byte-match-sets
$ aws waf list-size-constraint-sets
$ aws waf list-xss-match-sets
$ aws waf list-ip-sets
$ aws waf list-sql-injection-match-sets
```

不要になったらstackをdeleteする。

```bash
$ aws cloudformation delete-stack --stack-name 'commonattackprotection'
```