S3.3
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
コントロールの説明
S3 汎用バケットがパブリック書き込みアクセスを許可していないかをチェックする。Block Public Access(BPA)設定、バケットポリシー、バケット ACL を総合的に評価し、実際にパブリック書き込みアクセスが可能な場合に FAILED となる。
S3.2(読み取り)と同じ評価構造であり、BPA を無効化しただけでは FAILED にならない。BPA の 4 設定と S3.2 / S3.3 の関係(バケットレベル・アカウントレベル両方)は BPA について で検証済み。
対応する Config ルール: S3_BUCKET_PUBLIC_WRITE_PROHIBITED(評価頻度: 12 時間、変更トリガーあり)
結果
- デフォルト状態(BPA 全有効)では全バケット PASSED
- BPA の
BlockPublicPolicyとRestrictPublicBucketsを無効化しただけでは FAILED にならない(BPA について で検証済み) - BPA 無効化 + パブリック書き込みポリシー(
s3:PutObjectをPrincipal: *に許可)で FAILED - S3.2(読み取り)は影響を受けない(
s3:PutObjectは読み取りではないため) - クロスアカウントアクセス(特定の AWS アカウントへの許可)では FAILED にならない。クロスアカウントの検出には IAM Access Analyzer を使用する
- BPA 再有効化 + ポリシー削除で PASSED に復帰
- S3 ポリシー(S3 BPA) を有効化すると COMPLIANT に変化(アカウントレベル BPA が強制されるため)
検証の流れ
flowchart LR
A[1. デフォルト状態の確認] --> B[2. テストバケット作成]
B --> C[3. BPA 一部無効化 +<br>パブリック書き込みポリシー設定]
C --> D[4. FAILED 確認<br>S3.2 非影響確認]
D --> E[5. クロスアカウント<br>アクセスの確認]
E --> F[6. ポリシー削除 +<br>BPA 再有効化]
F --> G[7. PASSED 復帰確認]
G --> H[8. クリーンアップ]
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 は未設定。
バケットレベルの BPA 設定を確認
aws s3api get-public-access-block \
--bucket <既存バケット名> \
--region ap-northeast-1{
"PublicAccessBlockConfiguration": {
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
}Security Hub finding の現在の状態を確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.3"}],
"ComplianceStatus": [{"Comparison": "EQUALS", "Value": "PASSED"}]
}' \
--query 'Findings[*].{ResourceId:Resources[0].Id,Status:Compliance.Status}' \
--region ap-northeast-1[
{
"ResourceId": "arn:aws:s3:::<バケット名>",
"Status": "PASSED"
},
...
]全バケット PASSED、FAILED なし。
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(パブリックポリシーを持つバケットへのアクセスを制限)を無効化する必要がある。
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 にならないことを確認
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": "COMPLIANT"
}
]BPA を無効化してもバケットポリシーでパブリックアクセスを許可していないため、COMPLIANT のまま。
パブリック書き込みを許可するバケットポリシーを設定
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "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:PutObject",
"Resource": "arn:aws:s3:::<テストバケット名>/*"
}
]
}4. FAILED 確認
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 が NON_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": "NON_COMPLIANT"
}
]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 が COMPLIANT のまま)
パブリック書き込みポリシー(s3:PutObject)は読み取りアクセスではないため、S3.2 は 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": "COMPLIANT"
}
]Security Hub finding の FAILED 確認(S3.3)
Config → Security Hub の反映には数分かかる。
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.3"}],
"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.3 はパブリックアクセスのみをチェックする。バケットポリシーで特定の AWS アカウントに書き込みを許可した場合、S3.3 は FAILED にならないことを確認する。
バケットポリシーをクロスアカウントアクセスに変更
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "<組織外アカウント ID>"},
"Action": "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": {
"AWS": "arn:aws:iam::<組織外アカウント ID>:root"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<テストバケット名>/*"
}
]
}Config ルールの手動トリガー → S3.3 が COMPLIANT 確認
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": "COMPLIANT"
}
]S3.3 はパブリックアクセスのみを検出し、クロスアカウントアクセスは検出しない。クロスアカウントアクセスの検出には 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-write-prohibited-<サフィックス> \
--region ap-northeast-1
(出力なし)Security Hub finding の PASSED 確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.3"}],
"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. クリーンアップ
aws s3api delete-bucket \
--bucket <テストバケット名> \
--region ap-northeast-1
(出力なし)