CloudTrailログの保存先バケットポリシーで気になったこと

CloudTrailのログを1つのBucketに集約するときに気になった。
なんでResourceでアカウントIDを制限しているのだろうか？

[CloudTrail の Amazon S3 バケットのポリシー \- AWS CloudTrail](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/create-s3-bucket-policy-for-cloudtrail.html)

## ResourceでAWSアカウントID「123456789012」からのみに制限する

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::bucket-1"
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket-1/my-prefix/AWSLogs/123456789012/*",
            "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
        }
    ]
}
```

Resourceで受け取りたいアカウントIDのみを指定している。
なんでPrincipalで指定していないんだ？

## PrincipalでAWSアカウントID「123456789012」からのみ制限するがPermission Deny

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {"AWS": "arn:aws:iam::123456789012:root"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::bucket-1"
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket-1/my-prefix/AWSLogs/*",
            "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
        }
    ]
}
```

これでもいい気がしたんだが、これだと権限がないって怒られる。

なんかおかしいなと思ってマニュアルを再度見直す。
リージョンを限定した例があった。リージョン？

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20131101",
            "Effect": "Allow",
            "Principal": {"AWS": [
                "arn:aws:iam::903692715234:root",
                "arn:aws:iam::035351147821:root",
                "arn:aws:iam::859597730677:root",
                "arn:aws:iam::814480443879:root",
                "arn:aws:iam::216624486486:root",
                "arn:aws:iam::086441151436:root",
                "arn:aws:iam::388731089494:root",
                "arn:aws:iam::284668455005:root",
                "arn:aws:iam::113285607260:root"
            ]},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::bucket-1"
        },
        {
            "Sid": "AWSCloudTrailWrite20131101",
            "Effect": "Allow",
            "Principal": {"AWS": [
                "arn:aws:iam::903692715234:root",
                "arn:aws:iam::035351147821:root",
                "arn:aws:iam::859597730677:root",
                "arn:aws:iam::814480443879:root",
                "arn:aws:iam::216624486486:root",
                "arn:aws:iam::086441151436:root",
                "arn:aws:iam::388731089494:root",
                "arn:aws:iam::284668455005:root",
                "arn:aws:iam::113285607260:root"
            ]},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket-1/my-prefix/AWSLogs/123456789012/*",
            "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
        }
    ]
}
```

> たとえば、CloudTrail が 米国東部 (オハイオ) リージョン のサポートを追加したので、そのリージョンのアカウント ID ARN "arn:aws:iam::475085895292:root を含むようにポリシーを更新する必要があります。

つまりCloudTrailって各アカウントからAPI叩かれるのではなく、各リージョンの固定アカウントから叩かれるのか。

[CloudTrail がサポートされているリージョン \- AWS CloudTrail](https://docs.aws.amazon.com/ja_jp/awscloudtrail/latest/userguide/cloudtrail-supported-regions.html)

一覧もあった。

CloudTrailのログを受け取りたいリージョンを制限するときだけPrincipalを使うのか。
PrincipalでServiceをCloudTrailだけに限定しているため、決められたPrefixが付いたオブジェクトしかPutされてこない。
そのためResourceでアカウントIDを指定してしまえば制限していることになるという理屈。

## 複数アカウントから受け取りたいとき

Resourceを増やしていくだけでいい。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::bucket-1"
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::bucket-1/my-prefix/AWSLogs/123456789012/*",
                "arn:aws:s3:::bucket-1/my-prefix/AWSLogs/123456789013/*",
                "arn:aws:s3:::bucket-1/my-prefix/AWSLogs/123456789014/*"
            ],
            "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
        }
    ]
}
```


## 雑なバケットポリシーとリスク

バケットポリシーを毎回更新するのめんどうだから、雑にResourceを限定せずにやった場合

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AWSCloudTrailAclCheck20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::bucket-1"
        },
        {
            "Sid": "AWSCloudTrailWrite20150319",
            "Effect": "Allow",
            "Principal": {"Service": "cloudtrail.amazonaws.com"},
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::bucket-1/my-prefix/AWSLogs/*",
            "Condition": {"StringEquals": {"s3:x-amz-acl": "bucket-owner-full-control"}}
        }
    ]
}
```

バケット名がバレたら知らないアカウントからCloudTrailログをPutされる可能性がある。
集計でゴミが混ざったり、それによりいらぬアラートが発火するのは嫌ではある。

だけどそれってそんなにリスクかな、たいしたリスクでもないような気もするがなにか気付いてない要素があるんだろうか。