S3 汎用バケット ABAC の有効化前後でタグ操作コマンドが変わることを確認してみた
はじめに
クラウド事業本部コンサルティング部の山﨑です。
S3 汎用バケットで ABAC を有効化すると、バケットタグをアクセス制御の条件として利用できます。
一方で、AWS 公式ドキュメントには、S3 汎用バケットで ABAC を有効化した場合、バケットタグの追加・削除に使用する API が変わることが記載されています。
ABAC を有効にすると、以前にバケットへのタグの追加やバケットからのタグの削除に使用したアクセス許可、PutBucketTagging または DeleteBucketTagging は機能しなくなります。代わりに、TagResource および UntagResource API を使用してこれらのタスクを実行します。
参考: https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html
今回は、S3 汎用バケットの ABAC について、以下を確認しました。
- ABAC の有効化・無効化には
s3:PutBucketAbac権限が必要であること - ABAC 有効化前は
aws s3api put-bucket-tagging/aws s3api delete-bucket-taggingが使えること - ABAC 有効化後は
aws s3api put-bucket-tagging/aws s3api delete-bucket-taggingが使えなくなること - ABAC 有効化後は
aws s3control tag-resource/aws s3control untag-resourceを使うこと
結論
今回の検証結果は以下です。
| ABAC 状態 | 操作 | コマンド | 結果 |
|---|---|---|---|
| 無効 | タグ追加 | aws s3api put-bucket-tagging |
成功 |
| 無効 | タグ削除 | aws s3api delete-bucket-tagging |
成功 |
| 無効 | ABAC 有効化 | aws s3api put-bucket-abac |
s3:PutBucketAbac 権限なしでは失敗 |
| 無効 | ABAC 有効化 | aws s3api put-bucket-abac |
s3:PutBucketAbac 権限ありでは成功 |
| 有効 | タグ追加 | aws s3api put-bucket-tagging |
失敗 |
| 有効 | タグ削除 | aws s3api delete-bucket-tagging |
失敗 |
| 有効 | タグ追加 | aws s3control tag-resource |
成功 |
| 有効 | タグ削除 | aws s3control untag-resource |
成功 |
| 有効 | ABAC 無効化 | aws s3api put-bucket-abac |
s3:PutBucketAbac 権限なしでは失敗 |
| 有効 | ABAC 無効化 | aws s3api put-bucket-abac |
s3:PutBucketAbac 権限ありでは成功 |
ポイントは、ABAC 有効化後はタグ操作に使うコマンドが変わることです。
ABAC 無効時:
aws s3api put-bucket-tagging
aws s3api delete-bucket-tagging
ABAC 有効時:
aws s3control tag-resource
aws s3control untag-resource
検証環境
| ロール | 用途 |
|---|---|
example-s3-abac-command-no-put-role |
s3:PutBucketAbac 権限なし |
example-s3-abac-command-full-role |
s3:PutBucketAbac 権限あり |
example-s3-abac-command-no-put-role のポリシー
s3:PutBucketAbac は付与していません。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3BucketTagTestWithoutPutBucketAbac",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketAbac",
"s3:GetBucketTagging",
"s3:PutBucketTagging",
"s3:TagResource",
"s3:UntagResource",
"s3:ListTagsForResource"
],
"Resource": "arn:aws:s3:::example-s3-abac-command-bucket"
}
]
}
example-s3-abac-command-full-role のポリシー
s3:PutBucketAbac を追加しました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3BucketAbacAndTagTest",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetBucketAbac",
"s3:PutBucketAbac",
"s3:GetBucketTagging",
"s3:PutBucketTagging",
"s3:TagResource",
"s3:UntagResource",
"s3:ListTagsForResource"
],
"Resource": "arn:aws:s3:::example-s3-abac-command-bucket"
}
]
}
初期状態確認
まず、example-s3-abac-command-full-role に AssumeRole して、ABAC の状態を確認します。
aws s3api get-bucket-abac \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"AbacStatus": {
"Status": "Disabled"
}
}
初期状態では ABAC が無効です。
バケットタグも確認します。
aws s3api get-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
aws: [ERROR]: An error occurred (NoSuchTagSet) when calling the GetBucketTagging operation: The TagSet does not exist
初期状態ではタグは存在しませんでした。
検証 1: ABAC 無効時のタグ操作
ABAC 無効状態で、aws s3api put-bucket-tagging を使ってタグを付与します。
aws s3api put-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--tagging 'TagSet=[{Key=Environment,Value=dev}]' \
--region ap-northeast-1
タグを確認します。
aws s3api get-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"TagSet": [
{
"Key": "Environment",
"Value": "dev"
}
]
}
Environment=dev タグを付与できました。
次に、aws s3api delete-bucket-tagging でタグを削除します。
aws s3api delete-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
削除後にタグを確認します。
aws s3api get-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
aws: [ERROR]: An error occurred (NoSuchTagSet) when calling the GetBucketTagging operation: The TagSet does not exist
タグが削除されました。
この結果から、ABAC 無効状態では以下のコマンドでタグ操作できることを確認できました。
aws s3api put-bucket-tagging
aws s3api delete-bucket-tagging
検証 2: ABAC 有効化の権限確認
s3:PutBucketAbac 権限なしの場合
次に、s3:PutBucketAbac 権限を持たない example-s3-abac-command-no-put-role で ABAC を有効化してみます。
aws s3api put-bucket-abac \
--bucket example-s3-abac-command-bucket \
--abac-status Status=Enabled \
--region ap-northeast-1
実行結果です。
aws: [ERROR]: An error occurred (AccessDenied) when calling the PutBucketAbac operation: User: arn:aws:sts::123456789012:assumed-role/example-s3-abac-command-no-put-role/example-s3-abac-command-no-put-session is not authorized to perform: s3:PutBucketAbac on resource: "arn:aws:s3:::example-s3-abac-command-bucket" because no identity-based policy allows the s3:PutBucketAbac action
s3:PutBucketAbac 権限がないため、AccessDenied になりました。
ABAC 状態を確認します。
aws s3api get-bucket-abac \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"AbacStatus": {
"Status": "Disabled"
}
}
ABAC は無効のままでした。
s3:PutBucketAbac 権限ありの場合
次に、s3:PutBucketAbac 権限を持つ example-s3-abac-command-full-role で ABAC を有効化します。
aws s3api put-bucket-abac \
--bucket example-s3-abac-command-bucket \
--abac-status Status=Enabled \
--region ap-northeast-1
ABAC 状態を確認します。
aws s3api get-bucket-abac \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"AbacStatus": {
"Status": "Enabled"
}
}
ABAC を有効化できました。
この結果から、ABAC の有効化には s3:PutBucketAbac 権限が必要であることを確認できました。
検証 3: ABAC 有効時の従来タグ操作
ABAC 有効化後に、従来の aws s3api put-bucket-tagging を実行します。
aws s3api put-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--tagging 'TagSet=[{Key=Environment,Value=prod}]' \
--region ap-northeast-1
実行結果です。
aws: [ERROR]: An error occurred (BadRequest) when calling the PutBucketTagging operation: This S3 general purpose bucket has attribute-based access control (ABAC) enabled. To add tags to this bucket, initiate a TagResource request. To delete tags from this bucket, initiate an UntagResource request.
ABAC 有効化後は、aws s3api put-bucket-tagging によるタグ追加は失敗しました。
続いて、aws s3api delete-bucket-tagging も実行します。
aws s3api delete-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
aws: [ERROR]: An error occurred (BadRequest) when calling the DeleteBucketTagging operation: This S3 general purpose bucket has attribute-based access control (ABAC) enabled. To delete tags from this bucket, initiate an UntagResource request.
ABAC 有効化後は、aws s3api delete-bucket-tagging によるタグ削除も失敗しました。
検証 4: ABAC 有効時の s3control によるタグ操作
ABAC 有効化後は、aws s3control tag-resource でタグを付与します。
aws s3control tag-resource \
--account-id 123456789012 \
--resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
--tags '[{"Key":"Environment","Value":"prod"},{"Key":"ManagedBy","Value":"iac"}]' \
--region ap-northeast-1
タグを確認します。
aws s3control list-tags-for-resource \
--account-id 123456789012 \
--resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"Tags": [
{
"Key": "Environment",
"Value": "prod"
},
{
"Key": "ManagedBy",
"Value": "iac"
}
]
}
Environment=prod と ManagedBy=iac を付与できました。
次に、aws s3control untag-resource で Environment タグだけを削除します。
aws s3control untag-resource \
--account-id 123456789012 \
--resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
--tag-keys '["Environment"]' \
--region ap-northeast-1
削除後のタグを確認します。
aws s3control list-tags-for-resource \
--account-id 123456789012 \
--resource-arn arn:aws:s3:::example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"Tags": [
{
"Key": "ManagedBy",
"Value": "iac"
}
]
}
Environment タグだけが削除され、ManagedBy=iac は残りました。
この結果から、ABAC 有効化後は以下のコマンドでタグ操作できることを確認できました。
aws s3control tag-resource
aws s3control untag-resource
検証 5: ABAC 無効化の権限確認
s3:PutBucketAbac 権限なしの場合
次に、s3:PutBucketAbac 権限を持たない example-s3-abac-command-no-put-role で ABAC を無効化してみます。
aws s3api put-bucket-abac \
--bucket example-s3-abac-command-bucket \
--abac-status Status=Disabled \
--region ap-northeast-1
実行結果です。
aws: [ERROR]: An error occurred (AccessDenied) when calling the PutBucketAbac operation: User: arn:aws:sts::123456789012:assumed-role/example-s3-abac-command-no-put-role/example-s3-abac-command-no-put-session is not authorized to perform: s3:PutBucketAbac on resource: "arn:aws:s3:::example-s3-abac-command-bucket" because no identity-based policy allows the s3:PutBucketAbac action
ABAC 有効化時と同様に、AccessDenied になりました。
ABAC 状態を確認します。
aws s3api get-bucket-abac \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"AbacStatus": {
"Status": "Enabled"
}
}
ABAC は有効のままでした。
この結果から、ABAC の無効化にも s3:PutBucketAbac 権限が必要であることを確認できました。
s3:PutBucketAbac 権限ありの場合
最後に、s3:PutBucketAbac 権限を持つ example-s3-abac-command-full-role で ABAC を無効化します。
aws s3api put-bucket-abac \
--bucket example-s3-abac-command-bucket \
--abac-status Status=Disabled \
--region ap-northeast-1
ABAC 状態を確認します。
aws s3api get-bucket-abac \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"AbacStatus": {
"Status": "Disabled"
}
}
ABAC を無効化できました。
最後にタグ状態を確認します。
aws s3api get-bucket-tagging \
--bucket example-s3-abac-command-bucket \
--region ap-northeast-1
実行結果です。
{
"TagSet": [
{
"Key": "ManagedBy",
"Value": "iac"
}
]
}
ABAC を無効化しても、既存のバケットタグ自体は残っていました。
検証結果まとめ
今回の検証結果をまとめます。
ABAC 設定変更権限
| 実行ロール | s3:PutBucketAbac |
ABAC 有効化 | ABAC 無効化 |
|---|---|---|---|
example-s3-abac-command-no-put-role |
なし | 失敗 | 失敗 |
example-s3-abac-command-full-role |
あり | 成功 | 成功 |
ABAC の有効化・無効化には、どちらも s3:PutBucketAbac 権限が必要でした。
タグ操作コマンド
| ABAC 状態 | タグ追加 | タグ削除 | 結果 |
|---|---|---|---|
| 無効 | aws s3api put-bucket-tagging |
aws s3api delete-bucket-tagging |
成功 |
| 有効 | aws s3api put-bucket-tagging |
aws s3api delete-bucket-tagging |
失敗 |
| 有効 | aws s3control tag-resource |
aws s3control untag-resource |
成功 |
ABAC 有効化後は、従来の aws s3api put-bucket-tagging / aws s3api delete-bucket-tagging ではタグ操作できず、aws s3control tag-resource / aws s3control untag-resource を使う必要がありました。
おわりに
S3 汎用バケットの ABAC を有効化すると、バケットタグを認可条件として利用できるようになります。
一方で、ABAC 有効化後はタグ操作に使うコマンドが変わるため、既存の運用手順やスクリプトには注意が必要です。
今回の検証では、ABAC 有効化前後で以下のようにコマンドを使い分ける必要があること、ABAC の有効化・無効化には s3:PutBucketAbac 権限が必要であり、権限がないロールではどちらも AccessDenied になることを確認できました。
ABAC 無効時:
aws s3api put-bucket-tagging
aws s3api delete-bucket-tagging
ABAC 有効時:
aws s3control tag-resource
aws s3control untag-resource
S3 汎用バケットで ABAC を使う場合は、タグを認可条件として利用する点だけでなく、タグ操作コマンドと ABAC 設定変更権限もあわせて確認しておくのがよさそうです。






