Organizations配下のマルチアカウントでのCloudTrail集約

Organizations環境でCloudTrailを集約する方法のメモ。

参考リンク

方針

以下のように設定する。

  • 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}

キーポリシーを作成する。以下に記載が必要なポリシーについて記載がある。

このポリシーは以下を設定している。

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

以上で完了。