AWS Security Hubの内容をSlackに通知する (CloudFormation利用)
AWS Security Hubの内容をSlackに通知してみました。CloudFormationでデプロイします。
おすすめの方
- AWS Security Hubを有効にしたあと、どうしたら良いのか知りたい方
- あくまでも参考です
- AWS Security Hubの内容をSlackに通知したい方
通知条件を決める
今回は、下記をすべて満たす条件の内容をSlackに通知します。
- コンプライアンスのステータス: PASSED以外
- ワークフローのステータス: NEW
このあたりは、各自で検討・調整してください。
AWS Security Hubの運用ルールを決める
AWS Security Hubを有効にしただけだと、「ワークフローのステータス:NEW」がたくさんあるため、通知もたくさん来ます。定期的に。
そのため、下記の手順で対応することにしました。
- AWS Security Hubを有効にする
- コンプライアンスのステータスが「PASSED以外」、かつ、ワークフローのステータスが「NEW」の内容をSlackに通知する
- 各重要度の内容がSlackに通知されたことを確認する
- それぞれの内容について、ワークフローのステータスを「NOTIFIED」に変更する
- それぞれの内容について、必要に応じて対応し、ワークフローのスタータスを「RESOLVED(解決済) or SUPPRESSED(対応不要)」のいずれかに変更する
そして、新たな通知がSlackに来たあとは、内容を確認し、必要に応じて対応し、ワークフローのスタータスを「NOTIFIED(通知済) or RESOLVED(解決済) or SUPPRESSED(対応不要)」のいずれかに変更します。
ワークフローのステータスを一括で「NOTIFIED」にする場合は、下記もご覧ください。
AWS Chatbotを準備する
AWS Chatbotにアクセスし、Slackワークスペースにアクセスできるように設定します。
ワークスペースIDはあとで使います。
Slackにチャンネルを作成する
Slackにチャンネルを作成します。今回は、重要度ごとにチャンネルを作ってみました。 このあたりは、各自の運用ルールに従ってください。
おまけとして、チャンネルのトピックに重要度の説明を設定しておきました。
重要度 | 説明 |
---|---|
CRITICAL | この問題は悪化しないようにすぐに修正する必要があります。 |
HIGH | この問題は優先事項として対処する必要があります。 |
MEDIUM | この問題は対処する必要がありますが、緊急ではありません。 |
LOW | この問題は単独で対処する必要はありません。 |
INFORMATIONAL | 問題は見つかりませんでした。 |
AWS Security Hubの内容をSlackに通知する仕組みを作成する
CloudFormationテンプレート
ワークスペースIDやチャンネルIDは、パラメータとしてデプロイ時に外部から設定します。 AWS SystemsManagerのパラメータストアを使ったり、必要に応じて変更してください。
通知条件のカスタマイズは、下記などを参考にしてください。
AWSTemplateFormatVersion: "2010-09-09" Description: Notify SecurityHub to Slack Parameters: SlackWorkspaceId: Type: String SlackCriticalChannelId: Type: String SlackHighChannelId: Type: String SlackMediumChannelId: Type: String SlackLowChannelId: Type: String Resources: NotifySecurityHubCriticalChatbot: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: !Sub notify-security-hub-critical-chatbot IamRoleArn: !GetAtt NotifySecurityHubSlackChatbotIamRole.Arn LoggingLevel: INFO SlackWorkspaceId: !Ref SlackWorkspaceId SlackChannelId: !Ref SlackCriticalChannelId SnsTopicArns: - !Ref NotifySecurityHubCriticalTopic NotifySecurityHubHighChatbot: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: !Sub notify-security-hub-high-chatbot IamRoleArn: !GetAtt NotifySecurityHubSlackChatbotIamRole.Arn LoggingLevel: INFO SlackWorkspaceId: !Ref SlackWorkspaceId SlackChannelId: !Ref SlackHighChannelId SnsTopicArns: - !Ref NotifySecurityHubHighTopic NotifySecurityHubMediumChatbot: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: !Sub notify-security-hub-medium-chatbot IamRoleArn: !GetAtt NotifySecurityHubSlackChatbotIamRole.Arn LoggingLevel: INFO SlackWorkspaceId: !Ref SlackWorkspaceId SlackChannelId: !Ref SlackMediumChannelId SnsTopicArns: - !Ref NotifySecurityHubMediumTopic NotifySecurityHubLowChatbot: Type: AWS::Chatbot::SlackChannelConfiguration Properties: ConfigurationName: !Sub notify-security-hub-low-chatbot IamRoleArn: !GetAtt NotifySecurityHubSlackChatbotIamRole.Arn LoggingLevel: INFO SlackWorkspaceId: !Ref SlackWorkspaceId SlackChannelId: !Ref SlackLowChannelId SnsTopicArns: - !Ref NotifySecurityHubLowTopic NotifySecurityHubSlackChatbotIamRole: Type: AWS::IAM::Role Properties: RoleName: !Sub notify-slack-chatbot-role AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Principal: Service: chatbot.amazonaws.com Action: sts:AssumeRole Policies: - PolicyName: !Sub notify-slack-chatbot-policy PolicyDocument: Version: "2012-10-17" Statement: - Action: - cloudwatch:Describe* - cloudwatch:Get* - cloudwatch:List* Effect: Allow Resource: "*" NotifySecurityHubCriticalEventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.securityhub detail-type: - Security Hub Findings - Imported detail: findings: Compliance: Status: - anything-but: PASSED Severity: Label: - CRITICAL Workflow: Status: - NEW Targets: - Id: NotifySecurityHubCriticalTopic Arn: !Ref NotifySecurityHubCriticalTopic NotifySecurityHubHighEventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.securityhub detail-type: - Security Hub Findings - Imported detail: findings: Compliance: Status: - anything-but: PASSED Severity: Label: - HIGH Workflow: Status: - NEW Targets: - Id: NotifySecurityHubHighTopic Arn: !Ref NotifySecurityHubHighTopic NotifySecurityHubMediumEventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.securityhub detail-type: - Security Hub Findings - Imported detail: findings: Compliance: Status: - anything-but: PASSED Severity: Label: - MEDIUM Workflow: Status: - NEW Targets: - Id: NotifySecurityHubMediumTopic Arn: !Ref NotifySecurityHubMediumTopic NotifySecurityHubLowEventRule: Type: AWS::Events::Rule Properties: EventPattern: source: - aws.securityhub detail-type: - Security Hub Findings - Imported detail: findings: Compliance: Status: - anything-but: PASSED Severity: Label: - LOW Workflow: Status: - NEW Targets: - Id: NotifySecurityHubLowTopic Arn: !Ref NotifySecurityHubLowTopic NotifySecurityHubCriticalTopic: Type: AWS::SNS::Topic NotifySecurityHubHighTopic: Type: AWS::SNS::Topic NotifySecurityHubMediumTopic: Type: AWS::SNS::Topic NotifySecurityHubLowTopic: Type: AWS::SNS::Topic NotifySecurityHubTopicPolicy: Type: AWS::SNS::TopicPolicy Properties: PolicyDocument: Statement: - Effect: Allow Principal: Service: events.amazonaws.com Action: sns:Publish Resource: '*' Topics: - !Ref NotifySecurityHubCriticalTopic - !Ref NotifySecurityHubHighTopic - !Ref NotifySecurityHubMediumTopic - !Ref NotifySecurityHubLowTopic
EventBridgeの設定をカスタマイズしたい場合は、下記の記事などを参考にしてください。WebコンソールでポチポチしたJSONをYAMLに落とし込むと楽になります。
デプロイ
parameter-overrides
は、各自で設定してください。
aws cloudformation deploy \ --template-file notify_security_hub_slack.yaml \ --stack-name notify-security-hub-slack-stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset \ --parameter-overrides \ SlackWorkspaceId=aaa \ SlackCriticalChannelId=bbb \ SlackHighChannelId=ccc \ SlackMediumChannelId=ddd \ SlackLowChannelId=eee
動作確認
しばらく待つと、各チャンネルに通知が来ました。
さいごに
通知設定がゴールではありません。通知されたら、しっかりと確認&対応していきたいですね。