AWS Config Rules の結果を別アカウントの Security Hub にインポートする

2020年8月14日

概要

やりたいこと

今回は、Config Rules の評価結果を、別アカウントの SecurityHub にインポートしたい。

同アカウント内で、 AWS Config Rules を SecurityHub にインポートするのは以前行った。

アーキテクチャ

同アカウント内で、Config Rules を Security Hub へインポートする場合の流れは以下。

  • ConfigRules -> Amazon EventBridge -> Lambda -> SecurtiyHub

今回は、Config Rules が発生するアカウントと、取り込む Security Hub が以下の通り別となる。

  • アカウントA : Config Rules
  • アカウントB : SecurityHub

この場合、 Amazon EventBridge 間でイベントの送受信を行う。

  1. アカウントA の ConfigRules
  2. アカウントA の Amazon EventBridge
  3. アカウントB の Amazon EventBridge
  4. アカウントB の Lambda
  5. アカウントB の SecurityHub

AWS アカウント間のイベントの送受信

Amazon EventBridge を利用すれば、AWSアカウント間のイベントの送受信ができる。

手順は以下。

  • 受信側 : 他の AWS アカウントからイベントを受信できるようにアクセス許可
  • 受信側 : 別の AWS アカウントのイベントに一致するルール
  • 送信側 : 受信アカウントにイベントを送信するためのアクセス許可
  • 送信側 : 受信アカウントのイベントバスをターゲットとするルール

CloudFormation

アカウント B : 受信側

他の AWS アカウントからイベントを受信できるようアクセス許可

イベントバスポリシーを設定することで、他の AWS アカウントからイベントを受信できるようになる。

ReceiveEventBusPolicy: 
  Type: AWS::Events::EventBusPolicy
  Properties: 
    Action: "events:PutEvents"
    Principal: ${send_account_id}
    StatementId: "MyStatement"

別の AWS アカウントのイベントの受信

別アカウントからのデータを受け取り、Target のアクションを行うルール。
※Lambda の CloudFormation 部分は前回のブログ参照。

  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'

デプロイ

aws --profile AccountB cloudformation deploy --stack-name send-configrules --template-file sendConfigRules.yaml --capabilities CAPABILITY_NAMED_IAM

アカウント A : 送信側

受信アカウントにイベントを送信するためのアクセス許可

クロスアカウントの場合、送信・受信側両方にアクセス許可が必要。

Resources: 
  EventSendRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'event-send-crossaccount-role'
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - events.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Policies:
        - PolicyName: crossaccount-eventbridge-access-policy-policy
          PolicyDocument:
            Statement:
              - Effect: Allow
                Action:
                  - 'events:PutEvents'
                Resource:
                  - 'arn:aws:events:ap-northeast-1:${receiver_account_id}:event-bus/default'

受信アカウントのイベントバスをターゲットとするルール

上記で作った IAM Role をアタッチし、Targets に送信先の event-bus を指定する。

  EventSendCrossAccount:
    Type: AWS::Events::Rule
    Properties:
      Description: This CW rule integrates AWS Config Compliance events with AWS Lambda as a target
      Name: 'Event-Send-Cross-Account'
      RoleArn: !GetAtt EventSendRole.Arn
      EventPattern:
        source:
          - aws.config
        detail-type:
          - Config Rules Compliance Change
        detail:
          messageType:
            - ComplianceChangeNotification
      State: 'ENABLED'
      Targets:
        - 
          Arn:
            Fn::GetAtt:
              - 'arn:aws:events:ap-northeast-1:111111111111:event-bus/default'
              - Arn
          Id: 'CrossAccountTargetId'

デプロイ。

aws --profile AccountA cloudformation deploy \
--stack-name send-configrules \
--template-file sendConfigRules.yaml \
--capabilities CAPABILITY_NAMED_IAM

送信元・受信先で同じ Config Rules を設定しておき、送信元で Config Rules でアラートを発生させる。

送信元の Security Hub で「Default」ログを確認できれば OK。

エラー

Error occurred while GetObject. S3 Error Code: NoSuchKey. S3 Error Message: The specified key does not exist

zip ファイルを S3 にアップロードしていない状態で Lambda を作成する CloudFormation を実行した際に出力。

An error occurred (ValidationError) when calling the CreateChangeSet operation: Template error: instance of Fn::GetAtt references undefined resource arn:aws:events:ap-northeast-1:111111111111:event-bus/default

EventBridge ルールの Targets をこう書いていた。リソースには別アカウントIDを指定。

      Targets:
        - 
          Arn:
            Fn::GetAtt:
              - 'arn:aws:events:ap-northeast-1:111111111111:event-bus/default'
              - Arn

正解はこう。

      Targets:
        - 
          Arn: "arn:aws:events:ap-northeast-1:111111111111:event-bus/default"
          Id: 'TargetAccount'

“Provided role ‘arn:aws:iam::111111111111:role/event-send-crossaccount-role’ cannot be assumed by principal ‘events.amazonaws.com’.

こう書いてた。

  EventSendRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'event-send-crossaccount-role'
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - 'sts:AssumeRole'

正解はこう。

  EventSendRole:
    Type: 'AWS::IAM::Role'
    Properties:
      RoleName: 'event-send-crossaccount-role'
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - events.amazonaws.com
            Action:
              - 'sts:AssumeRole'

Error: An error occurred (NoSuchConfigRuleException) when calling the DescribeConfigRules operation: The ConfigRule ‘ec2-instance-detailed-monitoring-enabled’ provided in the request is invalid. Please check the configRule name.

送信先で同じ Config Rules を有効化しておかないとエラーが出る。。

CloudWatch Logs に出力されていた。

参考

AWS アカウント間のイベントの送受信