AWS GuardDuty を AWS CloudFormation で設定したときのメモ

メモなので箇条書き。

- [GuardDuty][official_doc] は AWS の不正検知ツール。
- ["GuardDuty は、サポートされているすべての AWS リージョンで有効にすることを強くお勧めします"](https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_settingup.html#guardduty_enable-gd:~:text=GuardDuty%20%E3%81%AF%E3%80%81%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%20AWS%20%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A7%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E5%BC%B7%E3%81%8F%E3%81%8A%E5%8B%A7%E3%82%81%E3%81%97%E3%81%BE%E3%81%99%E3%80%82)と公式も言っている。
    - 全リージョンの設定はかなり手間なので、次の記事を参考に CloudFormation を使って設定する。
        - [まずこれ](https://dev.classmethod.jp/articles/create-stacksets-iam-role/)
        - 次にこれ: [一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った - Developers.IO](https://dev.classmethod.jp/articles/set-guardduty-all-region/) 
- 記事通りやればかんたんに設定できる。が、通知されてくるメールがJSONのままで扱いづらかったのでちょっと改造する。
    - 「[カスタム応答の作成先 GuardDuty 所見 Amazon CloudWatch Events - AWS GuardDuty](https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_findings_cloudwatch.html)」にある通りの通知ルールにしてみる。
    - Developers.IO が公開してるymlの `ER` をいじれば良さそう。
    - [CloudFormation の AWS::Events::Rule の設定方法](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-events-rule.html)
    - ここの `EventPattern` と `targets` を いじればよさそう。
        - `InputTransformer` の `InputTemplate` でハマった。
        - 文字列で指定するんだけど、この文字列自体がvalidなJSONである必要があるので、 `"` を含んだ文字列にする必要あり。
- 消したい時はどうする？
    - CloudFormation のダッシュボードから該当するStackSetsを選び、「StackSetsからスタックを削除」すれば全部きれいに消してくれる。


```yml
  ER:
    Type: "AWS::Events::Rule"
    Properties:
      Name: AlertGuardDutyFindings
      Description: "GuardDuty が脅威を検知した時に SNS にアラートを通知します。"
      EventPattern: {
                      "source": [
                        "aws.guardduty"
                      ],
                      "detail-type": [
                        "GuardDuty Finding"
                      ],
                      "detail": {
                        "severity": [
                          4,4.0,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,
                          5,5.0,5.1,5.2,5.3,5.4,5.5,5.6,5.7,5.8,5.9,
                          6,6.0,6.1,6.2,6.3,6.4,6.5,6.6,6.7,6.8,6.9,
                          7,7.0,7.1,7.2,7.3,7.4,7.5,7.6,7.7,7.8,7.9,
                          8,8.0,8.1,8.2,8.3,8.4,8.5,8.6,8.7,8.8,8.9
                        ]
                      }
                    }
      Targets:
        - Arn: !Ref SNST
          Id: Id123
          InputTransformer:
            InputPathsMap:
              severity: $.detail.severity
              Finding_ID: $.detail.id
              Finding_Type: $.detail.type
              region: $.region
              Finding_description: $.detail.description
            InputTemplate: '"AWS GuardDutyが<region>リージョンで深刻度<severity>の<Finding_Type>を検
知しました。 "
            "詳細は次の通り: <Finding_description>"
            "GuardDuty console にログインし、不正な利用がないか確認してください。https://console.aws.amazon.com/guardduty/home?region=<region>#/findings?search=id%3D<Finding_ID>"'
```



[official_doc]:https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/what-is-guardduty.html