コンテンツにスキップ

S3.6

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

--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(変更トリガー)

結果

以下は全て実機検証済み。

#PrincipalActionCondition結果
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 とは無関係のため)
パターン 6 について: Config ルールの公式ドキュメントには「Condition は評価しない」とあるが、実際には Condition 付きのポリシーは COMPLIANT と判定された。Condition の存在がポリシーを「非パブリック」と判定させている可能性がある(BPA の「public の定義」と同じロジック)。

前提条件

項目状態
アカウントレベル 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"
    }
]
Config ルールの公式ドキュメントには「Condition は評価しない」とあるが、実際には Condition 付きのポリシーは COMPLIANT と判定された。Condition の存在がポリシーを「非パブリック」と判定させている可能性がある(BPA の「public の定義」と同じロジック)。

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

Amazonアソシエイトリンク