GuardDuty 委任管理アカウントから別アカウントの S3 へ GuardDuty ログをエクスポート

概要

やりたいこと

GuardDuty 委任管理者アカウントから別アカウントの S3 バケットへ GuardDuty ログをエクスポートしたい。

過去に全リージョンの GuardDuty ログを東京リージョンの S3 バケットにエクスポートした。

GuardDuty 委任管理者の指定は以下で行った。

別アカウントへログエクスポート

アカウントごとに作成しなければらならい AWS リソースは以下。

  • アカウントA : GuardDuty 委任管理アカウント
  • アカウントB : S3 バケット

問題は KMS キーをどこに作成するかだが、今回は GuardDuty 委任管理アカウントに作成することとした。

CloudFormation

  • アカウント A : 1111222233333
  • アカウント B : 4444555566666

KMSキー

GuardDuty 委任管理アカウントに作成する。

AWSTemplateFormatVersion: 2010-09-09
Description: GuardDuty KMS
Resources:
  KmsKey:
    Type: AWS::KMS::Key
    Properties:
      Description: "Key for GuardDuty"
      EnableKeyRotation: true
      KeyPolicy:
        Version: "2012-10-17"
        Id: "kms-guardduty"
        Statement:
         -
            Sid: "Enable IAM User Permissions"
            Effect: "Allow"
            Principal:
               AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
            Action: "kms:*"
            Resource: "*"
         -
            Sid: "Allow GuardDuty to use the key"
            Effect: "Allow"
            Principal:
              Service: "guardduty.amazonaws.com"
            Action:
              - "kms:GenerateDataKey"
            Resource: "*"
      PendingWindowInDays: 7
  KmsKeyAlias:
    Type: AWS::KMS::Alias
    Properties:
      AliasName: "alias/KMS-GuardDuty"
      TargetKeyId:
        Ref: KmsKey

デプロイ。

aws cloudformation deploy \
--profile account_a \
--stack-name guardduty-kms \
--template-file guardduty_kms.yaml

作成された KMS キーの Arn をメモしておく。

S3 バケット作成

委任管理アカウントとは別のアカウントにバケットを作成する。

AWSTemplateFormatVersion: 2010-09-09
Description: Create S3 bucket for AWS GuardDuty

Parameters:
  BucketName:
    Type: String
  OrganizationId:
    Type: String
  KmsKey:
    Type: String


Resources:
  GuardDutyBucket:
    DeletionPolicy: Retain
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      VersioningConfiguration:
        Status: Enabled
      LifecycleConfiguration:
        Rules:
          - Id: 365days-All-LifeCycleRule
            Status: Enabled
            ExpirationInDays: 365
            NoncurrentVersionExpirationInDays: 10
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: true
        BlockPublicPolicy: true
        IgnorePublicAcls: true
        RestrictPublicBuckets: true

  GuardDutyBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref GuardDutyBucket
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Sid: "Allow GetBucketLocation"
            Action: 's3:GetBucketLocation'
            Effect: "Allow"
            Resource:
            - !Join ['', ['arn:aws:s3:::', !Ref GuardDutyBucket]]
            Principal:
              Service:
                - guardduty.amazonaws.com
          - Sid: "Allow PutObject"
            Action: 's3:PutObject'
            Effect: "Allow"
            Resource:
            - !Join ['', ['arn:aws:s3:::', !Ref GuardDutyBucket,'/*']]
            Principal:
              Service:
                - guardduty.amazonaws.com
          - Sid: "Deny unencrypted object uploads"
            Action: 's3:PutObject'
            Effect: "Deny"
            Resource:
            - !Join ['', ['arn:aws:s3:::', !Ref GuardDutyBucket,'/*']]
            Principal:
              Service:
                - guardduty.amazonaws.com
            Condition:
              StringNotEquals:
                s3:x-amz-server-side-encryption: "aws:kms"
          - Sid: "Deny incorrect encryption header"
            Action: 's3:PutObject'
            Effect: "Deny"
            Resource:
            - !Join ['', ['arn:aws:s3:::', !Ref GuardDutyBucket,'/*']]
            Principal:
              Service:
                - guardduty.amazonaws.com
            Condition:
              StringNotEquals:
                s3:x-amz-server-side-encryption-aws-kms-key-id: !Sub "${KmsKey}"
          - Sid: "Deny non-HTTPS access"
            Action: 's3:*'
            Effect: "Deny"
            Resource:
              - !Sub "arn:aws:s3:::${BucketName}/*"
            Principal: "*"
            Condition:
              Bool:
                aws:SecureTransport: "false"

バケット名と KMS キーの ARN を指定してデプロイ。

aws cloudformation deploy \
--profile account_b \
--stack-name guardduty-bucket \
--template-file guardduty_s3.yaml \
--parameter-overrides BucketName=guardduty-bucket-name KmsKey=arn:aws:kms:ap-northeast-1:1111222233333:key/39d20b7b-621d-45d6-ab1e-5b4b8e09fd92

S3 へエクスポート

GuardDuty コンソールで操作する。

  • 既存のバケット(別アカウント内)
    • S3 バケットの ARN
    • KMS キーの ARN

以上を全リージョンで繰り返す。

複数アカウント、複数リージョンからログが出力されていること。

参考

結果のエクスポート

GuardDutyの検出結果をエクスポートするためのKMSキーとS3バケットをCloudFormationで作った