S3 で特定の IAM ユーザーと IAM ロールからのアクセスのみに制限するバケットポリシーを教えてください

S3 のバケットポリシーで特定の IAM ユーザーと IAM ロールのみアクセスを許可し、それ以外を拒否する書き方をご紹介します。
2023.11.07

困っていた内容

S3 バケットに対して、ある特定の IAM ユーザーと IAM ロールからのアクセスのみを許可し、それ以外からのアクセスを拒否したい要件があります。 これを実現できるバケットポリシーを教えてください。

どう対応すればいいの?

下記のバケットポリシーで実現できます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": "arn:aws:iam::[アカウントID]:user/[IAMユーザー名]"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::[バケット名]",
                "arn:aws:s3:::[バケット名]/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:userId": [
                        "[IAMロールのロールID]:*"
                    ]
                }
            }
        }
    ]
}

※ Condition句に記述する IAM ロールのロールIDは、下記コマンドを実行した出力結果の RoleId で確認できます。

aws iam get-role --role-name [IAMロール名]

補足

このような「バケットポリシーで、ある特定の IAM ユーザーと IAM ロール、両方からのアクセスのみを許可したい」という要件はよくあると思います。

しかしながら上記のように「IAM ユーザーは NotPrincipal 句でARNを指定し、IAM ロールは RoleId を調べて Condition 句でIDを指定する」という違いがあるのは意外と盲点で、この両方を満たせる設定例がドキュメント等にも見当たらなかったため、備忘として記事にしました。

この情報がどなたかのお役に立てば幸いです!

参考資料

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。