概要
やりたいこと
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
以上を全リージョンで繰り返す。
複数アカウント、複数リージョンからログが出力されていること。
コメント