今回のゴール
AWS上の環境を精査して、セキュリティ的に良くないところがないか指摘してくれるAWSのサービス『AWS Security Hub』があります。
一度Security Hubを有効化すれば毎日チェックしてくれて「ここがダメ」と指摘してくれるのですが、AWSマネジメントコンソールにログインしてメニューから AWS Security Hub を選択して、AWS Security Hubの画面に遷移して結果を確認することが必要になります。
指摘をSlackで通知してくれるように実装してみるのが今回のゴールになります。
前提
- EventBridge、SNS、Chatbot、Slackを設定しますので、これらの設定ができる権限があるIAMユーザおよびSlackユーザを使えること
- Security Hubの各種セキュリティ基準を有効化して指摘されるようにしてあること ※Security Hubの利用開始、料金についてはAWS Security Hub free trial, usage, and pricingを参照してください。
- どのSlackチャンネルに通知するか決めておくこと。もしくは通知用のSlackチャンネルを作成しておくこと
設定の概要
指摘がSlackに通知されるまでに下記のようにAWSのサービスを通ります。
Security Hubで検出
↓
EventBridgeで検出を取得しフィルタする。フィルタしたのをSNSに流す
↓
SNSでChatbotに渡された内容を流す
↓
Chatbotは設定されたSlackチャンネルに渡された内容をポストする
設定の詳細
SNSの設定
EventBridgeのフィルタルールを作成する際に「どのSNSトピックでSecurity Hubの指摘を通知させるか」を設定するところがありますので、SNSトピックをまず作成します。
AWSマネジメントコンソールにログインして、メニューから「Simple Notification Service」を選択します。
画面左メニューから「トピック」を選択し、トピック一覧から「トピックの作成」を選択します。
詳細欄は下記のように指定します。
- タイプ … スタンダード
- 名前 … 「SecurityHubFindingToSlack」など後から分かる名前をお好みで
- 表示名 … 「SecurityHubFindingToSlack」など後から分かる表示名をお好みで
- 暗号化、アクセスポリシー、配信再試行ポリシー、配信ステータスのログ記録、タグはデフォルトで設定してみます。AWS環境の利用ポリシーにより変更します
Chatbotの設定
Slackに通知するChatbotを作成して、上記で作成したSNSトピックのサブスクリプションに指定します。
AWSマネジメントコンソールのメニューから「AWS Chatbot」を選択します。
チャットクライアントで「Slack」を選択して「クライアントを設定」を選択します。
通知先になるSlackワークスペースにアクセスする権限がリクエストされますので、許可します。 異なるSlackワークスペースが選択されている場合は、画面右上のプロダウンからSlackワークスペースを切り替えます。
許可したらChatbotの設定画面に戻ります。「新しいチャンネルを設定」を選択します
設定名などパラメータを指定します。
設定の詳細
- 設定名 … 「SecurityHubFindingToSlack」など後から分かる名前をお好みで
- ログ記録 … AWS環境の利用ポリシーによりログ記録が必要であれば変更します
Slackチャンネル
- チャンネルID … 画面の案内にあるように通知したいチャネルIDを調べて指定します
プライベートチャンネルの場合はSlackユーザ @aws を招待する必要があります (プライベートチャンネルにSlack組織外のユーザを招待できるかはSlack組織の設定に依ります)
- チャンネルID … 画面の案内にあるように通知したいチャネルIDを調べて指定します
https://docs.aws.amazon.com/chatbot/latest/adminguide/getting-started.html
If you configure a private Slack channel, run the /invite @AWS command in Slack to invite the AWS Chatbot to the chat room.
Slackのプライベートチャンネルを設定している場合は、Slackで/invite @AWSコマンドを実行して、AWS Chatbotをチャットルームに招待します
- アクセス許可
今回は通知のアクセス許可のみを付加したIAMロールを作り利用します
Channelガードレールは、SlackチャンネルにてAWS CLIコマンドが使えるにあたり何の実行を許可するかをポリシーに設定します。
今回は通知のみでSlackチャンネルから何か変更できる権限はもたせないため読み込み用のポリシーを作成して指定します。
今回はIAM policies for AWS ChatbotのThe CloudWatchReadOnlyAccess policyを使用します。
It allows read-only operations for CloudWatch Logs and the Amazon Simple Notification Service service, and can be used in place of the customer managed Notification permissions policy CloudWatch LogsとAmazon Simple Notification Serviceサービスに対する読み取り専用の操作を許可し、お客様が管理するNotification許可ポリシーの代わりに使用できます。
- 通知
上記で作成したSNSトピックを指定します
Chatbotのチャンネル設定後、SNSトピックを参照してみるとChatbotを呼び出すサブスクリプションが設定されています。
Chatbotの設定済みクライアントの画面に移り、Slackに通知されるかテストしてみます。 「テストメッセージを送信」を選択します。
Slackの該当チャンネルに下記のような通知があるか確認します。
EventBridgeの設定
EventBridgeでフィルタルールを作成します。
AWSマネジメントコンソールのメニューから「EventBridge」を選択します。
「ルールを作成」を選択します。
ルールを作成します。
名前と説明
- 名前 … 「SecurityHubFindingToSlack」など後から分かる名前をお好みで
- 説明 … 「SecurityHubFindingToSlack」など後から分かる説明をお好みで
パターンを定義
- 「イベントパターン」を選択します
- 「サービス毎の事前定義パターン」を選択して、サービスプロバイダは「AWS」、サービス名は「Security Hub」、イベントタイプは「Security Hub Finding - Imported」を選択します
- AWSアカウントを特に限定しないので「任意のAWSアカウントID」を選択
- 成功の指摘の通知は不要なので特定のコンプライアンスステータスは「FAILED」「WARNING」「NOT_AVAILABLE」を選択します
- 今回は重大度は「HIGH」「CRITICAL」のみ通知で良いとしましたので、特定の重大度ラベルでそのように選択します。MEDIUMなども通知されたいとなりましたら追加します
※特定のワークフローステータスを選択して「NEW」を指定すると、新規の指摘のみ通知されるようにできます。ただし、この指定をすると、いったんSecurityHubを有効化して何度か指摘されていると新規の指摘が生じない限りSlack通知されなくなります。ちゃんとSlack通知されるかテストしたいので、この定義では指定しないようにしています。Slack通知されることを確認後にパターンを修正します。
ターゲットを選択
上記で作成したSNSトピックを選択して、Chatbotを通じてSlackに通知されるようにします
Slack通知を待つ
Security HubのチェックのタイミングでSlack通知されるはずです。Slack通知を待ちます。
正しく設定されていれば下記のようにSlack通知されます。
EventBridgeのパターンを修正する
上記で定義したパターンだとSecurity Hubのチェックのタイミングで指摘済みも通知されます。 通知内容が大量になることもあるので、新規の指摘のみ通知されるようにパターンを修正します。
上記で設定したEventBridgeのルールを選択して、「編集」を選択します。
イベントパターンの「編集」を選択します。
「Workflow」を追加して新規を示す「NEW」を追加します。
「NEW」のほか、設定できる値については Workflow を参照します。
編集前
{ "source": ["aws.securityhub"], "detail-type": ["Security Hub Findings - Imported"], "detail": { "findings": { "Compliance": { "Status": ["FAILED", "WARNING", "NOT_AVAILABLE"] }, "RecordState": ["ACTIVE"], "Severity": { "Label": ["HIGH", "CRITICAL"] } } } }
編集後
{ "source": ["aws.securityhub"], "detail-type": ["Security Hub Findings - Imported"], "detail": { "findings": { "Compliance": { "Status": ["FAILED", "WARNING", "NOT_AVAILABLE"] }, "RecordState": ["ACTIVE"], "Severity": { "Label": ["HIGH", "CRITICAL"] }, "Workflow": { "Status": ["NEW"] } } } }
編集したら「保存」を選択して、保存して画面下部の「更新」を選択して変更をコミットします。
まとめ
EventBridgeやChatbotが実装される前は、これらをLambdaで検出内容を受け取ってフィルタやSlack通知を実装する必要がありました。
これらがAWSマネジメントコンソールでポチポチするだけで設定できるようになりました。
せっかくSecurity Hubを有効化しても指摘を見なければ有効化してないのと同じことですので、Slack通知などで気づけるようにして活用できればと思います。