コンテンツにスキップ

S3 ポリシー(宣言型)

検証日: 2026-04-12 / リージョン: ap-northeast-1

このページの位置づけ

宣言型ポリシーS3_POLICY タイプの検証ページ。S3 の Block Public Access(BPA)をアカウントレベルで強制する。

本ページの目的は、Security Hub の 5 つの S3 コントロール(S3.2 / S3.3 / S3.6 / S3.8 / S3.19)に対して S3 ポリシーがどう影響するかを実機検証することである。併せて S3 ポリシー固有の挙動(BPA 変更操作のブロック、デタッチ時の復元)も確認する。

宣言型ポリシー一般の概念(SCP / RCP との違い、Control Tower との関係、デタッチ時に元のアカウントレベル設定に復元する挙動など)は 宣言型ポリシー を参照。

S3 ポリシーの仕様

BPA 階層と S3 ポリシーの作用先

S3 の BPA は 4 階層で設定でき、S3 はリクエストに対して全階層の BPA 設定を評価し、いずれかがブロックを示していればリクエストを拒否する(公式ドキュメント)。S3 ポリシーが各階層にどう作用するかは以下の通り。

階層粒度S3 ポリシーの作用
組織レベル(S3 ポリシー、本ページ)OU / アカウント単位ここで設定する
アカウントレベル BPAアカウント単位強制的に有効化される
バケットレベル BPAバケット単位非作用(自由に変更可能)
アクセスポイントレベル BPAアクセスポイント単位(作成時のみ設定可)非作用(自由に変更可能)

つまり S3 ポリシーは「設定する場所(組織レベル)」と「作用する場所(アカウントレベル)」が異なる。

  • バケットレベル BPA / アクセスポイントレベル BPA は S3 ポリシーの影響を受けず、アカウント管理者が変更可能
  • ただし実際のアクセス制御は全階層の最も制限的な設定が適用される。アカウントレベル BPA が S3 ポリシーで有効化されている状態では、バケットレベル BPA / アクセスポイントレベル BPA を無効化しても実効的なパブリックアクセスはブロックされる
  • 一方 Security Hub の S3.8 / S3.19 はバケットレベル BPA / アクセスポイントレベル BPA の設定値を直接チェックするため NON_COMPLIANT のまま。CSPM 判定と実アクセス制御に乖離が生じる(検証マトリクス 参照)

S3 ポリシー固有の挙動

観点内容
設定形式all(全有効)または none(無効)の二択。BPA 4 設定の個別指定は不可
作用する BPA レベルアカウントレベルのみ
アタッチ時の挙動アカウントレベル BPA を 4 設定すべて true に上書き
保護される操作アカウントレベル BPA の変更は AccessDenied、パブリックポリシーの設定は AccessDenied
保護されない操作(API 呼び出しは成功)バケットレベル BPA / アクセスポイントレベル BPA の変更(ただし実効的なアクセス制御には影響しない。アカウントレベル BPA が最も制限的として優先されるため)

上記の各項目は 検証 2: 設定変更ブロック確認 で実機検証済み。

デタッチ時の挙動(元のアカウントレベル設定に復元)は宣言型ポリシー一般の共通挙動のため、宣言型ポリシー を参照。本ページでは「検証 3」で未設定からの復元と手動設定からの復元の 2 ケースを実機確認する。

ポリシー形式

{
    "s3_attributes": {
        "public_access_block_configuration": {
            "@@assign": "all"
        }
    }
}

@@assign は宣言型ポリシー全般で使われる operator(詳細は 宣言型ポリシー: ポリシー構文の基礎 を参照)。S3 ポリシー固有の仕様として、@@assign の値は "all" または "none" の 2 つのみである。BPA 4 設定(BlockPublicAcls / IgnorePublicAcls / BlockPublicPolicy / RestrictPublicBuckets)を個別に true / false に指定することはできない(公式ドキュメントに明記)。

  • "all" は BPA 4 設定すべてを true に設定する
  • "none" は BPA 4 設定すべてを false に設定する

BPA 4 設定自体の詳細は S3.2 / S3.3 の BPA 評価ロジック検証 を参照。

検証で確かめたいこと

以下を実機で確認する。

  1. 5 つの S3 Security Hub コントロールへの影響: S3 ポリシーをアタッチすると、各コントロールの finding(FAILED 状態)はどう変化するか
  2. BPA 変更操作のブロック: アタッチ中にアカウントレベル BPA を変更しようとするとブロックされるか / バケットレベル BPA の変更はどうか / パブリックポリシーの設定はどうか
  3. アタッチ/デタッチのライフサイクル: デタッチ時にアカウントレベル BPA はどう復元されるか(アタッチ前が未設定のケースと手動設定値のケース)

検証結果のサマリ

実機検証で以下が確認できた。

  • S3 ポリシーは S3.2 / S3.3 を COMPLIANT にするが、S3.8 / S3.19 / S3.6 は NON_COMPLIANT のまま: S3 ポリシーはアカウントレベル BPA のみを強制し、バケットレベル BPA・アクセスポイントレベル BPA・バケットポリシーの内容は変更しない。そのため、バケットレベル BPA を直接評価する S3.8、アクセスポイントレベル BPA を評価する S3.19、バケットポリシーを評価する S3.6 は finding が変化しない
  • アカウントレベル BPA の無効化は AccessDenied でブロックされるが、バケットレベル BPA の変更はブロックされない: S3 ポリシーはアカウントレベルの操作のみを保護する
  • パブリックポリシーの設定は BlockPublicPolicy によりブロックされる(AccessDenied)
  • デタッチ時はアタッチ前の状態に正確に復元される: 未設定だった場合は未設定に、手動設定値があった場合はその値に戻る
S3 ポリシーで BPA を強制しても、S3.8 / S3.19 / S3.6 の finding は解消しない。詳細は 次節 を参照。

検証マトリクス: 5 コントロールへの影響

アカウントレベル BPA が無効、かつ各 S3 コントロールが NON_COMPLIANT となる状態から、S3 ポリシーをアタッチした場合の変化。

コントロール評価方式FAILED 状態S3 ポリシーアタッチ後の CSPM実際のアクセス制御
S3.2結果ベース(アカウント/バケットレベル BPA + ポリシー + ACL の総合判断)NON_COMPLIANTCOMPLIANT に変化パブリックアクセスはアカウントレベル BPA でブロック(CSPM と一致)
S3.3結果ベース(S3.2 と同じ)NON_COMPLIANTCOMPLIANT に変化同上
S3.8設定ベース(バケットレベル BPA)NON_COMPLIANTNON_COMPLIANT のまま実アクセスは保護される(アカウントレベル BPA が最も制限的として優先)。CSPM の判定と実態に乖離
S3.19設定ベース(アクセスポイントレベル BPA)NON_COMPLIANTNON_COMPLIANT のまま実アクセスは保護される(同上)
S3.6ポリシーベース(バケットポリシーの Principal + Action)NON_COMPLIANTNON_COMPLIANT のままポリシー内容による。Principal: * を含むパブリックポリシーは BPA でブロック。特定アカウントへの明示的な許可(non-public 判定)は BPA の対象外でブロックされない

S3 ポリシーでカバーされる脅威と、別途対応が必要な脅威

S3 ポリシーは パブリックアクセスPrincipal: "*" を含むポリシーによる広範な公開)を実効的にブロックするが、特定アカウントへの明示的な許可(クロスアカウントで s3:PutBucketPolicy 等の制限対象アクションを許可するポリシー)はブロックしない。これは BPA が「パブリック判定」のロジックで評価対象を決めるためで、固定値の Principal は non-public として対象外になる(BPA における「パブリック」の定義 参照)。

脅威S3 ポリシーで防御検出するコントロール
パブリックアクセス(Principal: "*"✓ ブロックされるS3.2 / S3.3(総合判断)
クロスアカウントの制限対象アクション許可(特定アカウントへの明示的な許可)✗ ブロックされないS3.6(ポリシーベース)

したがって、S3 ポリシーで BPA を有効化したうえで、S3.6 の finding に対しては別途バケットポリシーの見直しが必要である。

検証環境

検証環境の構成図

--profile 指定がない場合は Workload アカウントで実行する。S3 ポリシーの作成・アタッチは Master アカウントで実行する。

前提条件

項目状態
S3 ポリシー未作成
アカウントレベル BPA未設定
バケットレベル BPA4 設定すべて有効(デフォルト)。検証 1 で FAILED 状態を作成する際に無効化する

検証の流れ

    flowchart LR
    A[1. S3 ポリシー<br>作成・アタッチ] --> B[2. 検証 1:<br>5 コントロールへの影響]
    B --> C[3. 検証 2:<br>BPA 変更操作のブロック]
    C --> D[4. 検証 3:<br>アタッチ/デタッチの<br>ライフサイクル]
    D --> E[5. ポリシー削除]
    E --> F[6. クリーンアップ]
  

1. S3 ポリシー作成・アタッチ

テスト用バケットの作成

aws s3api create-bucket \
  --bucket <テストバケット名> \
  --create-bucket-configuration LocationConstraint=ap-northeast-1 \
  --region ap-northeast-1
{
    "Location": "http://<テストバケット名>.s3.amazonaws.com/",
    "BucketArn": "arn:aws:s3:::<テストバケット名>"
}

S3 ポリシーの作成

aws organizations create-policy \
  --name "s3-bpa-test" \
  --description "S3 BPA enforcement test" \
  --type S3_POLICY \
  --content '{"s3_attributes":{"public_access_block_configuration":{"@@assign":"all"}}}' \
  --profile Master \
  --region ap-northeast-1
{
    "Policy": {
        "PolicySummary": {
            "Id": "<ポリシー ID>",
            "Name": "s3-bpa-test",
            "Type": "S3_POLICY"
        }
    }
}

アタッチ前の BPA 状態を確認

アカウントレベル BPA:

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not found

アカウントレベル BPA は未設定。このエラーはアカウントレベルで BPA が一度も設定されていないことを意味する。

バケットレベル BPA:

aws s3api get-public-access-block \
  --bucket <テストバケット名> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

S3 ポリシーを対象 OU にアタッチ

aws organizations attach-policy \
  --policy-id <ポリシー ID> \
  --target-id <対象 OU ID> \
  --profile Master \
  --region ap-northeast-1
(出力なし)

アカウントレベル BPA が強制されていることを確認

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

アタッチ前は未設定だったアカウントレベル BPA が、S3 ポリシーにより全 true に強制された。

バケットレベル BPA を確認(変更されていないこと)

aws s3api get-public-access-block \
  --bucket <テストバケット名> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

2. 検証 1: FAILED → S3 ポリシー有効化 → finding 確認

S3 ポリシーが有効な状態ではバケットレベル BPA の無効化やパブリックポリシーの設定がブロックされるため、FAILED 状態を作成できない。一時的に S3 ポリシーをデタッチしてから FAILED 状態を作成し、再アタッチして finding がどう変わるかを確認する。S3.6 も含めた全 5 コントロールを一括で確認する。

S3 ポリシーを一時デタッチ

aws organizations detach-policy \
  --policy-id <ポリシー ID> \
  --target-id <対象 OU ID> \
  --profile Master \
  --region ap-northeast-1
(出力なし)

S3.8 の FAILED 状態を作成

S3.8 はバケットレベル BPA の 4 設定がすべて有効かをチェックする。FAILED にするためにバケットレベル BPA を無効化する。

aws s3api put-public-access-block \
  --bucket <テストバケット名> \
  --public-access-block-configuration \
    BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
(出力なし)

BPA 設定の確認

aws s3api get-public-access-block \
  --bucket <テストバケット名> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}

S3.2 / S3.3 の FAILED 状態を作成

S3.2 / S3.3 は BPA 無効化だけでは FAILED にならない(BPA についてで検証済み)。バケットポリシーでパブリック読み書きを許可して初めて FAILED になる。

aws s3api put-bucket-policy \
  --bucket <テストバケット名> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": ["s3:GetObject", "s3:PutObject"],
        "Resource": "arn:aws:s3:::<テストバケット名>/*"
      }
    ]
  }' \
  --region ap-northeast-1
(出力なし)

S3.19 の FAILED 状態を作成

S3.19 はアクセスポイントの BPA 設定をチェックする。BPA 無効のアクセスポイントを作成して FAILED にする。アクセスポイントの BPA は作成後に変更できないため、作成時に無効化する必要がある。

aws s3control create-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --bucket <テストバケット名> \
  --public-access-block-configuration BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
{
    "AccessPointArn": "arn:aws:s3:ap-northeast-1:<アカウント ID>:accesspoint/<BPA 無効 AP 名>",
    "Alias": "<エイリアス>"
}

S3.6 の FAILED 状態を作成

S3.6 はバケットポリシーで他アカウントに制限対象アクションを許可していれば NON_COMPLIANT になる。パブリック読み書きポリシーに加えて、他アカウントへの制限対象アクション許可を追加する。

aws s3api put-bucket-policy \
  --bucket <テストバケット名> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": ["s3:GetObject", "s3:PutObject"],
        "Resource": "arn:aws:s3:::<テストバケット名>/*"
      },
      {
        "Effect": "Allow",
        "Principal": {"AWS": "<組織外アカウント ID>"},
        "Action": "s3:PutBucketPolicy",
        "Resource": "arn:aws:s3:::<テストバケット名>"
      }
    ]
  }' \
  --region ap-northeast-1
(出力なし)

Config ルールの手動トリガー → 全コントロール NON_COMPLIANT 確認

S3.8:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-level-public-access-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-level-public-access-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<テストバケット名>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

S3.2:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-public-read-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-public-read-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<テストバケット名>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

S3.3:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-public-write-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-public-write-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<テストバケット名>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

S3.19:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<BPA 無効 AP 名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<BPA 無効 AP 名>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

S3.6:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-blacklisted-actions-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-blacklisted-actions-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<テストバケット名>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

S3 ポリシーを再アタッチ

aws organizations attach-policy \
  --policy-id <ポリシー ID> \
  --target-id <対象 OU ID> \
  --profile Master \
  --region ap-northeast-1
(出力なし)

バケットレベル BPA を確認(変更されないはず)

S3 ポリシーはアカウントレベル BPA を強制するが、バケットレベル BPA を変更するかは不明。ここでバケットレベル BPA が全 false のままであれば、S3 ポリシーはバケットレベルには作用しないことが確認できる。

aws s3api get-public-access-block \
  --bucket <テストバケット名> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}

バケットレベル BPA は変更されない(実機確認済み)。

Config ルールの手動トリガー → 各コントロールの状態確認

コントロール想定結果理由
S3.8NON_COMPLIANT のままバケットレベル BPA は変更されないため
S3.2COMPLIANT に変わるアカウントレベル BPA が有効なので「restricts public policies」と判定
S3.3COMPLIANT に変わる同上
S3.19NON_COMPLIANT のままアクセスポイントレベル BPA は変更されないため
S3.6NON_COMPLIANT のままBPA とは無関係。バケットポリシーの内容は変わらないため

S3.8:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-level-public-access-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-level-public-access-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1

S3.2:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-public-read-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-public-read-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1

S3.3:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-public-write-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-public-write-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1

S3.19:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-access-point-public-access-blocks-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<BPA 無効 AP 名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1

S3.6:

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-blacklisted-actions-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-s3-bucket-blacklisted-actions-prohibited-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`<テストバケット名>`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
S3.8 と S3.19 は「設定ベース」の評価であり、それぞれバケットレベル BPA とアクセスポイントレベル BPA の設定値を直接チェックする。S3 ポリシーはアカウントレベル BPA のみに作用するため、S3.8 と S3.19 は NON_COMPLIANT のまま変化しない。S3.6 は BPA とは無関係にバケットポリシーの内容をチェックするため、S3 ポリシーの影響を受けず NON_COMPLIANT のまま。

3. 検証 2: 設定変更ブロック確認

S3 ポリシーが有効な状態で、各レベルの BPA 変更がブロックされるかを確認する。

アカウントレベル BPA の無効化を試みる → AccessDenied

aws s3control delete-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
An error occurred (AccessDenied) when calling the DeletePublicAccessBlock operation: This account does not allow changes to its account-level S3 Block Public Access settings due to an organizational S3 Block Public Access policy in effect.

アカウントレベル BPA が変更されていないことを確認

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

バケットレベル BPA の無効化を試みる → ブロックされない

aws s3api put-public-access-block \
  --bucket <テストバケット名> \
  --public-access-block-configuration \
    BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
(出力なし)

バケットレベル BPA の変更はブロックされない。S3 ポリシーはアカウントレベルのみを保護する。

個別設定(一部だけ false)を試みる → ブロックされない

aws s3api put-public-access-block \
  --bucket <テストバケット名> \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=false,RestrictPublicBuckets=true \
  --region ap-northeast-1
(出力なし)

パブリックポリシーの設定を試みる → AccessDenied

アカウントレベル BPA の BlockPublicPolicy が有効なため、パブリックポリシーの設定はブロックされる。

aws s3api put-bucket-policy \
  --bucket <テストバケット名> \
  --policy '{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<テストバケット名>/*"
      }
    ]
  }' \
  --region ap-northeast-1
An error occurred (AccessDenied) ... because public policies are prevented by the BlockPublicPolicy setting in S3 Block Public Access.

4. 検証 3: デタッチ → 復元確認

S3 ポリシーをデタッチした後、アカウントレベル BPA がアタッチ前の状態に正確に復元されることを確認する。結論: 2 つのケース(未設定からの復元、手動設定値からの復元)のどちらも正確に復元される(詳細は ケース 2: 手動設定からの復元 の末尾 callout で総括)。

  • ケース 1: アタッチ前にアカウントレベル BPA が未設定だった場合 → デタッチ後に未設定に戻るか
  • ケース 2: アタッチ前にアカウントレベル BPA を手動で設定していた場合 → デタッチ後に手動設定に戻るか

ケース 1: 未設定からの復元

現在の状態: S3 ポリシーがアタッチされており、アカウントレベル BPA は S3 ポリシーにより全 true に強制されている。アタッチ前はアカウントレベル BPA が未設定だった。

現在のアカウントレベル BPA を確認

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

S3 ポリシーをデタッチ

aws organizations detach-policy \
  --policy-id <ポリシー ID> \
  --target-id <対象 OU ID> \
  --profile Master \
  --region ap-northeast-1
(出力なし)
aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not found

S3 ポリシーアタッチ前の状態(未設定)に復元。

ケース 2: 手動設定からの復元

アカウントレベル BPA を手動で全 false に設定してから S3 ポリシーをアタッチし、デタッチ後に手動設定(全 false)に戻ることを確認する。

アカウントレベル BPA を手動で全 false に設定

aws s3control put-public-access-block \
  --account-id <アカウント ID> \
  --public-access-block-configuration \
    BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false \
  --region ap-northeast-1
(出力なし)

S3 ポリシーをアタッチ

S3 ポリシーにより、手動設定(全 false)がオーバーライドされて全 true に強制される。

aws organizations attach-policy \
  --policy-id <ポリシー ID> \
  --target-id <対象 OU ID> \
  --profile Master \
  --region ap-northeast-1
(出力なし)

アカウントレベル BPA が全 true に強制されていることを確認

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": true,
        "IgnorePublicAcls": true,
        "BlockPublicPolicy": true,
        "RestrictPublicBuckets": true
    }
}

S3 ポリシーをデタッチ

aws organizations detach-policy \
  --policy-id <ポリシー ID> \
  --target-id <対象 OU ID> \
  --profile Master \
  --region ap-northeast-1
(出力なし)

アカウントレベル BPA が手動設定(全 false)に復元されていることを確認

S3 ポリシーは元のアカウントレベル設定を保存しており、デタッチ時に復元する。

aws s3control get-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
{
    "PublicAccessBlockConfiguration": {
        "BlockPublicAcls": false,
        "IgnorePublicAcls": false,
        "BlockPublicPolicy": false,
        "RestrictPublicBuckets": false
    }
}
S3 ポリシーの復元挙動の仕様: S3 ポリシーはアタッチ時のアカウントレベル BPA 設定を内部的に保持しており、デタッチ時にその状態に正確に復元する。ケース 1(未設定 → NoSuchPublicAccessBlockConfiguration に戻る)とケース 2(手動設定値 → その値に戻る)の両方で復元を確認できた。これは宣言型ポリシー一般の共通挙動(詳細は 宣言型ポリシー 参照)を S3 で具体化したもの。

アカウントレベル BPA を削除して検証前の状態に戻す

aws s3control delete-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)

5. S3 ポリシー削除

aws organizations delete-policy \
  --policy-id <ポリシー ID> \
  --profile Master \
  --region ap-northeast-1
(出力なし)

6. クリーンアップ

aws s3control delete-access-point \
  --name <BPA 無効 AP 名> \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)
aws s3api delete-bucket-policy \
  --bucket <テストバケット名> \
  --region ap-northeast-1
(出力なし)
aws s3api put-public-access-block \
  --bucket <テストバケット名> \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true \
  --region ap-northeast-1
(出力なし)
aws s3api delete-bucket \
  --bucket <テストバケット名> \
  --region ap-northeast-1
(出力なし)

Amazonアソシエイトリンク