Forward Security Hub Findings to Slack featuring Cross-Account Cross-Region

<!-- Forward Security Hub Findings to Slack featuring Cross-Account Cross-Region -->

![computer_keibiin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/27e73535-67c3-026e-08fd-589a6cfad293.png)

AWS Security Hub という便利なサービスがあります
今回はこのサービス自体の解説は省きます。簡単に言えばセキュリティが専門外の人間にもフレンドリーな心強い味方というところでしょうか[※1](#note)。
想定読者の方が [複数アカウント、複数リージョンに同サービスを有効化](https://github.com/awslabs/aws-securityhub-multiaccount-scripts) [※6](#note) できていること、またはかかる前提知識があるものとして、そこから先のことをやります

## 動機

こいつはいちリージョン毎にセッティングしていく必要があります。それがまあ頑張ってできたとしましょう。
[マネジメントコンソール](http://www.youtube.com/watch?v=HsWtPG_rTak&t=15m16s) はたしかによくできています。
しかしだからといってそのままでは、複数アカウント、複数リージョンのマネジメントコンソールを人が温かく毎日毎日一つ一つ開いて見張ってないといけないのか、ということになってきます。 そんなことはやってられません。
折角 Findings が挙がってきていてもどれがどれだか手に負えず、めんどくさくなって結局見なくなったり中途半端になるようでは無意味だし、課金に見合いません。

そこでまず対応を優先すべき深刻度の高い Findings を何らかの方法で一箇所に抽出、集約し、見やすくしたくなるのです。
今日の目標はそれです

## 解決策の概要

具体的には、Slack の特定 Channel に配信させるのがいいのではと思いつきました。都合の良いことにもう中の人が作ってくれてます。[~~これ~~](https://aws.amazon.com/blogs/apn/how-to-enable-custom-actions-in-aws-security-hub/) と [これ](https://aws.amazon.com/blogs/security/enabling-aws-security-hub-integration-with-aws-chatbot/) を入れていくことにしましょう

* *後者だけで OK です [※ 2020/07/03訂正](#note)*
* 但しこれ単体では Cross-Region になりませんので後述します

## Enabling AWS Security Hub integration with AWS Chatbot

https://aws.amazon.com/blogs/security/enabling-aws-security-hub-integration-with-aws-chatbot/

* Configure AWS Chatbot and Security Hub
* Configure a Slack client
    * AWS Chatbot と Slack の関連付け
    * (これだけは初回に要手動設定)
* Tie it all together
    * CloudFormation stack の作成
    * ここまでではまだ **手動で転送はできるが自動化まではされていない**
* Bonus: Send all critical findings to Slack
    * CRITICAL findings を slack に自動転送させる

## CLI で全 region にやる

さて、詳しくは ~~それぞれの~~ *上記の* リンク先の説明に沿ってしっかり進めていただければと思います[※2](#note)。
しかしですね、それをそのまま手でチマチマと全リージョンやっていくのは嫌ですよ。ですのでスクリプトにします

[CLI で一気にやって](https://gist.github.com/o2346/e0fa3eeb8c67ff51660c354ee3cabdba#findings2slacksh) いきます

* 但し複数リージョンに展開しようとした時、 [本家のテンプレート](https://github.com/aws-samples/aws-securityhub-to-slack/blob/master/SecurityHub_to_AWSChatBot.yml) ではうまくいかない場合があります
* そこでこのスクリプトでは次に示す課題に [対応したテンプレート](https://github.com/o2346/aws-securityhub-to-slack/blob/edge/SecurityHub_to_AWSChatBot.yml) を使っています

### 課題: 2つめ以降 の region で [SecurityHub_to_AWSChatBot.yml](https://github.com/aws-samples/aws-securityhub-to-slack/blob/master/SecurityHub_to_AWSChatBot.yml) が失敗する

`SlackChannelConfig` が以前に実施した他リージョンで設定済みのためとおもわれます。このオリジナルテンプレートのままでは進めません(2020/07/04現在)。仕方がないので [このように](https://github.com/aws-samples/aws-securityhub-to-slack/pull/11) します

### 課題: Stack 削除時に AddCustomActionSHResource1	DELETE_FAILED になってしまう

`LambdaCreateCustomAction` のバグとみられる。[修正](https://github.com/aws-samples/aws-securityhub-to-slack/pull/12)しています

## マスターアカウントに展開していく

**[マスターアカウント](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-accounts.html) でこれをやりましょう**

* これは冒頭で述べたとおり既に Security Hub のマスター・メンバー間の関係構築に成功しているマルチアカウント環境での話になります
    * その有効化工程も [ツールが公開](https://github.com/awslabs/aws-securityhub-multiaccount-scripts) されていますが割愛
* [※3](#note)

そしてこのようになります

![findings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486518/3292fc48-96e9-430f-3c97-a12249a93010.png)

* 複数アカウント、 複数 region の CRITICAL な Findings が配信されてきているのがお分かりいただけるでしょうか[※4](#note)
    * `ap-southeast-1`  は Severity(深刻度)を Medium 以上に設定しているので期待通りです
* *クロスアカウント*: 今回紹介した手順はマスターアカウントだけでOK。マスターアカウントで既にメンバーアカウント群の Findings を集約できているから
* *クロスリージョン*: どの region も通知先として指定した Slack channel は同じなので、最終的にはみんなその channel に来るというわけ。

これでセキュリティチームが Security Hub について平時に注目しておけばよいポイントは、たった一箇所で済むことになりました[※5](#note)。
抽出対象の深刻度の種類や下限は状況に応じて適宜調整しましょう
その先もどんどん効率よくしていき、安心安全な aws にしてゆきましょう:smiley:

## note

※1 攻撃を検知したり遮断してくれるのとはまた別です。あくまでも「セキュリティ標準に照らしてAWSの環境に芳しくない状態(Finding)があるからこうしたほうがいいよ」という示唆をしてくれるものです。いくら危ないからといってこのサービス自身が勝手にリソースに変更を加えたりすることは [しません](https://www.youtube.com/watch?v=_dvBgWqZXe0&amp;t=20m42s) 。示唆から先の行動はユーザに委ねられます

※2 指定した Slack channel が private のときは [/invite @aws](https://docs.aws.amazon.com/ja_jp/chatbot/latest/adminguide/getting-started.html#chat-client-setup) してください。これをしないと届きません

※3 ここでいうマスターアカウントは [Organizations のそれ](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_getting-started_concepts.html) ではありません。ご注意ください

※4 深刻なアラートが出てしまってますが検証専用アカウントです

※5 但しこれだけではまたちょっと別の課題が残ります。 グローバルサービスを対象とした同じ内容の Findings が、リージョンの数だけ重複して送られてきてしまう、という点です。たとえば IAM 関係とか Root MFA 有効化しろ、みたいなのがですね。これについては素直にさっさと remediation に沿って解決させるか、重複しないようなんらかの修正を考えたほうがよいでしょう

※ *2020/07/03 訂正* 前者は Lambda function で WebHook を叩く仕様。これはこれで自由度は高いが、よりシンプルに SNS, Chatbot で実現できる方法+αとして後者が紹介されています

※6 *2021/06/15 追記* [aws-securityhub-multiaccount-scripts](https://github.com/awslabs/aws-securityhub-multiaccount-scripts) で提供されていたマスター・メンバー間の関係構築自動化ですが、 [AWS Organizations でも利用できるようになった](https://aws.amazon.com/jp/about-aws/whats-new/2020/11/aws-security-hub-integrates-with-aws-organizations-for-simplified-security-posture-management/?nc1=h_ls) そうです