複数アカウントのCloudTrailをKMSで暗号化する

# 前書き

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)載っているが、通しての手順はネット上でも見つからなかったので、忘備録として残しておく。

# 構成
![Cloud Trail.png](https://qiita-image-store.s3.amazonaws.com/0/51320/83813370-f1c2-9891-97f6-77c45d89a3f1.png)

・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