コンテンツにスキップ

BPA について

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

--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

概要

S3 Block Public Access(BPA)の 4 設定が、Security Hub コントロール S3.2(パブリック読み取り)と S3.3(パブリック書き込み)の評価結果にどう影響するかを検証する。

BPA の 4 設定

BPA は「読み取り/書き込み」ではなく「ACL 経路/ポリシー経路」×「予防/事後対応」で分類される。

経路予防(新規設定をブロック)事後対応(既存設定の効果を無効化)
ACL 経路BlockPublicAclsIgnorePublicAcls
ポリシー経路BlockPublicPolicyRestrictPublicBuckets
  • ACL は 2023 年 4 月以降のバケットではデフォルト無効(BucketOwnerEnforced)のため、実質的にはポリシー経路が主
  • BlockPublicPolicy = パブリックなバケットポリシーの設定自体をブロック(公式ドキュメント
  • RestrictPublicBuckets = 既にパブリックポリシーが設定されているバケットへのアクセスを、バケットオーナーと AWS サービスのみに制限

S3.2 / S3.3 の評価ロジック

S3_BUCKET_PUBLIC_READ_PROHIBITED(S3.2)の COMPLIANT 条件:

  • BPA がパブリックポリシーを制限している(BlockPublicPolicy または RestrictPublicBuckets が true)、またはバケットポリシーがパブリック読み取りを許可していない
  • かつ BPA がパブリック ACL を制限している(BlockPublicAcls または IgnorePublicAcls が true)、またはバケット ACL がパブリック読み取りを許可していない

S3_BUCKET_PUBLIC_WRITE_PROHIBITED(S3.3)も同じ構造で、読み取りが書き込みに変わるだけ。

検証で確認すること

ACL はデフォルト無効のため、ポリシー経路に絞って検証する。バケットポリシーでパブリック読み取り + 書き込みを許可した状態で、BlockPublicPolicyRestrictPublicBuckets の組み合わせを変えて S3.2 / S3.3 の評価結果を確認する。

結果

#レベルBlockPublicPolicyRestrictPublicBucketsS3.2S3.3
1バケットfalsefalseNON_COMPLIANTNON_COMPLIANT
2バケットfalsetrueCOMPLIANTCOMPLIANT
3バケットtruefalseCOMPLIANTCOMPLIANT
4バケットtruetrueCOMPLIANTCOMPLIANT
5アカウントtruetrueCOMPLIANTCOMPLIANT
  • BlockPublicPolicy または RestrictPublicBuckets のどちらか一方が true であれば、バケットポリシーでパブリックアクセスを許可していても S3.2・S3.3 ともに COMPLIANT
  • バケットレベルとアカウントレベルのどちらで設定しても有効
  • 両方 false の場合のみ、バケットポリシーの内容が評価され NON_COMPLIANT となる

検証の流れ

    flowchart LR
    A[1. テストバケット作成] --> B[2. パブリックポリシー設定]
    B --> C[3. BPA 組み合わせ検証<br>4パターン]
    C --> D[4. クリーンアップ]
  

1. テストバケット作成

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:::<テストバケット名>"
}

2. パブリック読み書きポリシーの設定

まず BPA を全無効化してからポリシーを設定する(BlockPublicPolicy=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 全無効化の確認

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

パブリック読み書きポリシーを設定

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
(出力なし)

ポリシーの確認

aws s3api get-bucket-policy \
  --bucket <テストバケット名> \
  --output json \
  --region ap-northeast-1 | jq -r '.Policy' | jq .
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::<テストバケット名>/*"
    }
  ]
}

3. BPA 組み合わせ検証

ACL 経路の BPA(BlockPublicAcls, IgnorePublicAcls)は true に固定し、ポリシー経路の 2 設定の組み合わせを変えて検証する。

パターン 1: 両方 false(ベースライン)

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

Config ルール手動トリガー(S3.2)

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-public-read-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)

Config 評価結果の確認(S3.2)

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"
    }
]

Config ルール手動トリガー(S3.3)

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-s3-bucket-public-write-prohibited-<サフィックス> \
  --region ap-northeast-1
(出力なし)

Config 評価結果の確認(S3.3)

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"
    }
]

BPA のポリシー経路が両方 false のため、バケットポリシーのパブリック読み取り・書き込みがそのまま評価され、S3.2・S3.3 ともに NON_COMPLIANT。

パターン 2: RestrictPublicBuckets のみ true

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

Config ルール手動トリガー + 評価結果の確認(S3.2, S3.3)

パターン 1 と同じコマンドを実行する。

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

S3.2: COMPLIANT / S3.3: COMPLIANT

RestrictPublicBuckets=true だけで「restricts public policies」と判定され、バケットポリシーの内容に関わらず COMPLIANT。

パターン 3: BlockPublicPolicy のみ true

BlockPublicPolicy=true にすると新規のパブリックポリシー設定がブロックされるが、既に設定済みのポリシーには影響しない。

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

Config ルール手動トリガー + 評価結果の確認(S3.2, S3.3)

パターン 1 と同じコマンドを実行する。

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

S3.2: COMPLIANT / S3.3: COMPLIANT

BlockPublicPolicy=true は新規ポリシー設定をブロックするだけで既存ポリシーには影響しないが、Config ルールは「restricts public policies」と判定し COMPLIANT。

この組み合わせ(BlockPublicPolicy=true, RestrictPublicBuckets=false)は COMPLIANT だが安全ではない。既存のパブリックポリシーが有効なままアクセス可能であり、Security Hub 上は検出されない偽陰性の状態となる。RestrictPublicBuckets=true も併せて有効化すべきである。

パターン 4: 両方 true

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

Config ルール手動トリガー + 評価結果の確認(S3.2, S3.3)

パターン 1 と同じコマンドを実行する。

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

S3.2: COMPLIANT / S3.3: COMPLIANT

パターン 5: アカウントレベル BPA(バケットレベル全無効)

バケットレベル BPA を全無効にした状態で、アカウントレベル BPA のポリシー経路 2 設定を有効化する。

バケットレベル 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 s3control put-public-access-block \
  --account-id <アカウント ID> \
  --public-access-block-configuration \
    BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=true,RestrictPublicBuckets=true \
  --region ap-northeast-1
(出力なし)

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

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

Config ルール手動トリガー + 評価結果の確認(S3.2, S3.3)

パターン 1 と同じコマンドを実行する。

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

S3.2: COMPLIANT / S3.3: COMPLIANT

バケットレベル BPA が全無効でも、アカウントレベル BPA のポリシー経路が有効であれば COMPLIANT。Config ルールはアカウントレベル BPA も評価対象に含める。

アカウントレベル BPA を削除

アカウントレベル BPA の削除は、バケットレベル BPA が個別に設定されているバケットには影響しない。ただし、アカウントレベル BPA に依存しているバケットがある場合は注意。
aws s3control delete-public-access-block \
  --account-id <アカウント ID> \
  --region ap-northeast-1
(出力なし)

4. クリーンアップ

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アソシエイトリンク