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

2020年8月20日

目次

概要

やりたいこと

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

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

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 に出力されていた。

[ERROR] AccessDeniedException: An error occurred (AccessDeniedException) when calling the BatchImportFindings operation: User: arn:aws:sts::444455556666:assumed-role/config-sechub-lambda-role-ap-northeast-1/Config-SecHub-Lambda is not authorized to perform: securityhub:BatchImportFindings on resource: arn:aws:securityhub:ap-northeast-1:111122223333:product/111122223333/default

Security Hub に Findings をインポートする際のエラーが出てしまい進まない。。

以下としている。

  • アカウントA 送信側 : 111122223333
  • アカウントB 受信側 : 444455556666

「Security Hub でアクションの実行を承認されていない」が該当しそう。

Lambda は BatchImportFindings を許可されていない。
arn:aws:securityhub:ap-northeast-1:111122223333:product/111122223333/default に対して。

リソースレベルでのアクセス許可ができていない可能性。

アーキテクチャ

同アカウント内で、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

  • アカウントA 送信側 : 111122223333
  • アカウントB 受信側 : 444455556666

アカウントB : 受信側

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

イベントバスポリシーを設定し、別の AWS アカウントのイベントの受信を許可する。

ReceiveEventBusPolicy: 
  Type: AWS::Events::EventBusPolicy
  Properties: 
    Action: "events:PutEvents"
    Principal: "111122223333"
    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'

デプロイすると default のイベントバスにルールが設定される。

aws cloudformation deploy \
--profile AccountB\
--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:444455556666:event-bus/default'

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

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

  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:444455556666: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’.

Principal の Service に lambda.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'

events.amazonaws.com を指定しなければならない。

  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'

イベントを送れているかわからない

送信元 EventBridge ルールのコンソールから「ルールのメトリクス」をクリック。

CloudWatch メトリクスのコンソールに飛び、そこで該当ルールのメトリクスが存在していれば、イベントは送っている。

送信先の EventBridge のメトリクスでも同様に値が存在していれば、受け取れてはいる。

参考

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