AWS Config Rules の評価結果を Amazon EventBridge を使って SecurityHub にインポートする

2020年8月15日

概要

やりたいこと

Config Rules アラートを SecurityHub でみたい。

予め、AWS Config と Security Hub は有効化しておく(今回は ap-northeast-1 の単一リージョンでやる)。

なぜこんなことするのか?

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 に全てに合致しないといけない。

  • EventPattern
    • source : イベントを発生させたサービス
    • detail-type : イベントのタイプ
    • detail : イベントの詳細

今回の Config Rules 検知パターン

Config の detaile-typeと detail には以下が存在する。

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 は以下から取得しておく。

https://awsiammedia.s3.amazonaws.com/public/sample/ImportConfigRulesFindingsSecHub/config-cwe-sh.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 が指定されている。

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 テンプレートを修正した。

参考

AWS Config ルールの評価結果を Security Hub にインポートする方法

Amazon CloudWatch Events を使用した AWS Config のモニタリング