[アップデート] Amazon S3 の汎用バケットが ABAC に対応しました

[アップデート] Amazon S3 の汎用バケットが ABAC に対応しました

2025.11.22

Amazon S3 の汎用バケットが ABAC に対応しました。

これまでもオブジェクトは ABAC に対応してしましたが、バケット内のすべてのオブジェクトを ABAC でアクセス制御したい場合は、各オブジェクトにタグの付与が必要でした。今回のアップデートでは、バケットのタグを利用してバケット内のオブジェクト操作やバケットのプロパティの変更等の操作ができるようになりました。

What's New のページです。

https://aws.amazon.com/about-aws/whats-new/2025/11/amazon-s3-attribute-based-access-control/

AWS のブログでも紹介されています。

https://aws.amazon.com/blogs/aws/introducing-attribute-based-access-control-for-amazon-s3-general-purpose-buckets/

AWS ユーザーガイドは次のページが該当します。本ブログ執筆時点では英語のページのみです。

https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html

試してみた

Amazon S3 の汎用バケットのタグを用いた ABAC によるアクセス制御を下記イメージ図の構成で試してみます。

amazon-s3-attribute-based-access-control-2

S3 バケットの ABAC を有効化

S3 バケットの ABAC を利用するためには、バケットのプロパティから「バケット ABAC」設定を有効化する必要があります。この設定は S3 バケット毎に必要です。

amazon-s3-attribute-based-access-control-1

AWS CLI を用いて S3 バケットの ABAC を有効化することもでき、put-bucket-abac コマンドで設定します。

aws s3api put-bucket-abac \
  --bucket <your-bucket-name> \
  --abac-status Status=Enabled

バケット ABAC の設定内容を確認するコマンドです。

aws s3api get-bucket-abac \
  --bucket <your-bucket-name>

バケット ABAC の設定内容を確認するコマンドの実行結果例です。

$ aws s3api get-bucket-abac \
>   --bucket <your-bucket-name>
{
    "AbacStatus": {
        "Status": "Enabled"
    }
}

なお、今回検証した AWS CloudShell 環境では、AWS CLI が put-bucket-abac コマンドに対応していなかったため AWS CLI をバージョンアップしました。バージョンアップ前のバージョンは下記です。

$ aws --version
aws-cli/2.31.39 Python/3.13.9 Linux/6.1.156-177.286.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

次のコマンドで AWS CLI をバージョンアップします。

cd /tmp/
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update

バージョンアップ後のバージョンです。

$ aws --version
aws-cli/2.32.3 Python/3.13.9 Linux/6.1.156-177.286.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

ABAC を利用したポリシーの設定

IAM ロールと S3 バケットに Project タグを付与し、バケット ABAC 設定を変えた下表の 3 パターンのバケットを用意して試してみます。

バケット名 バケット ABAC の有効化 タグ
test-on-aaa-20251122 有効 Project: aaa
test-on-bbb-20251122 有効 Project: bbb
test-off-aaa-20251122 無効 Project: aaa

IAM ロールには、下記の IAM ポリシーを許可ポリシーとして割り当てます。1つ目のステートメントは ABAC に関係なく、S3 のリスト権限を与えています。2つ目のステートメントでは、リソース(今回は S3 バケット)とプリンシパル(今回は IAM ロール)の Project タグの値が一致する条件を Condition で指定しています。Action ではオブジェクトのアップロードやダウンロードの権限を与えています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Project": "${aws:PrincipalTag/Project}"
                }
            }
        }
    ]
}

動作確認

想定通り、オブジェクトのアップロード・ダウンロード操作の可否は下記の結果となりました。

バケット名 バケット ABAC の有効化 タグ オブジェクトのアップロード・ダウンロード操作の可否
test-on-aaa-20251122 有効 Project: aaa 可能
test-on-bbb-20251122 有効 Project: bbb 不可能
test-off-aaa-20251122 無効 Project: aaa 不可能

test-on-aaa-20251122 へのオブジェクトアップロードは成功です。

$ aws s3 cp upload.txt s3://test-on-aaa-20251122/
upload: ./upload.txt to s3://test-on-aaa-20251122/upload.txt

test-on-aaa-20251122 からのオブジェクトダウンロードは成功です。

$ aws s3 cp s3://test-on-aaa-20251122/download.txt .
download: s3://test-on-aaa-20251122/download.txt to ./download.txt

test-on-bbb-20251122 へのオブジェクトアップロードは失敗です。

$ aws s3 cp upload.txt s3://test-on-bbb-20251122/
upload failed: ./upload.txt to s3://test-on-bbb-20251122/upload.txt An error occurred (AccessDenied) when calling the PutObject operation: User: arn:aws:sts::590183782799:assumed-role/test-abac-role/test-user is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::test-on-bbb-20251122/upload.txt" because no identity-based policy allows the s3:PutObject action

test-on-bbb-20251122 からのオブジェクトダウンロードは失敗です。

$ aws s3 cp s3://test-on-bbb-20251122/download.txt .
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

test-off-aaa-20251122 へのオブジェクトアップロードは失敗です。S3 バケットの ABAC が無効なためです。

$ aws s3 cp upload.txt s3://test-off-aaa-20251122/
upload failed: ./upload.txt to s3://test-off-aaa-20251122/upload.txt An error occurred (AccessDenied) when calling the PutObject operation: User: arn:aws:sts::590183782799:assumed-role/test-abac-role/test-user is not authorized to perform: s3:PutObject on resource: "arn:aws:s3:::test-off-aaa-20251122/upload.txt" because no identity-based policy allows the s3:PutObject action

test-off-aaa-20251122 からのオブジェクトダウンロードは失敗です。同様に S3 バケットの ABAC が無効なためです。

$ aws s3 cp s3://test-off-aaa-20251122/download.txt .
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden

なお、test-on-bbb-20251122 へのオブジェクトアップロード失敗はマネジメントコンソールでは次のような見え方になります。

amazon-s3-attribute-based-access-control-3

ダウンロード失敗は次のような見え方です。

amazon-s3-attribute-based-access-control-4

さいごに

汎用 S3 バケットが ABAC に対応しました。個人的には待望のアップデートでした。
以前は、オブジェクトにタグ付けせずに汎用バケットのタグでアクセス制御したいときは、IAM ロールのタグの値とバケット名の部分一致で実現する方法もありました。この場合は、作成後に変更できないバケット名の命名を厳密にする必要がありました。今回のアップデートで柔軟性が向上しました。

https://dev.classmethod.jp/articles/amazon-s3-abac/

なお、IAM ロールに割り当てる許可ポリシーにおいて、下記のように Action で S3 のすべての権限を与えてみたところ、プロパティの変更やライフライクルルールの変更もできました。ABAC を無効化することもできたのですが、無効化した後は操作できなくなりました。ワイルドカードを利用することで、どのような権限が与えらているのか把握しづらくなりますが、ざっくりバケット毎に権限を分けたいときはこのような記載も役立ちそうです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:List*",
                "s3:GetBucketLocation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/Project": "${aws:PrincipalTag/Project}"
                }
            }
        }
    ]
}

この記事をシェアする

FacebookHatena blogX

関連記事