CloudTrail用S3バケットをSSE-KMS暗号化からS3バケットキー暗号化に切り替える

2021.04.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、daishi です。

re:Invent 2020で発表されたS3バケットキーを使うことでKMSリクエスト回数を減らすことが可能です。
「せっかくだから俺はCloudTrailバケットにS3バケットキー暗号化を選ぶぜ」とS3バケットをSSE-KMS暗号化からS3バケットキー暗号化に切り替えると、CloudTrailの証跡設定で「バケットアクセスが拒否されました」と表示されてCloudTrailの証跡記録がストップしてしまいます。
CloudTrail with S3 Bucket key is failed

どうすればCloudTrailのS3バケットをS3バケットキー暗号化に切り替えることができるのでしょうか。

S3バケットキーを利用するために必要な権限とは

AWSドキュメントにもありますが、S3バケットキー暗号化に使用する暗号鍵「バケットキー」はKMSキーを使用して暗号化します。
そのため、CloudTrailが暗号化に使用する「バケットキー」を取り出すためにKMSキーの復号権限「kms:Decrypt」が必要となります。

CloudTrailの証跡設定を行うときにSSE-KMS暗号化S3バケットを選択すると、CloudTrailサービスに「kms:GenerateDataKey*」の権限が自動的に付与されますが、「kms:Decrypt」権限は付与されません。
また、CloudTrailのアクセス権限は「AWSサービス」として定義されているので、IAMロールやIAMアカウントに「kms:Decrypt」権限を付与していてもCloudTrailサービスには付与されていないケースがあります。

CloudTrailに kms:Decrypt権限を付与するには

では、CloudTrailに「kms:Decrypt」権限を付与してみましょう。
CloudTrailの証跡S3バケットに使用したKMSキーを選択し、キーポリシーを開きます。

CloudTrailへのKMSキーのアクセス許可は以下のように記述されています。

{
    "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:*:{account-id}:trail/*"
        }
    }
}

「Action」に「kms:DecryptKey」権限を追加します。

JSONでは複数要素を追加するときに「[ ]」でくくる必要がありますから、この点も忘れずに追加します。
保存時に自動的に書式チェックを行いますから安心ですね。

{
    "Sid": "Allow CloudTrail to encrypt logs",
    "Effect": "Allow",
    "Principal": {
        "Service": "cloudtrail.amazonaws.com"
    },
    "Action": [
        "kms:GenerateDataKey*",
        "kms:DecryptKey"
    ],
    "Resource": "*",
    "Condition": {
        "StringLike": {
            "kms:EncryptionContext:aws:cloudtrail:arn": "arn:aws:cloudtrail:*:{account-id}:trail/*"
        }
    }
}

CloudTrailの証跡S3バケットをS3バケットキー暗号化に変更

CloudTrailの証跡S3バケットの暗号化設定をS3バケットキー暗号化に変更します。
暗号化設定を切り替えた時点で即時反映されるため、変更前にキーポリシーが適切か確認します。

CloudTrailの証跡を確認

CloudTrailの証跡の状態を確認し、正常に記録されていることを確認します。
S3バケットにもS3バケットキー暗号化したログが記録されていますね。
CloudTrail with S3 Bucket key is successed
CloudTrail S3 Bucket log

これでCloudTrail証跡をS3バケットキー暗号化に切り替えることができました。
S3バケットキー暗号化は「"kms:DecryptKey"」権限が必要なため、CloudTrailだけでなくIAMロールやIAMアカウントも同様に見直しが必要なところは忘れずにチェックしましょう。