😇

忘れがちなS3バケットへのアクセス許可!クロスアカウントも

に公開

この記事を書こうと思った契機

アクセスをしたいIAMロール(ユーザー)のIAMポリシーとバケットポリシーの関係が毎回分からなくなるし、アイデンティティベースポリシーとリソースベースポリシーの違いがわからなくなるし、S3アクセスポイントが出てくると更にややこしくなり、クロスアカウントともなるともうどうしたらいいか分からなくなるので、一度アウトプットしつつ整理しようと思った

同一アカウントの場合

S3バケットに直接アクセス

IAMポリシーかバケットポリシーのどちらかで明示的許可されていればアクセスが可能

例)S3バケット名「testbucket」、IAMロール名「my-role」の場合

IAMポリシー(アイデンティティベースポリシー)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::testbucket",
                "arn:aws:s3:::testbucket/*"
            ],
        }
    ]
}

バケットポリシー(リソースベースポリシー)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Principal": "arn:aws:iam::123456789012:role/my-role",
            "Resource": [
                "arn:aws:s3:::testbucket",
                "arn:aws:s3:::testbucket/*"
            ],
        }
    ]
}

上記のどちらかがあれば正しくS3バケットにアクセス出来る。

S3アクセスポイントを使用する

以下いずれかの場合であればアクセス可能

  • アクセスポイントポリシーで明示的許可
  • IAMポリシーで明示的許可
  • バケットポリシーで明示的許可

※2と3を選択するメリットはありません。

アクセスポイントポリシーに書く内容は↑のバケットポリシーとほぼ同じです(Resourceの部分をバケットARNでなくアクセスポイントARNに変更する)。
ただ、バケットポリシーでアクセスポイント経由のアクセスを許可する必要があります。

{
    "Version": "2012-10-17",
    "Statement" : [
    {
        "Effect": "Allow",
        "Principal" : { "AWS": "*" },
        "Action" : "*",
        "Resource" : [
                    "arn:aws:s3:::testbucket",
                    "arn:aws:s3:::testbucket/*"
                ],
        "Condition": {
            "StringEquals" : { "s3:DataAccessPointAccount" : "123456789012" }
        }
    }
}

別アカウント(クロスアカウントアクセス)の場合

S3バケットに直接アクセス

IAMポリシーで許可されていて、かつ、バケットポリシーでも許可されている必要がある

お互いに許可して始めてアクセスが出来る。
IAMポリシーだけ許可してもアクセス出来ないのはそれはそうだけど、逆にバケットポリシーだけでもダメなのは忘れがち。

S3アクセスポイントを使用する

これがややこしいんです。まずS3アクセスポイントを使用してクロスアカウントアクセスを実現する方法は2通りあります。

  • S3とアクセスポイントが同じアカウント、IAMロールが別アカウント
  • IAMロールとアクセスポイントが同じアカウント、S3が別アカウント

それぞれ大きく必要なピースは変わりませんが、それぞれ微妙に内容が変わってきます。

  • S3とアクセスポイントが同じアカウント、IAMロールが別アカウント
    • S3バケットポリシー:アクセスポイント経由のアクセスを許可(上述)
    • アクセスポイントポリシー:PrincipalでIAMロールを明示的許可(上述)
    • IAMポリシー:アクセスポイントへの明示的許可と S3バケットへの明示的許可
  • IAMロールとアクセスポイントが同じアカウント、S3が別アカウント
    • S3バケットポリシー:アクセスポイント経由のアクセスを許可(ただしアカウントIDはアクセスポイントが存在するアカウントのIDを記入する)
    • アクセスポイントポリシー:PrincipalでIAMロールを明示的許可(クロスアカウントのアクセスポリシーを作成する必要あり)
    • IAMポリシー:アクセスポイントへの明示的許可と S3バケットへの明示的許可

その先にあるS3バケットへの許可を忘れていてハマりました。

もうこれで忘れることはないと信じています。

Discussion