概要
やりたいこと
Config Rules アラートを SecurityHub でみたい。
予め、AWS Config と Security Hub は有効化しておく(今回は ap-northeast-1 の単一リージョンでやる)。
- CloudFormation StackSets CLI で AWS Config を有効化する
- CloudFormation StackSets CLI で Security Hub を全リージョンで有効化する
なぜこんなことするのか?
SecurityHub は GuardDuty, Macie, Inspector 、そして「SecurityHub が作成した Config Rules」 のアラートを確認できる。
SecurityHub は以下3つのコンプライアンスを評価するため、これらを評価する Config Rules が既に用意されている。
しかし、SecurityHub が作成しない Config Rules のアラートは見ることができない。
でも見たいやん。
AWS Config Rules の評価結果を SecurityHub で見る方法
先人が CloudFormation を作成してくれていた。
アラート(ログ)の流れは以下(上記ブログでは CloudWatch をを利用しているが、代わりに Amazon EventBridge がで作成される)。
- ConfigRules → Amazon EventBridge(CloudWatch) → Lambda → SecurtiyHub
CloudFormation を実行すると、以下の AWS リソースが作成される。
ただし、 us-east-1 リージョンに。
- Amazon EventBridge : Config RulesのイベントをLambda にルーティング
- Lambda : AWS Config ルールの結果を解析し、Security Hubにインポート
- Lambda 用 IAM ロールと IAM ポリシー : Lambda の実行権限
- Lmabda へのアクセス許可 : CloudWatch イベントから Lambda を使用するためのアクセス許可
Amazon EventBridge
Amazon EventBridge は、ルールに一致したイベントをターゲットにルーティングする。
CloudWatch Events をベースに CloudWatch Events を拡張したサービスとのこと。
イベントを受信すると EventBus と、受信設定を定義する Rule を作成する。
Rule にイベントバスを指定しない場合、default のイベントバスが利用される。
Rule では検知パターン(EventPattern) と中継先(Targets)が定義できる。
- EventPattern : ルーティングするための検知ルールを指定
- Targets : ルールがトリガーされたときに呼び出される AWS リソースを指定
EventPattern における検知ルールの項目には source, detail-type, detail がある。
- source : イベントを発生させたサービス
- detail-type : イベントのタイプ
- detail : イベントの詳細
今回の Config Rules 検知パターン
今回は Config Rules の場合を考える。
detaile-type (event-type)
- Config Configuration Item Change : アカウント内のリソースが変更されたとき
- Config Rules Compliance Change : ルールに対するコンプライアンスチェックが失敗したとき
- Config Rules Re-evaluation Status : 再評価ステータスの通知
- Config Configuration Snapshot Delivery Status : 設定スナップショットの配信ステータスの通知
- Config Configuration History Delivery Status : 設定履歴の配信ステータスの通知
detail (messageType)
- ConfigurationItemChangeNotification : (公式ドキュメント間違ってそう)
- ComplianceChangeNotification : AWS Config が評価するリソースタイプが変更されたとき
- ConfigRulesEvaluationStarted : 指定されたリソースに対して AWS Config がルールの評価を開始したとき
- ConfigurationSnapshotDeliveryCompleted : AWS Config が設定スナップショットを Amazon S3 バケットに正常に配信したとき
- ConfigurationSnapshotDeliveryFailed : AWS Config が設定スナップショットを Amazon S3 バケットに配信できなかったとき
- ConfigurationSnapshotDeliveryStarted : AWS Config が Amazon S3 バケットへの設定スナップショットの配信を開始したとき
- ConfigurationHistoryDeliveryCompleted : AWS Config が設定履歴を Amazon S3 バケットに正常に配信したとき
今回のルールは以下のため、これに合致した Config Rules のみが Security Hub に取り込まれる。
- detail-type : Config Rules Compliance Change
- detail : messageType が ComplianceChangeNotification
ConfigSecHubCWRule:
Type: AWS::Events::Rule
Properties:
Description: This CW rule integrates AWS Config Compliance events with AWS Lambda as a target
Name: 'Config-Sechub-CW-Rule'
EventPattern:
source:
- aws.config
detail-type:
- Config Rules Compliance Change
detail:
messageType:
- ComplianceChangeNotification
State: 'ENABLED'
Targets:
-
Arn:
Fn::GetAtt:
- 'ConfigSecHubFunction'
- 'Arn'
Id: 'TargetFunctionV1'
つまり、Config Rules のチェックが失敗したタイミングで、チェック対象のリソースタイプが変更されたときに検知ルールに引っかかる。
- Config Rules Compliance Change : ルールに対するコンプライアンスチェックが失敗したとき
- ComplianceChangeNotification : AWS Config が評価するリソースタイプが変更されたとき
CloudFormation
Lambda 配置用の S3 バケット作成
Lambda の zip を配置するための S3 バケット作成。
AWSTemplateFormatVersion: 2010-09-09
Description: S3 for lambda zip
Resources:
LambdaZipsBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: configrules-to-securityhub-lambda-test
デプロイ
aws cloudformation deploy \ --stack-name s3-lambda \ --template-file s3_lambda.yaml
Lambda 用 Zip ファイルを配置
こちらの記事曰く、3種類方法があるとのこと。
- カスタムリソースで Zip をコピー
- 直接アップロード
- インラインで書く
今回は直接アップロードして配置した。Lambda の Zip は以下から取得しておく。
Import 用のスタック作成
S3Bucket の指定先を、上記で作成した S3 に変更する。
ConfigSecHubFunction:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: 'configrules-to-securityhub-lambda-test'
S3Key: 'config-cwe-sh.zip'
FunctionName : 'Config-SecHub-Lambda'
Handler: 'lambda_function.lambda_handler'
Role:
Fn::GetAtt:
- LambdaServiceRole
- Arn
Runtime: python3.7
Timeout: 300
全体像。
AWSTemplateFormatVersion: 2010-09-09
Description: This CloudFormation template will automate the importing of aws config findings into aws security hub
Resources:
LambdaServiceRole:
Type: 'AWS::IAM::Role'
Properties:
RoleName: 'config-sechub-lambda-role'
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- 'sts:AssumeRole'
Policies:
- PolicyName: lambda-service-policy
PolicyDocument:
Statement:
- Effect: Allow
Action:
- 'securityhub:BatchImportFindings'
Resource:
- '*'
- Effect: Allow
Action:
- 'logs:CreateLogGroup'
- 'logs:CreateLogStream'
- 'logs:PutLogEvents'
Resource: '*'
- Effect: Allow
Action:
- 'config:DescribeConfigRules'
Resource: '*'
ConfigSecHubFunction:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: 'configrules-to-securityhub-lambda-test'
S3Key: 'config-cwe-sh.zip'
FunctionName : 'Config-SecHub-Lambda'
Handler: 'lambda_function.lambda_handler'
Role:
Fn::GetAtt:
- LambdaServiceRole
- Arn
Runtime: python3.7
Timeout: 300
ConfigSecHubCWRule:
Type: AWS::Events::Rule
Properties:
Description: This CW rule integrates AWS Config Compliance events with AWS Lambda as a target
Name: 'Config-Sechub-CW-Rule'
EventPattern:
source:
- aws.config
detail-type:
- Config Rules Compliance Change
detail:
messageType:
- ComplianceChangeNotification
State: 'ENABLED'
Targets:
-
Arn:
Fn::GetAtt:
- 'ConfigSecHubFunction'
- 'Arn'
Id: 'TargetFunctionV1'
PermissionForEventsToInvokeLambda:
Type: AWS::Lambda::Permission
Properties:
FunctionName:
Ref: 'ConfigSecHubFunction'
Action: 'lambda:InvokeFunction'
Principal: 'events.amazonaws.com'
SourceArn:
Fn::GetAtt:
- 'ConfigSecHubCWRule'
- 'Arn'
デプロイ。
aws cloudformation deploy \ --stack-name import-configrules\ --template-file importConfigRules.yaml \ --capabilities CAPABILITY_NAMED_IAM
default のイベントバスにルールが作成される。
ルールのターゲットには Lambda が指定されている。
Config Rules にてコンプライアンスチェックが失敗になルールを作成する。
SecurityHub にて、製品が「Default」のものが Config Rules 評価結果となる。
エラー
Error occurred while GetObject. S3 Error Code: PermanentRedirect. S3 Error Message: The bucket is in this region: us-east-1. Please use this region to retry the request
デフォルトの CloudFormation テンプレートを東京リージョンを指定してデプロイする場合に発生したエラー。
Lambda を作成する際、 awsiammedia バケットにある zip を取得しにいく。このバケットは us-east-1 region は存在する。
ローカルで指定している region が us-east-1 以外の場合(ap-northeast-1 等)に発生するエラー。
ConfigSecHubFunction:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: 'awsiammedia'
S3Key: 'public/sample/ImportConfigRulesFindingsSecHub/config-cwe-sh.zip'
FunctionName : 'Config-SecHub-Lambda'
Handler: 'lambda_function.lambda_handler'
Role:
Fn::GetAtt:
- LambdaServiceRole
- Arn
Runtime: python3.7
Timeout: 300
東京リージョンの S3 に zip ファイルを置き、CloudFormation テンプレートを修正した。
どこまで成功しているかわからない
EventBridge のルールのメトリクスが存在していれば、EventBridge の検知ルールになにかしらのイベントが引っかかっている。
Lambda のメトリクスが存在していれば、EventBridge から Lambda へイベントを渡せている。また、下記のようにエラーが出てないかを確認する。
何のエラーが出ているかを確認は、上記コンソールの「CloudWatch のログを表示」をクリックし、該当 Error ログを確認する。
コメント