日本語 English
インターステラ株式会社の技術ブログです

Organizationに依存せず、複数アカウントのCloudTrailログを監査用アカウントに集約する方法

こんにちは、阿形です。

タイトルが長くてすみません。
今回はAWSのCloudTrailのお話です。

CloudTrailはAWSにおける監査のための仕組みであり、AWS上のアクティビティを記録するようになっています。AWSアカウントが1個の場合はそのアカウント上で設定すればよいだけですが、複数のアカウントがある場合、監査用のアカウントを作成し、その間作用アカウントにCloudTrailのログを集約することがベストプラクティスとして推奨されています。
通常であれば、Organizationを設定し、複数のアカウントをOrganization配下として、Organizationの管理アカウントからCloudTrailを設定すれば非常に簡単に設定ができます。

ですが、ここはあえてOrganizationに依存せず設定してみます。
よって対象となる方は、複数のAWSアカウントがあるが、Organizationで管理していない(なんらかの事情でできない)方のみとなります。

具体的な設定は以下のAWSのヘルプをベースにしています。

https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-receive-logs-from-multiple-accounts.html

ただ、各作業でドキュメントがばらばらで読むのが面倒だったり、内容が一部古くなっていたりしたので、以下にひととおりまとめてみました。

0. 前提条件

上記のAWSのヘルプと同様に、以下のAWSアカウントがあるものとします。(ヘルプでは4つのアカウントが出てきますが、監査用アカウント以外は同じことの繰り返しで冗長なので、以下の2つだけで説明します)

  • 111111111111 : CloudTrailのログを集約する監査用アカウント
  • 222222222222 : CloudTrailのログを出力するアカウント

1. 証跡の作成

監査用AWSアカウントでCloudTrailを有効にし証跡を作成します。
使用するS3バケットやKMSキーなどは既存のものも使用できますが、ここではすべて新規作成します。

  1. Management ConsoleでCloudTrailを開きます。
  2. 左側メニューから「Trails(証跡)」を選択し、「Create Trail」ボタンをクリック。
  3. Choose trail attibutesの画面で以下の設定を行います。(これら以外はデフォルトで構いません)
    • Trail name (証跡名) : 任意
    • Storage location (ストレージの場所) : Create new S3 bucketを選択
    • Trail log bucket and folder (証跡ログバケットおよびフォルダ) : 任意
    • Customer managed AWS KMS key : Newを選択
    • AWS KMS alias (AWS KMS エイリアス) : 任意
  4. Nextをクリック
  5. Choose log eventsはデフォルトのままでNextをクリック
  6. Review and createで内容を確認したらCreate trailをクリックし証跡を作成する

2. S3バケットポリシーの設定

監査用AWSアカウントのS3バケットで、複数のアカウントからログファイルを受け取れるように設定します。

  1. Management ConsoleでS3を開きます。
  2. Bucketsのリストから、1で作成したS3バケットをクリックします。
  3. 上部のタブからPermissions(アクセス許可)をクリック
  4. Bucket policyのEdit(編集)をクリックし、JSONを以下の赤文字の部分を自身のアカウントIDや設定した内容に応じて編集
    • CloudTrailの作成画面上でS3バケットを作成した場合、”Sid”: “AWSCloudTrailWrite…の内容が自動的に設定されています
    • これをコピーして、222222222222用の設定も追加します。
{
	"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"
				}
			}
		}
	]
}

3. KMSキーポリシーの設定

作成したKMSキーのキーポリシーを編集し、他のアカウントからアクセスできるようにします。

  1. Management CosoleでKey Management Serviceを開きます。
  2. KMSキーのリストから作成したKMSキーをクリックします。
  3. Key policyのEdit(編集)をクリックし、JSONを以下のように編集します。
{
    "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/*"
                }
            }
        }
    ]
}

4.追加アカウントでCloudTrailを有効にする

1と同様に証跡を作成するが、以下のように設定を行う。

  • Storage locationはUse existing S3 bucket(既存のS3バケットを使用する)を選択
  • Trail log bucket name (証跡ログバケット名)は1で作成したS3バケット名を指定
  • Customer managed AWS KMS key(カスタマー管理の AWS KMS キー)は既存を選択
  • AWS KMS aliasには1で作成したKMSキーのキーARN、エイリアスARN、キーIDのいずれかを入力

以上で設定は終了です。

しばらくすると、作成したS3バケットにCloudTrailのログが記録され始めます。
うまく記録されない場合は、S3バケットのポリシーやKMSキーのポリシーを見直してみましょう。

SNSでフォローする