S3.2
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
コントロールの説明
S3 汎用バケットがパブリック読み取りアクセスを許可していないかをチェックする。Block Public Access(BPA)設定、バケットポリシー、バケット ACL を総合的に評価し、実際にパブリック読み取りアクセスが可能な場合に FAILED となる。
BPA を無効化しただけでは FAILED にならない。BPA はパブリックアクセスを許可する設定(バケットポリシーや ACL)をブロックするガードレールであり、BPA を外しても、パブリックアクセスを許可する設定がなければバケットは公開状態にならない。BPA の 4 設定と S3.2 / S3.3 の関係(バケットレベル・アカウントレベル両方)は BPA について で検証済み。
対応する Config ルール: S3_BUCKET_PUBLIC_READ_PROHIBITED(評価頻度: 12 時間、変更トリガーあり)
結果
- デフォルト状態(BPA 全有効)では全バケット PASSED
- バケットレベル BPA の
BlockPublicPolicyとRestrictPublicBucketsを無効化しただけでは FAILED にならない。バケットポリシーでパブリックアクセスを許可していなければ COMPLIANT のまま(BPA について で詳細検証) - BPA 無効化 + パブリック読み取りポリシー(
s3:GetObjectをPrincipal: *に許可)で FAILED - S3.3(書き込み)は影響を受けない(
s3:GetObjectは書き込みではないため) - クロスアカウントアクセス(特定の AWS アカウントへの許可)では FAILED にならない。クロスアカウントの検出には IAM Access Analyzer を使用する
- BPA 再有効化 + ポリシー削除で PASSED に復帰
- CT.S3.PV.4(RCP)が有効でも finding は NON_COMPLIANT のまま変化しない。RCP はリソースポリシーを書き換えないため
- Declarative Policies — S3 BPA の影響は S3 コントロール 5 件の検証後にまとめて確認予定
検証の流れ
flowchart LR
A[1. デフォルト状態の確認] --> B[2. テストバケット作成]
B --> C[3. BPA 一部無効化 +<br>パブリック読み取りポリシー設定]
C --> D[4. FAILED 確認<br>S3.3 非影響確認]
D --> E[5. クロスアカウント<br>アクセスの確認]
E --> F[6. ポリシー削除 +<br>BPA 再有効化]
F --> G[7. PASSED 復帰確認]
G --> H[8. CT.S3.PV.4 の<br>影響確認]
H --> I[9. クリーンアップ]
1. デフォルト状態の確認
アカウントレベルの BPA 設定を確認
aws s3control get-public-access-block \
--account-id <アカウント ID> \
--region ap-northeast-1An error occurred (NoSuchPublicAccessBlockConfiguration) when calling the GetPublicAccessBlock operation: The public access block configuration was not foundアカウントレベル BPA は未設定。2023 年 4 月以降に作成されたバケットはバケットレベル BPA がデフォルトで有効だが、アカウントレベルでは自動設定されない。
バケットレベルの BPA 設定を確認
aws s3api get-public-access-block \
--bucket <既存バケット名> \
--region ap-northeast-1{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}バケットレベル BPA は 4 設定すべてデフォルトで有効。
Security Hub finding の現在の状態を確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.2"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "PASSED"}]
}' \
--query 'Findings[*].{ResourceId:Resources[0].Id,Status:Compliance.Status}' \
--region ap-northeast-1[
{
"ResourceId": "arn:aws:s3:::<バケット名>",
"Status": "PASSED"
},
...
{
"ResourceId": "AWS::::Account:<アカウント ID>",
"Status": "PASSED"
}
]全バケット PASSED、FAILED なし。デフォルトで保護されている状態を確認できた。
AWS::::Account:<アカウント ID> の finding は、S3 バケットが存在しないリージョンで生成される。Security Hub が有効だが対象リソースがないリージョンでは、バケット単位の finding の代わりにアカウント単位の PASSED が返される(公式ドキュメント)。2. テストバケット作成
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:::<テストバケット名>"
}デフォルトの BPA 設定を確認
aws s3api get-public-access-block \
--bucket <テストバケット名> \
--region ap-northeast-1{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}3. BPA 一部無効化 + パブリック読み取りポリシー設定
BPA の書き込み系 2 設定を無効化
バケットポリシーでパブリック読み取りを許可するには、BlockPublicPolicy(パブリックポリシーの設定をブロック)と RestrictPublicBuckets(パブリックポリシーを持つバケットへのアクセスを制限)を無効化する必要がある。読み取り系(BlockPublicAcls, IgnorePublicAcls)は ACL 関連のため、バケットポリシーでの公開には関係しない。
aws s3api put-public-access-block \
--bucket <テストバケット名> \
--public-access-block-configuration \
BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=false,RestrictPublicBuckets=false \
--region ap-northeast-1
(出力なし)BPA 設定の確認
aws s3api get-public-access-block \
--bucket <テストバケット名> \
--region ap-northeast-1{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": false,
"RestrictPublicBuckets": false
}
}BPA 無効化だけでは FAILED にならないことを確認
BPA はパブリックアクセスを許可する設定をブロックするガードレールである。BPA を外しても、パブリックアクセスを許可する設定(バケットポリシーや ACL)がなければバケットは公開状態にならない。
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": "COMPLIANT"
}
]BPA を無効化してもバケットポリシーや ACL でパブリックアクセスを許可していないため、COMPLIANT のまま。
パブリック読み取りを許可するバケットポリシーを設定
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
(出力なし)バケットポリシーの確認
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",
"Resource": "arn:aws:s3:::<テストバケット名>/*"
}
]
}4. FAILED 確認
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 が NON_COMPLIANT)
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 が 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:GetObject)は書き込みアクセスではないため、S3.3 は COMPLIANT のまま。
Security Hub finding の FAILED 確認(S3.2)
Config → Security Hub の反映には数分かかる。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.2"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "FAILED"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:s3:::<テストバケット名>"}]
}' \
--query 'Findings[*].{ResourceId:Resources[0].Id,Status:Compliance.Status,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"ResourceId": "arn:aws:s3:::<テストバケット名>",
"Status": "FAILED",
"UpdatedAt": "<更新日時>"
}
]5. クロスアカウントアクセスの確認
S3.2 はパブリックアクセスのみをチェックする。バケットポリシーで特定の AWS アカウントにアクセスを許可した場合、S3.2 は FAILED にならないことを確認する。
バケットポリシーをクロスアカウントアクセスに変更
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "<組織外アカウント ID>"},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<テストバケット名>/*"
}
]
}' \
--region ap-northeast-1
(出力なし)Config ルールの手動トリガー → S3.2 が PASSED のまま確認
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": "COMPLIANT"
}
]S3.2 はパブリックアクセスのみを検出し、クロスアカウントアクセスは検出しない。クロスアカウントアクセスの検出には IAM Access Analyzer を使用する。
6. ポリシー削除 + BPA 再有効化
バケットポリシーの削除
aws s3api delete-bucket-policy \
--bucket <テストバケット名> \
--region ap-northeast-1
(出力なし)BPA 再有効化
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
}
}7. PASSED 復帰確認
Config ルールの手動トリガー
aws configservice start-config-rules-evaluation \
--config-rule-names securityhub-s3-bucket-public-read-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)Security Hub finding の PASSED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.2"}],
"ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:s3:::<テストバケット名>"}]
}' \
--query 'Findings[*].{ResourceId:Resources[0].Id,Status:Compliance.Status,UpdatedAt:UpdatedAt}' \
--region ap-northeast-1[
{
"ResourceId": "arn:aws:s3:::<テストバケット名>",
"Status": "PASSED",
"UpdatedAt": "<更新日時>"
}
]8. CT.S3.PV.4 の影響確認
CT.S3.PV.4(RCP: 組織外アクセスブロック)が有効な状態で、S3.2 の finding が PASSED に変わらないことを確認する。RCP はリソースポリシーを書き換えないため、finding の状態は変わらないはずである。
FAILED 状態を作成
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 put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<テストバケット名>/*"
}
]
}' \
--region ap-northeast-1
(出力なし)CT.S3.PV.4 を有効化
aws controltower enable-control \
--control-identifier <CT.S3.PV.4 コントロール ARN> \
--target-identifier <対象 OU ARN> \
--profile Master \
--region ap-northeast-1{
"arn": "<有効化 ARN>",
"operationIdentifier": "<オペレーション ID>"
}aws controltower get-control-operation \
--operation-identifier <オペレーション ID> \
--query 'controlOperation.{operationType:operationType,status:status}' \
--profile Master \
--region ap-northeast-1{
"operationType": "ENABLE_CONTROL",
"status": "SUCCEEDED"
}Config ルールの手動トリガー → finding が NON_COMPLIANT のまま確認
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"
}
]RCP はリソースポリシーを書き換えないため、S3.2 の finding は NON_COMPLIANT のまま変化しない。
9. クリーンアップ
CT.S3.PV.4 の無効化
aws controltower disable-control \
--control-identifier <CT.S3.PV.4 コントロール ARN> \
--target-identifier <対象 OU ARN> \
--profile Master \
--region ap-northeast-1{
"operationIdentifier": "<オペレーション ID>"
}aws controltower get-control-operation \
--operation-identifier <オペレーション ID> \
--query 'controlOperation.{operationType:operationType,status:status}' \
--profile Master \
--region ap-northeast-1{
"operationType": "DISABLE_CONTROL",
"status": "SUCCEEDED"
}バケットクリーンアップ
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
(出力なし)