AWS CLI で全ての S3 汎用バケットの ABAC 設定を一括で有効化してみた
Amazon S3 の汎用バケットが ABAC に対応しました。ABAC を利用するためにはバケット毎に ABAC 設定を有効化する必要があります。既存の全ての汎用バケットを対象に ABAC でアクセス制御したい状況を想定して、AWS アカウント内の汎用バケットの ABAC 設定を一括で有効化する AWS CLI を試してみます。
本ブログでは、AWS CLI でアカウント内の汎用バケットに対して次の操作を試してみます。
- 全ての汎用バケットの ABAC 設定を確認
- 全ての汎用バケットの ABAC を有効化
- 全ての汎用バケットの ABAC を無効化
- ABAC 設定が無効になっている汎用バケットを確認
なお、執筆時点における私の AWS CloudShell 環境では、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 CLI のバージョンアップの詳細についてはユーザーガイドをご参照ください。
全ての汎用バケットの ABAC 設定を確認
汎用バケットの ABAC 設定の確認は次のコマンドで確認できます。
単一のバケットの ABAC 設定を確認したい場合は次のコマンドとなります。
aws s3api get-bucket-abac \
--bucket <your-bucket-name>
AWS アカウント内の全ての汎用バケット一覧を取得して、各バケットの設定を確認する場合は次のコマンド例です。
aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
| while read bucket; do
echo "### Get bucket abac for ${bucket}"
aws s3api get-bucket-abac \
--bucket ${bucket}
done
実行結果例です。
Status が Enabled の場合は ABAC が有効状態、Disabled の場合は ABAC が無効状態を示します。
$ aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
> | while read bucket; do
> echo "### Get bucket abac for ${bucket}"
> aws s3api get-bucket-abac \
> --bucket ${bucket}
> done
### Get bucket abac for audit-test-20230120-1
{
"AbacStatus": {
"Status": "Enabled"
}
}
### Get bucket abac for audit-test-20230120-2
{
"AbacStatus": {
"Status": "Enabled"
}
}
### Get bucket abac for audit-test-20230120-3
{
"AbacStatus": {
"Status": "Enabled"
}
}
### Get bucket abac for audit-test-20230120-4
{
"AbacStatus": {
"Status": "Disabled"
}
}
### Get bucket abac for audit-test-20230120-5
{
"AbacStatus": {
"Status": "Disabled"
}
}
全ての汎用バケットの ABAC を有効化
汎用バケットの ABAC 設定を変更するコマンドは次のコマンドです。
単一のバケットの ABAC 設定を有効にしたい場合は次のコマンドとなります。
aws s3api put-bucket-abac \
--bucket <your-bucket-name> \
--abac-status Status=Enabled
AWS アカウント内の全ての汎用バケットの ABAC 設定を有効にするコマンド例です。
aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
| while read bucket; do
echo "### Enable bucket abac for ${bucket}"
aws s3api put-bucket-abac \
--bucket ${bucket} \
--abac-status Status=Enabled
done
実行結果例です。
エラーが出力されなければ、ABAC が有効化されています。
$ aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
> | while read bucket; do
> echo "### Enable bucket abac for ${bucket}"
> aws s3api put-bucket-abac \
> --bucket ${bucket} \
> --abac-status Status=Enabled
> done
### Enable bucket abac for audit-test-20230120-1
### Enable bucket abac for audit-test-20230120-2
### Enable bucket abac for audit-test-20230120-3
### Enable bucket abac for audit-test-20230120-4
### Enable bucket abac for audit-test-20230120-5
全ての汎用バケットの ABAC を無効化
単一のバケットの ABAC 設定を無効にしたい場合は次のコマンドとなります。
aws s3api put-bucket-abac \
--bucket <your-bucket-name> \
--abac-status Status=Disabled
AWS アカウント内の全ての汎用バケットの ABAC 設定を有効にするコマンド例です。
aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
| while read bucket; do
echo "### Disable bucket abac for ${bucket}"
aws s3api put-bucket-abac \
--bucket ${bucket} \
--abac-status Status=Disabled
done
実行結果例です。
エラーが出力されなければ、ABAC が無効化されています。
$ aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
> | while read bucket; do
> echo "### Disable bucket abac for ${bucket}"
> aws s3api put-bucket-abac \
> --bucket ${bucket} \
> --abac-status Status=Disabled
> done
### Disable bucket abac for audit-test-20230120-1
### Disable bucket abac for audit-test-20230120-2
### Disable bucket abac for audit-test-20230120-3
### Disable bucket abac for audit-test-20230120-4
### Disable bucket abac for audit-test-20230120-5
ABAC 設定が無効になっている汎用バケットを確認
アカウント内の汎用バケットのうち、ABAC が無効になっているバケットを取得するコマンド例です。全てのバケットを ABAC 設定を確認して、Status が Disabled のバケットのみ出力しています。
aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
| while read bucket; do
status=$(aws s3api get-bucket-abac --bucket ${bucket} --query 'AbacStatus.Status' --output text)
if [ "$status" = "Disabled" ]; then
echo "ABAC disabled bucket: ${bucket}"
fi
done
実行結果例です。
Status が Disabled のバケットのみ、バケット名が出力されます。
$ aws s3api list-buckets --query 'Buckets[*].[Name]' --output text \
> | while read bucket; do
> status=$(aws s3api get-bucket-abac --bucket ${bucket} --query 'AbacStatus.Status' --output text)
> if [ "$status" = "Disabled" ]; then
> echo "ABAC disabled bucket: ${bucket}"
> fi
> done
ABAC disabled bucket: audit-test-20230120-4
ABAC disabled bucket: audit-test-20230120-5
さいごに
既存の S3 汎用バケットを対象に ABAC でアクセス制御したい状況を想定して、AWS アカウント内の汎用バケットの ABAC 設定を一括で有効化する AWS CLI を試してみました。
ABAC 設定が無効になっているバケットの確認では、分かりに AWS Config ルールで検出する方法もあるかと考えていましたが、AWS Config における S3 バケットの情報には ABAC 設定に関する情報が記録されていないようでした。見逃しているだけの可能性がありますが、今後のバージョンアップで対応された場合には改めて確認してみたいと思いました。
以上、このブログがどなたかのご参考になれば幸いです。






