こんにちは、SCSKの石原です。
AWS Security Hubネタです。AWS Security Hubのコンソールは非常に見やすいのですが、検証環境など普段からあまり見ない環境ですと通知が欲しくなります。AWS Security HubはAmazon EventBridgeと統合されているため、AWS LambdaやAmazon SNSを通じて通知を発行することが可能です。
通知の仕掛けをAWS CloudFormationでサクッと構築する方法を記述します。
概要
Security Hubの検出結果を重要度に応じてメールに通知する仕組みを実装します。
概要図は以下の通りです。
- Security Hubを利用するため、AWS ConfigやGuardDutyを有効にします
- Security Hubで適用するセキュリティ基準を選択します。今回は2件有効にしています。
- AWS Foundational Security Best Practices
- CIS AWS Foundations Benchmark v1.2.0
- EventBridgeのルールにより、Security Hubの特定のイベントを検知して、SNSにパブリッシュします
- SNSによりemailで通知されます。
前提タスク
メール通知の前提タスクとして、3つのサービスを有効化しておきます。
- AWS Config
- Amazon GuardDuty
- AWS Security Hub
Amazon Configの有効化
Configはリージョンリソースです。
「グローバルリソースを含めるかどうか」については検討項目になるかと思います。基本的には含めたほうがいい認識です。
Amazon GuardDutyの有効化
GuardDutyはリージョンリソースです。リージョンを指定してコンソールから有効化できます。
AWS Security Hubの有効化
Security Hubはリージョンリソースです(※)。リージョンを指定してコンソールから有効化できます。
リージョンリソースですが、検出結果を特定のリージョンに集約することも可能です。
AWS Security Hub が AWS セキュリティ体制の評価と改善の方法を簡素化するために、検出結果のリージョン間の集約のサポートを追加
Cross-Region aggregation – AWS Security Hub (amazon.com)
メール通知実装
メール通知するために、EventBridgeとSNSの設定をCFnテンプレートを活用して実装します。
実装テンプレート
AWSTemplateFormatVersion: "2010-09-09"
Description: "security hub notify template"
Parameters:
NotifyEmailAddress:
Type: String
Default: "your email address"
Severity:
Type: String
Default: "CRITICAL"
AllowedValues:
- "CRITICAL"
- "HIGH"
- "MEDIUM"
- "LOW"
- "INFORMATIONAL"
EventType:
Type: String
Default: "SecurityHubNotify"
Resources:
# =====================================
# SNS
# =====================================
EventTypeNotifyTopic:
Type: AWS::SNS::Topic
Properties:
DisplayName: !Sub "${EventType}-${AWS::AccountId}-${Severity}"
TopicName: !Sub "Topic-${AWS::AccountId}-${EventType}-${Severity}"
EventTypeNotifyTopicPolicy:
Type: AWS::SNS::TopicPolicy
Properties:
PolicyDocument:
Statement:
- Effect: "Allow"
Principal:
Service: "events.amazonaws.com"
Action: "sns:Publish"
Resource: "*"
Topics:
- !Ref EventTypeNotifyTopic
Subscription:
Type: AWS::SNS::Subscription
Properties:
Endpoint: !Ref NotifyEmailAddress
Protocol: email
TopicArn: !Ref EventTypeNotifyTopic
# =====================================
# EventBridge
# =====================================
SecurityHubNotifyEventRule:
Type: AWS::Events::Rule
Properties:
Description: !Sub "Security notice : ${Severity}"
EventPattern:
detail-type:
- "Security Hub Findings - Imported"
source:
- "aws.securityhub"
detail:
findings:
Compliance:
Status:
- "FAILED"
- "WARNING"
RecordState:
- "ACTIVE"
Workflow:
Status:
- "NEW"
Severity:
Label:
- !Sub "${Severity}"
Name: !Sub "${EventType}-${Severity}-Rule"
State: ENABLED
Targets:
- Arn: !Ref EventTypeNotifyTopic
Id: !Sub "${EventType}-${Severity}-SNS-Target"
実装テンプレートパラメータ
テンプレートに与えるパラメータは下記の通りです。
|
NotifyEmailAddress
|
通知先のメールアドレスを指定します。 ※SNSのサブスクリプションに登録されますので、認証用のメールが通知されたら承認してください |
|
Severity
|
通知する重大度を選択します。 |
|
EventType
|
各種リソース名に利用しています。必要に応じて変更可能です。 |
終わりに
メールを見やすくしたい場合は、LambdaをかましてSecurity HubイベントのJsonをパースしてSNSにパブリッシュしましょう。
今回は通知だけですが、自動修復まで含めたソリューションをAWSが提供されています。

大量のアカウントを管理している場合では、検出した後の修復についても検討したいですね。



