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のパラメータストアを使ったり、必要に応じて変更してください。
通知条件のカスタマイズは、下記などを参考にしてください。
notify_security_hub_slack.yaml
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
動作確認
しばらく待つと、各チャンネルに通知が来ました。
さいごに
通知設定がゴールではありません。通知されたら、しっかりと確認&対応していきたいですね。