こんにちは、阿形です。
タイトルが長くてすみません。
今回はAWSのCloudTrailのお話です。
CloudTrailはAWSにおける監査のための仕組みであり、AWS上のアクティビティを記録するようになっています。AWSアカウントが1個の場合はそのアカウント上で設定すればよいだけですが、複数のアカウントがある場合、監査用のアカウントを作成し、その間作用アカウントにCloudTrailのログを集約することがベストプラクティスとして推奨されています。
通常であれば、Organizationを設定し、複数のアカウントをOrganization配下として、Organizationの管理アカウントからCloudTrailを設定すれば非常に簡単に設定ができます。
ですが、ここはあえてOrganizationに依存せず設定してみます。
よって対象となる方は、複数のAWSアカウントがあるが、Organizationで管理していない(なんらかの事情でできない)方のみとなります。
具体的な設定は以下のAWSのヘルプをベースにしています。
ただ、各作業でドキュメントがばらばらで読むのが面倒だったり、内容が一部古くなっていたりしたので、以下にひととおりまとめてみました。
上記のAWSのヘルプと同様に、以下のAWSアカウントがあるものとします。(ヘルプでは4つのアカウントが出てきますが、監査用アカウント以外は同じことの繰り返しで冗長なので、以下の2つだけで説明します)
監査用AWSアカウントでCloudTrailを有効にし証跡を作成します。
使用するS3バケットやKMSキーなどは既存のものも使用できますが、ここではすべて新規作成します。
監査用AWSアカウントのS3バケットで、複数のアカウントからログファイルを受け取れるように設定します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSCloudTrailAclCheck20150319",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::myBucketName"
},
{
"Sid": "AWSCloudTrailWrite-111111111111",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::myBucketName/optionalLogFilePrefix/AWSLogs/111111111111/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"AWS:SourceArn": "arn:aws:cloudtrail:region:111111111111:trail/trailName"
}
}
},
{
"Sid": "AWSCloudTrailWrite-interstellar-test",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::myBucketName/optionalLogFilePrefix/AWSLogs/222222222222/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control",
"AWS:SourceArn": "arn:aws:cloudtrail:region:222222222222:trail/trailName"
}
}
}
]
}
作成したKMSキーのキーポリシーを編集し、他のアカウントからアクセスできるようにします。
{
"Version": "2012-10-17",
"Id": "Key policy created by CloudTrail",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::111111111111:root"
]
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow CloudTrail to encrypt logs",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "kms:GenerateDataKey*",
"Resource": "*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": [
"arn:aws:cloudtrail:region:111111111111:trail/trailName",
"arn:aws:cloudtrail:region:222222222222:trail/trailName"
]
},
"StringLike": {
"kms:EncryptionContext:aws:cloudtrail:arn": [
"arn:aws:cloudtrail:*:111111111111:trail/*",
"arn:aws:cloudtrail:*:222222222222:trail/*"
]
}
}
},
{
"Sid": "Allow CloudTrail to describe key",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "kms:DescribeKey",
"Resource": "*"
},
{
"Sid": "Allow principals in the account to decrypt log files",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"kms:Decrypt",
"kms:ReEncryptFrom"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:CallerAccount": "111111111111"
},
"StringLike": {
"kms:EncryptionContext:aws:cloudtrail:arn": "arn:aws:cloudtrail:*:111111111111:trail/*"
}
}
},
{
"Sid": "Allow alias creation during setup",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "kms:CreateAlias",
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:CallerAccount": "111111111111",
"kms:ViaService": "ec2.ap-northeast-1.amazonaws.com"
}
}
},
{
"Sid": "Enable cross account log decryption",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"kms:Decrypt",
"kms:ReEncryptFrom"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"kms:CallerAccount": "111111111111"
},
"StringLike": {
"kms:EncryptionContext:aws:cloudtrail:arn": "arn:aws:cloudtrail:*:111111111111:trail/*"
}
}
}
]
}
1と同様に証跡を作成するが、以下のように設定を行う。
以上で設定は終了です。
しばらくすると、作成したS3バケットにCloudTrailのログが記録され始めます。
うまく記録されない場合は、S3バケットのポリシーやKMSキーのポリシーを見直してみましょう。