はじめに
本稿では、Amazon S3に設定するアカウントレベルのブロックパブリックアクセス設定の挙動について記載します。
Amazon S3のユーザーガイドには、以下の記載があります。
アカウントレベルの設定は、個々のオブジェクトの設定よりも優先されます。
パブリックアクセスをブロックするようにアカウントを設定すると、アカウント内の
個々のオブジェクトに対して行われたパブリックアクセスの設定が上書きされます。
組織レベルのポリシーがアクティブな場合、アカウントレベルの設定は自動的に組織ポリシーから継承され、直接変更することはできません。
「個々のオブジェクトに対して行われたパブリックアクセスの設定が上書きされます」、
これは、既存のS3バケットの設定が上書きされてしまうようにも見えてしまいます。
この記述だけでは実際の挙動をイメージしづらかったため、実際に検証してみました。
1. パブリックアクセスを許可する設定でS3バケットを作成
まず、S3バケットをパブリックに公開する設定で作成します。
アカウントレベルでは、S3のブロックパブリックアクセスが無効の状態で、S3バケットを作っていきます。
ブロックパブリックアクセスの設定状況は、aws s3control get-public-access-block コマンドで確認します。
~ $ aws s3control get-public-access-block --account-id 123456789012
{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": false,
"IgnorePublicAcls": false,
"BlockPublicPolicy": false,
"RestrictPublicBuckets": false
}
}
~ $
S3バケットを作成します。
S3バケット作成は、aws s3api create-bucket を使用します。
~ $ aws s3api create-bucket \
> --bucket test-20260709-01 \
> --region ap-northeast-1 \
> --create-bucket-configuration LocationConstraint=ap-northeast-1
{
"Location": "http://test-20260709-01.s3.amazonaws.com/",
"BucketArn": "arn:aws:s3:::test-20260709-01"
}
~ $
S3バケット作成後、バケットに対するブロックパブリックアクセスの状況を確認します。
ブロックパブリックアクセスが有効状態でしたので、無効に変更します。
~ $ aws s3api get-public-access-block --bucket test-20260709-01
{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}
~ $
S3バケットのブロックパブリックアクセスを無効化します。
無効化は、aws s3api put-public-access-block コマンドを使用します。
~ $ aws s3api put-public-access-block \
> --bucket test-20260709-01 \
> --public-access-block-configuration \
> BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false
~ $
上記のコマンドで、S3バケットのブロックパブリックアクセスを無効化できました。
~ $ aws s3api get-public-access-block --bucket test-20260709-01
{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": false,
"IgnorePublicAcls": false,
"BlockPublicPolicy": false,
"RestrictPublicBuckets": false
}
}
~ $
この後、S3バケットを公開するためのバケットポリシーを設定します。
2. S3バケットを公開するバケットポリシーを設定
以下のバケットポリシーをS3バケットに設定します。
このバケットポリシーを設定することで、インターネットからS3バケットのオブジェクトにアクセスできるようになります。
まず、バケットポリシーのファイルを作成します。
~ $ cat<<EOF>>public-policy.json
> {
> "Version": "2012-10-17",
> "Statement": [
> {
> "Sid": "AllowPublicRead",
> "Effect": "Allow",
> "Principal": "*",
> "Action": "s3:GetObject",
> "Resource": "arn:aws:s3:::test-20260709-01/*"
> }
> ]
> }
> EOF
aws s3api put-bucket-policy コマンドで、S3バケットに対して、作成したバケットポリシーを設定します。
aws s3api get-bucket-policy-status コマンドで、ポリシーの状況を確認します。
この時点で、バケットポリシー上はインターネットからアクセス可能な状態になりました。
~ $ aws s3api put-bucket-policy \
> --bucket test-20260709-01 \
> --policy file://public-policy.json
~ $
~ $ aws s3api get-bucket-policy-status --bucket test-20260709-01
{
"PolicyStatus": {
"IsPublic": true
}
}
~ $
3. インターネットからS3バケットのオブジェクトにアクセス
3.1 ブロックパブリックアクセスが無効時:アクセス成功
テストデータを作成して、S3バケットにアップロードします。
~ $ echo TEST > test.log
~ $
~ $ cat test.log
TEST
~ $
~ $ aws s3 cp test.log s3://test-20260709-01/test.log
upload: ./test.log to s3://test-20260709-01/test.log
~ $
インターネットからS3内のオブジェクトにアクセスします。
現状は、以下のいずれも無効の状態です。
- アカウントレベルのブロックパブリックアクセス:無効
- S3バケットのブロックパブリックアクセス:無効
- S3バケットのバケットポリシー:公開
curl コマンドで S3バケット内のオブジェクトにアクセスすると、データが出力されました。
~ $ curl -i https://test-20260709-01.s3.ap-northeast-1.amazonaws.com/test.log
HTTP/1.1 200 OK
(中略)
Server: AmazonS3
TEST
~ $
この後、アカウントレベルのブロックパブリックアクセスを有効化します。
3.2 ブロックパブリックアクセスを有効化時:アクセス禁止
aws s3control put-public-access-block で、ブロックパブリックアクセスを有効化します。
--account-id で、アカウントレベルでブロックパブリックアクセスを有効化します。
~ $ aws s3control put-public-access-block \
> --account-id 123456789012 \
> --public-access-block-configuration \
> BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true
~ $
アカウントレベルで、S3のブロックパブリックアクセスが有効化されました。
~ $ aws s3control get-public-access-block --account-id 123456789012
{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}
~ $
S3バケット単位では、S3のブロックパブリックアクセスは無効のままです。
~ $ aws s3api get-public-access-block --bucket test-20260709-01
{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": false,
"IgnorePublicAcls": false,
"BlockPublicPolicy": false,
"RestrictPublicBuckets": false
}
}
~ $
S3バケットのバケットポリシーは、公開する設定のままです。
~ $ aws s3api get-bucket-policy-status --bucket test-20260709-01
{
"PolicyStatus": {
"IsPublic": true
}
}
~ $
この状態で、インターネットからS3内のオブジェクトにアクセスします。
現状は、以下の状態です。
- アカウントレベルのブロックパブリックアクセス:有効
- S3バケットのブロックパブリックアクセス:無効
- S3バケットのバケットポリシー:公開
この状態で、インターネットからS3バケット内のオブジェクトへのアクセスが、以下の通り禁止されたことを確認できました。
~ $ curl -i https://test-20260709-01.s3.ap-northeast-1.amazonaws.com/test.log
HTTP/1.1 403 Forbidden
(中略)
Server: AmazonS3
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>5G5F8GPMY82G5QNV</RequestId><HostId>voqPuMYHoWs32qTPExA857Gmpefz09G8KM56vZodzfnCZiZqSpxhU2ZREBMoMBYA+oO0nv+w1rU=</HostId></Error>~ $
~ $
おわりに
本稿では、ユーザーガイドの以下の記述について、実際の挙動を確認してみました。
アカウントレベルの設定は、個々のオブジェクトの設定よりも優先されます。
パブリックアクセスをブロックするようにアカウントを設定すると、
アカウント内の個々のオブジェクトに対して行われたパブリックアクセスの設定が
上書きされます。
この「上書き」という文言がいまいちわからなかったのですが、
実際に挙動を確かめてみたところ、
アカウントレベルのブロックパブリックアクセスを有効にすることで、
S3バケットのブロックパブリックアクセスの設定は上書きされることなく無効のまま、
インターネットからのアクセスが禁止される、ということがわかりました。
こういった、AWSの内部の動きを理解するためには、AWS CLI は便利です。
AWS CLI は AWS の内部挙動やAPIの動作を理解するための有効な手段だと思います。
昨今は AWS CLI を扱う記事が少ないですが、今後も折を見て、
AWS CLI を使った記事を書いていきたいと思います。
この投稿が皆様のご参考になれば幸いです。