前書き
AWSからCIS (Center for Internet Security) AWS Foundations Benchmarkという、汎用的なセキュリティガイドラインが提供されている(*1)。
その中で、以下のようにCloudTrailのログをKMS暗号化することが推奨されている。2.7 Ensure CloudTrail logs are encrypted at rest using KMS CMKs (Scored)
また、CloudTrailのログは、一つの管理アカウントに集約する運用もままある(*2)。
双方を両立させる設定について、公式ドキュメントに一部(*3)載っているが、通しての手順はネット上でも見つからなかったので、忘備録として残しておく。
構成
- Trail管理アカウント(AccountID: 111111111111)
バケットを持つアカウント。KMSのCMKもここに作る。
自分自身のTrailログもとる - Trail管理配下アカウント(AccountID: 222222222222)
Trailログ取得が必要になるアカウント。
手順
<Trail管理アカウント>S3バケットを作る
次の手順で、S3バケットを自動生成するオプションもあるが、予め作ってあるバケットにTrailログを保存することもできる。ここでは、自分でS3バケットを作る手順で進める。
バケット作成は、デフォルトのまま、任意のリージョンでOK。
ただし、既存のCMKを使う場合は、リージョンを揃える必要がある。
バケットポリシーは公式サイト(*4)より以下となる。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck20131101", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::myBucketName" }, { "Sid": "AWSCloudTrailWrite20131101", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": [ "arn:aws:s3:::myBucketName/[optional] myLogFilePrefix/AWSLogs/111111111111/*", "arn:aws:s3:::myBucketName/[optional] myLogFilePrefix/AWSLogs/222222222222/*" ], "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
<Trail管理アカウント>Trail設定をする
Trail認証情報を作成する。
バケット指定はバケット名で行う。
例)myBucketName
KMSもS3バケットと同じく、予め用意したものを指定できるが、ポリシーが結構複雑になるので、自動生成に任せた方が楽。
とりあえず、ここまでの手順でTrailログがバケットに流れ込み出すはず。
<Trail管理アカウント>CMKポリシーの修正
Trail管理配下アカウントのために、CMKポリシーを修正する。
マネジメントコンソール のIAM画面から、先の手順で作られた暗号化キーを参照する。
見つからない場合は、リージョンが合っているかを確認する。※画面右上のものでない
対象キーを選択、キーポリシー欄にて、ポリシービューに切り替えて、編集できる状態にする。
以下の部分を修正する。
{ "Sid": "Allow CloudTrail to encrypt logs", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:GenerateDataKey*", "Resource": "*", "Condition": { "StringLike": { "kms:EncryptionContext:aws:cloudtrail:arn": [ "arn:aws:cloudtrail:*:111111111111:trail/*", "arn:aws:cloudtrail:*:222222222222:trail/*" ] } } },
StringLikeの要素をリストにし、管理配下のアカウントを追加する。
<Trail管理配下アカウント>Trail設定をする
ほぼ同様の手順でOK。
バケット名はリージョン内でユニークなはずなので、先と同じくバケット名でよい。
一方、KMSの指定は、ARNで行う。
例)arn:aws:kms:ap-northeast-1:111111111111:key/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx
これで、管理配下のTrailログも、管理アカウントのバケットに流れ込む。
<両方>確認
目視でもいいが、Configでチェックするとより安心。
参考)
(*1) https://aws.amazon.com/jp/about-aws/whats-new/2017/12/new-quick-start-implements-security-configurations-to-support-cis-aws-foundations-benchmark/
(*2) https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html
(*3) https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/create-kms-key-policy-for-cloudtrail-encrypt.html
(*4) https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-set-bucket-policy-for-multiple-accounts.html