Organizations環境でCloudTrailを集約する方法のメモ。
参考リンク
- 組織の証跡の作成
- [Organizations]組織レベルでCloudTrailを有効化する
- 【Organizations】組織レベルで CloudTrailの証跡を有効化、S3バケットへ集約する
- CloudTrailの「組織の証跡」でOrganizationsメンバアカウントに一括CloudTrailを設定する手順 (ロギング専用アカウント+KMS暗号化)
方針
以下のように設定する。
- CloudTrailのログはログアカウントのS3バケットに保管する
- S3保管時にはKMSによる暗号化を行う
- KMSの鍵はログアカウントで管理する
なお、KMSによる暗号化を行わなくても、SSE-SEで暗号化される。
手順
バケットの作成(ログアカウント)
組織の証跡を有効にするアカウントにバケットを作る場合は証跡の作成時にコンソールからバケットを作成できそうだが、クロスアカウントの場合はCLIで先に作る。
ログアカウントでバケットを作成する。
organization_id="<組織のID>" cloudtrail_bucket_name="cloudtrail-bucket-${organization_id}" aws s3api create-bucket \ --bucket ${cloudtrail_bucket_name} \ --region ap-northeast-1 \ --create-bucket-configuration LocationConstraint=ap-northeast-1
バケットポリシーを用意する。以下のリンク先にポリシーの例がある。
このポリシーは以下を設定している。
- 1つめのセクションはCloudTrailサービスからのバケットのACL取得を許可
- 2つめのセクションはCloudTrailサービスからバケットのオーナーにフルコントロールを与えることを条件にマスターアカウントのフォルダへの証跡書き込みを許可
- 3つめのセクションはCloudTrailサービスからバケットのオーナーにフルコントロールを与えることを条件に組織のフォルダへの証跡書き込みを許可
master_account_id="<組織のマスターアカウントのID>" cat <<EOF > bucket-policy.json { "Version": "2012-10-17", "Statement": [ { "Sid": "AWSCloudTrailAclCheck20150319", "Effect": "Allow", "Principal": { "Service": [ "cloudtrail.amazonaws.com" ] }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::${cloudtrail_bucket_name}" }, { "Sid": "AWSCloudTrailWrite20150319", "Effect": "Allow", "Principal": { "Service": [ "cloudtrail.amazonaws.com" ] }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::${cloudtrail_bucket_name}/AWSLogs/${master_account_id}/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } }, { "Sid": "AWSCloudTrailWrite20150319", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::${cloudtrail_bucket_name}/AWSLogs/${organization_id}/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] } EOF
バケットポリシーを設定する。
aws s3api put-bucket-policy --bucket ${cloudtrail_bucket_name} --policy file://bucket-policy.json
キーの作成(ログアカウント)
CloudTrailがS3にPUTするときに使うCMKを作成する。バケットに暗号化を設定するわけではなく、証跡の側を暗号化する。
キーを作成する。
cloudtrail_key_arn=$(aws kms create-key --query KeyMetadata.Arn --output text) cloudtrail_key_id=${cloudtrail_key_arn##*/} aws kms create-alias \ --alias-name alias/cloudtrail-key \ --target-key-id ${cloudtrail_key_id}
キーポリシーを作成する。以下に記載が必要なポリシーについて記載がある。
このポリシーは以下を設定している。
- 1つめのセクションはデフォルトの設定でIAMユーザーのアクセスを許可
- 2つめのセクションは暗号化権限の付与
- 3つめのセクションはCMKプロパティの記述の有効化
log_account_id="<ログアカウントのID>" cat <<EOF > key-policy.json { "Version": "2012-10-17", "Id": "key-default-1", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::${log_account_id}:root" }, "Action": "kms:*", "Resource": "*" }, { "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:*:${master_account_id}:trail/*" ] } } }, { "Sid": "Allow CloudTrail access", "Effect": "Allow", "Principal": { "Service": "cloudtrail.amazonaws.com" }, "Action": "kms:DescribeKey", "Resource": "*" } ] } EOF
キーポリシーを設定する。
aws kms put-key-policy --key-id ${cloudtrail_key_id} --policy file://key-policy.json --policy-name default
証跡の設定(マスターアカウント)
こちらに従いCLIで実施してみる。
全ての機能が有効化されていることを確認する。
aws organizations describe-organization | jq -r '.Organization.FeatureSet'
AWS OrganizationsとCloudTrailの間の信頼を作成する。
aws organizations enable-aws-service-access --service-principal cloudtrail.amazonaws.com
証跡を作成する。KMSキーはARNで指定する必要がある。
aws cloudtrail create-trail \ --s3-bucket-name ${cloudtrail_bucket_name} \ --name organization-trail \ --include-global-service-events \ --is-multi-region-trail \ --enable-log-file-validation \ --kms-key-id ${cloudtrail_key_arn} \ --is-organization-trail
ログ記録を開始する。
aws cloudtrail start-logging --name organization-trail
以上で完了。