BPA について
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
概要
S3 Block Public Access(BPA)の 4 設定が、Security Hub コントロール S3.2(パブリック読み取り)と S3.3(パブリック書き込み)の評価結果にどう影響するかを検証する。
BPA の 4 設定
BPA は「読み取り/書き込み」ではなく「ACL 経路/ポリシー経路」×「予防/事後対応」で分類される。
| 経路 | 予防(新規設定をブロック) | 事後対応(既存設定の効果を無効化) |
|---|---|---|
| ACL 経路 | BlockPublicAcls | IgnorePublicAcls |
| ポリシー経路 | BlockPublicPolicy | RestrictPublicBuckets |
- 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 はデフォルト無効のため、ポリシー経路に絞って検証する。バケットポリシーでパブリック読み取り + 書き込みを許可した状態で、BlockPublicPolicy と RestrictPublicBuckets の組み合わせを変えて S3.2 / S3.3 の評価結果を確認する。
結果
| # | レベル | BlockPublicPolicy | RestrictPublicBuckets | S3.2 | S3.3 |
|---|---|---|---|---|---|
| 1 | バケット | false | false | NON_COMPLIANT | NON_COMPLIANT |
| 2 | バケット | false | true | COMPLIANT | COMPLIANT |
| 3 | バケット | true | false | COMPLIANT | COMPLIANT |
| 4 | バケット | true | true | COMPLIANT | COMPLIANT |
| 5 | アカウント | true | true | COMPLIANT | COMPLIANT |
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 を削除
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
(出力なし)