S3.6
--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。
コントロールの説明
S3 汎用バケットのバケットポリシーが、他の AWS アカウントに対してバケット設定の変更操作を許可していないかをチェックする。
具体的には、以下の 5 つのアクション(以下「制限対象アクション」)が他の AWS アカウントのプリンシパルに許可されていれば FAILED となる。
| 制限対象アクション | 操作内容 |
|---|---|
s3:DeleteBucketPolicy | バケットポリシーの削除 |
s3:PutBucketAcl | バケット ACL の変更 |
s3:PutBucketPolicy | バケットポリシーの変更 |
s3:PutEncryptionConfiguration | 暗号化設定の変更 |
s3:PutObjectAcl | オブジェクト ACL の変更 |
S3.2 / S3.3(パブリックアクセスの検出)や S3.8(BPA 設定のチェック)とは異なり、S3.6 はバケットポリシーの Principal と Action の組み合わせをチェックする。BPA の有無は評価に影響しない。
評価ロジックの詳細
Config ルールの公式ドキュメントによると:
- バケットポリシーが他の AWS アカウントに制限対象アクションを許可していれば NON_COMPLIANT
- Principal のみを評価し、Condition は評価しない
対応する Config ルール: S3_BUCKET_BLACKLISTED_ACTIONS_PROHIBITED(変更トリガー)
結果
以下は全て実機検証済み。
| # | Principal | Action | Condition | 結果 |
|---|---|---|---|---|
| 1 | 組織外アカウント | 制限対象(s3:PutBucketPolicy) | なし | NON_COMPLIANT |
| 2 | 組織外アカウント | 制限対象外(s3:GetObject) | なし | COMPLIANT |
| 3 | バケット所有アカウント | 制限対象(s3:PutBucketPolicy) | なし | COMPLIANT |
| 4 | 組織内他アカウント(Audit) | 制限対象(s3:PutBucketPolicy) | なし | NON_COMPLIANT |
| 5 | *(パブリック) | 制限対象(s3:PutBucketPolicy) | なし | NON_COMPLIANT |
| 6 | 組織外アカウント | 制限対象(s3:PutBucketPolicy) | aws:SourceIp 制限あり | COMPLIANT |
- 「他の AWS アカウント」は組織内/外を区別しない。バケット所有アカウント以外はすべて対象(パターン 1, 4)
- 制限対象外のアクション(
s3:GetObject等)は他アカウントに許可しても COMPLIANT(パターン 2) - BPA の有無は S3.6 の評価に影響しない(バケットポリシーの内容のみをチェック)
- CT.S3.PV.4(RCP: 組織外アクセスブロック)が有効でも finding は NON_COMPLIANT のまま変化しない。RCP はバケットポリシーを書き換えないため
- S3 ポリシー(S3 BPA) を有効化しても NON_COMPLIANT のまま(BPA とは無関係のため)
前提条件
| 項目 | 状態 |
|---|---|
| アカウントレベル BPA | 未設定 |
| バケットレベル BPA | テスト用バケットは全無効化(バケットポリシー設定のため) |
検証の流れ
flowchart LR
A[1. デフォルト状態の確認] --> B[2. テストバケット作成]
B --> C[3. 6 パターンの<br>ポリシー検証]
C --> D[4. CT.S3.PV.4 の<br>影響確認]
D --> E[5. クリーンアップ]
1. デフォルト状態の確認
Security Hub finding の現在の状態を確認
aws securityhub get-findings \
--filters '{
"ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "S3.6"}],
"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。バケットポリシーで他アカウントに制限対象アクションを許可しているバケットがない。
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 を全無効化
バケットポリシーの設定に BlockPublicPolicy が影響するため、全無効化する。
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
}
}3. 5 パターンのポリシー検証
パターン 1: 他アカウントに制限対象アクションを許可 → NON_COMPLIANT
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "<組織外アカウント ID>"},
"Action": "s3:PutBucketPolicy",
"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:PutBucketPolicy",
"Resource": "arn:aws:s3:::<テストバケット名>"
}
]
}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:PutBucketPolicy)を許可 → NON_COMPLIANT。
パターン 2: 他アカウントに制限対象外のアクションを許可 → COMPLIANT
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
(出力なし)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": "COMPLIANT"
}
]s3:GetObject は制限対象アクションに含まれないため COMPLIANT。他アカウントへのデータ読み取り許可は S3.6 では検出しない。
パターン 3: 同一アカウントに制限対象アクションを許可 → COMPLIANT
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::<アカウント ID>:root"},
"Action": "s3:PutBucketPolicy",
"Resource": "arn:aws:s3:::<テストバケット名>"
}
]
}' \
--region ap-northeast-1
(出力なし)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": "COMPLIANT"
}
]同一アカウント内のプリンシパルへの許可は S3.6 の対象外。
パターン 4: 組織内他アカウント(Audit)に制限対象アクションを許可 → NON_COMPLIANT
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "<組織内他アカウント ID>"},
"Action": "s3:PutBucketPolicy",
"Resource": "arn:aws:s3:::<テストバケット名>"
}
]
}' \
--region ap-northeast-1
(出力なし)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"
}
]「他の AWS アカウント」は組織内/外を区別しない。バケット所有アカウント以外はすべて対象。
パターン 5: Principal: * に制限対象アクションを許可 → NON_COMPLIANT
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutBucketPolicy",
"Resource": "arn:aws:s3:::<テストバケット名>"
}
]
}' \
--region ap-northeast-1
(出力なし)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"
}
]Principal: * は全アカウントを含むため NON_COMPLIANT。
パターン 6: Condition 付きで他アカウントに制限対象アクションを許可 → COMPLIANT
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "<組織外アカウント ID>"},
"Action": "s3:PutBucketPolicy",
"Resource": "arn:aws:s3:::<テストバケット名>",
"Condition": {
"IpAddress": {"aws:SourceIp": "192.168.1.0/24"}
}
}
]
}' \
--region ap-northeast-1
(出力なし)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": "COMPLIANT"
}
]4. CT.S3.PV.4 の影響確認
CT.S3.PV.4(RCP: 組織外アクセスブロック)が有効な状態で、S3.6 の finding が NON_COMPLIANT のまま変わらないことを確認する。RCP はバケットポリシーを書き換えないため、finding の状態は変わらないはずである。
NON_COMPLIANT 状態を作成
パターン 1 と同じポリシーを設定する。
aws s3api put-bucket-policy \
--bucket <テストバケット名> \
--policy '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "<組織外アカウント ID>"},
"Action": "s3:PutBucketPolicy",
"Resource": "arn:aws:s3:::<テストバケット名>"
}
]
}' \
--region ap-northeast-1
(出力なし)Config ルールの手動トリガー → NON_COMPLIANT 確認
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"
}
]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 ルールの手動トリガー → NON_COMPLIANT のまま確認
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"
}
]RCP はバケットポリシーを書き換えないため、S3.6 の finding は NON_COMPLIANT のまま変化しない。
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"
}5. クリーンアップ
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
(出力なし)