コンテンツにスキップ

EC2.182

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

--profile 指定がない場合は Workload アカウントで実行する。export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

コントロールの説明

EBS スナップショットのブロックパブリックアクセス(BPA)設定がアカウントレベルで有効かどうかをチェックする。BPA が unblocked(無効)または block-new-sharing の場合に FAILED となる。block-all-sharing が設定されている場合のみ PASSED となる。

block-new-sharing が FAILED になる理由:Security Hub のドキュメントには「block public access is not enabled to block sharing of Amazon EBS snapshots to all」の場合に FAILED と明記されている。block-new-sharing は新規のパブリック共有をブロックするが、「全てのパブリック共有をブロック(to all)」ではないため NON_COMPLIANT と評価される。

BPA の設定値と意味:

設定値意味
unblockedBPA 無効。スナップショットをパブリック共有できる
block-new-sharing新規のパブリック共有をブロック。既存のパブリック共有は維持される
block-all-sharing全てのパブリック共有をブロック。既存のパブリック共有もアクセス不可になる

対応する Config ルール: EBS_SNAPSHOT_BLOCK_PUBLIC_ACCESS(評価頻度: 変更トリガー)

結果

  • デフォルト状態(unblocked)では FAILED
  • block-new-sharing に設定しても FAILED のまま変化しない
  • block-all-sharing に設定すると PASSED
  • unblocked に戻すと FAILED に復帰
  • CT.EC2.PV.7(Declarative Policy 型)を有効化すると finding は PASSED に変化。ただし ebs-snapshot-block-public-access は Change triggered 型ルールのため、Declarative Policy による変更は Config の変更検知を発火させない。Security Hub の定期スキャンによる自動更新を待つ必要があり、反映には数時間かかる場合がある
  • 宣言型ポリシー(EBS Snapshot BPA)を OU に直接適用しても同様に BPA 設定が強制される。block-all-sharingblock-new-sharing の両方を設定可能(ポリシーの content 値はアンダースコア区切り: block_all_sharing / block_new_sharing

検証の流れ

    flowchart LR
    A[1. デフォルト状態の確認<br>FAILED] --> B[2. block-all-sharing に設定]
    B --> C[3. PASSED 確認]
    C --> D[4. unblocked に戻す]
    D --> E[5. FAILED 復帰確認]
    E --> F[6. CT.EC2.PV.7 有効化]
    F --> G[7. PASSED に変化することを確認]
    G --> H[8. 宣言型ポリシー直接適用<br>動作確認のみ]
    H --> I[9. クリーンアップ]
  

1. デフォルト状態の確認

EBS Snapshot BPA の現在の設定を確認

aws ec2 get-snapshot-block-public-access-state \
  --region ap-northeast-1
{
    "State": "unblocked",
    "ManagedBy": "account"
}

unblocked(BPA 無効)。デフォルトでは保護されていない。

Security Hub finding の現在の状態を確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
  --region ap-northeast-1
[
    {
        "ControlId": "EC2.182",
        "Status": "FAILED",
        "ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    },
    {
        "ControlId": "EC2.182",
        "Status": "FAILED",
        "ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    }
]

Security Hub が有効な 2 リージョン分が FAILED。ResourceId はリージョンごとのアカウントレベルリソース(snapshotblockpublicaccess/<アカウント ID>)。

EC2.182 の ResourceId はスナップショット ARN ではなく、リージョンごとのアカウントレベルリソース(arn:aws:ec2:<リージョン>:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>)である。EBS Snapshot BPA はスナップショット単位ではなくアカウント単位の設定であるため、ResourceId もアカウントレベルになる。Security Hub が有効なリージョンごとに finding が生成される。

2. block-all-sharing に設定

EBS Snapshot BPA はリージョン単位の設定のため、Security Hub が有効な全リージョンで設定する必要がある。

Security Hub が有効なリージョンごとに finding が生成される。設定変更は Security Hub が有効な全リージョンで実施すること。

ap-northeast-1

aws ec2 enable-snapshot-block-public-access \
  --state block-all-sharing \
  --region ap-northeast-1
{
    "State": "block-all-sharing"
}

ap-southeast-1 でも同じコマンドを実行する(--region ap-southeast-1)。

設定の確認

aws ec2 get-snapshot-block-public-access-state \
  --region ap-northeast-1
{
    "State": "block-all-sharing",
    "ManagedBy": "account"
}

3. PASSED 確認

EBS Snapshot BPA はリージョン単位の設定のため、Config ルールのトリガーも全リージョンで実施する。

Config ルール名はリージョンごとに異なるサフィックスが付く。各リージョンのルール名は aws configservice describe-config-rules --query 'ConfigRules[?contains(Source.SourceIdentifier,\EBS_SNAPSHOT_BLOCK_PUBLIC_ACCESS`)].ConfigRuleName’` で確認できる。

Config ルールの手動トリガー(全リージョン)

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ebs-snapshot-block-public-access-6026c41a \
  --region ap-northeast-1
(出力なし)
aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ebs-snapshot-block-public-access-acadb690 \
  --region ap-southeast-1
(出力なし)

Config 評価結果の確認(各リージョン)

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-ebs-snapshot-block-public-access-6026c41a \
  --query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<アカウント ID>",
        "ComplianceType": "COMPLIANT"
    }
]

Security Hub finding の PASSED 確認

Config → Security Hub の反映には数分かかる。

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
  --region ap-northeast-1
[
    {
        "ControlId": "EC2.182",
        "Status": "PASSED",
        "ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    },
    {
        "ControlId": "EC2.182",
        "Status": "PASSED",
        "ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    }
]

4. unblocked に戻す

aws ec2 disable-snapshot-block-public-access \
  --region ap-northeast-1
{
    "State": "unblocked"
}

ap-southeast-1 でも同じコマンドを実行する(--region ap-southeast-1)。

設定の確認

aws ec2 get-snapshot-block-public-access-state \
  --region ap-northeast-1
{
    "State": "unblocked",
    "ManagedBy": "account"
}

5. FAILED 復帰確認

Config ルールの手動トリガー

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ebs-snapshot-block-public-access-6026c41a \
  --region ap-northeast-1
(出力なし)

Config 評価結果の確認

aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-ebs-snapshot-block-public-access-6026c41a \
  --query 'EvaluationResults[].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "<アカウント ID>",
        "ComplianceType": "NON_COMPLIANT"
    }
]

Security Hub finding の FAILED 復帰確認

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
  --region ap-northeast-1
[
    {
        "ControlId": "EC2.182",
        "Status": "FAILED",
        "ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    },
    {
        "ControlId": "EC2.182",
        "Status": "FAILED",
        "ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    }
]

6. CT.EC2.PV.7 有効化

CT.EC2.PV.7 は Declarative Policy 型の予防コントロールであり、アカウントレベルの BPA 設定を block-all-sharing に強制する。finding が PASSED に変化するはずである。

aws controltower enable-control \
  --control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
  --target-identifier arn:aws:organizations::<マスターアカウント ID>:ou/<Organization ID>/<OU ID> \
  --region ap-northeast-1 --profile Master
{
    "arn": "<有効化 ARN>",
    "operationIdentifier": "<オペレーション ID>"
}
aws controltower get-control-operation \
  --operation-identifier <オペレーション ID> \
  --query 'controlOperation.{operationType:operationType,status:status}' \
  --region ap-northeast-1 --profile Master
{
    "operationType": "ENABLE_CONTROL",
    "status": "SUCCEEDED"
}

BPA 設定の変化を確認

aws ec2 get-snapshot-block-public-access-state \
  --region ap-northeast-1
{
    "State": "block-all-sharing",
    "ManagedBy": "declarative-policy"
}

7. PASSED に変化することを確認

Declarative Policy による BPA 変更は Config の変更検知を発火させない。Config 手動トリガーでは評価されないため、Security Hub の定期スキャンによる自動更新を待つ必要がある。反映には数時間かかる場合がある。

Security Hub が定期スキャンを実行すると、finding が PASSED に変化する。反映には数時間かかる場合があり、リージョンによってタイミングが異なる。

aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "EC2.182"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "WorkflowStatus": [{"Comparison": "NOT_EQUALS", "Value": "SUPPRESSED"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{ControlId:Compliance.SecurityControlId,Status:Compliance.Status,ResourceId:Resources[0].Id}' \
  --region ap-northeast-1
[
    {
        "ControlId": "EC2.182",
        "Status": "PASSED",
        "ResourceId": "arn:aws:ec2:ap-northeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    },
    {
        "ControlId": "EC2.182",
        "Status": "FAILED",
        "ResourceId": "arn:aws:ec2:ap-southeast-1:<アカウント ID>:snapshotblockpublicaccess/<アカウント ID>"
    }
]
リージョン 2 は CT.EC2.PV.7 有効化から数時間以上経過しても FAILED のままだった。リージョン 1 で PASSED に変化したことで、CT.EC2.PV.7 有効化による finding の変化を確認済みとする。
リージョン間の差異について:CT.EC2.PV.7 は Organizations の宣言型ポリシーとして OU 全体に適用されるため、BPA 設定自体は両リージョンで同時に block-all-sharing に変化する(ポリシー伝播の問題ではない)。リージョンによって反映タイミングが大きく異なる場合があり、いつ反映されるか予測できない。ebs-snapshot-block-public-access は Change triggered 型ルールのため Declarative Policy による変更は Config の変更検知を発火させず、Security Hub の定期スキャンを待つ必要がある。

8. 宣言型ポリシー直接適用(動作確認)

CT.EC2.PV.7 を無効化した後、Organizations API で宣言型ポリシーを直接適用する。Control Tower を使わない環境での代替手段として、また block-all-sharing 以外の設定値(block-new-sharing)も選択できることを確認する。

確認項目:

  1. Control Tower 不使用環境での代替手段として機能すること(block-all-sharing を適用して BPA が強制されることを確認)
  2. block-new-sharing も設定できること

ただし block-all-sharing の Security Hub finding への影響はステップ 2〜3 および 6〜7 で確認済みのため、ここでは BPA 設定値が正しく強制されることのみ確認し、Security Hub の finding 確認は省略する。CT.EC2.PV.7 経由と宣言型ポリシー直接適用はどちらも Organizations の Declarative Policy を使用しており、Change triggered 型ルールの発火挙動も同じ(Declarative Policy による変更は Config の変更検知を発火させない)ため、finding の挙動も同一と判断できる。

CT.EC2.PV.7 の無効化

aws controltower disable-control \
  --control-identifier arn:aws:controlcatalog:::control/ek6wc2bmgzmho1kk6bn236mqt \
  --target-identifier arn:aws:organizations::<マスターアカウント ID>:ou/<Organization ID>/<OU ID> \
  --region ap-northeast-1 --profile Master
{
    "operationIdentifier": "<オペレーション ID>"
}
aws controltower get-control-operation \
  --operation-identifier <オペレーション ID> \
  --query 'controlOperation.{operationType:operationType,status:status}' \
  --region ap-northeast-1 --profile Master
{
    "operationType": "DISABLE_CONTROL",
    "status": "SUCCEEDED"
}

宣言型ポリシーの作成(block-all-sharing)

aws organizations create-policy \
  --name cspm-ec2-182-test \
  --type DECLARATIVE_POLICY_EC2 \
  --content '{
    "ec2_attributes": {
      "snapshot_block_public_access": {
        "state": {
          "@@assign": "block_all_sharing"
        }
      }
    }
  }' \
  --description "EC2.182 CSPM test" \
  --region ap-northeast-1 --profile Master
{
    "Policy": {
        "PolicySummary": {
            "Id": "<ポリシー ID>",
            "Arn": "<ポリシー ARN>",
            "Name": "cspm-ec2-182-test",
            "Type": "DECLARATIVE_POLICY_EC2"
        }
    }
}

OU にアタッチ

aws organizations attach-policy \
  --policy-id <ポリシー ID> \
  --target-id <OU ID> \
  --region ap-northeast-1 --profile Master
(出力なし)

BPA 設定が block-all-sharing に強制されることを確認

aws ec2 get-snapshot-block-public-access-state \
  --region ap-northeast-1
{
    "State": "block-all-sharing",
    "ManagedBy": "declarative-policy"
}

ManagedBy: declarative-policy に変化。block-all-sharing が強制されている。

ポリシーを block-new-sharing に更新

aws organizations update-policy \
  --policy-id <ポリシー ID> \
  --content '{
    "ec2_attributes": {
      "snapshot_block_public_access": {
        "state": {
          "@@assign": "block_new_sharing"
        }
      }
    }
  }' \
  --region ap-northeast-1 --profile Master
{
    "Policy": {
        "PolicySummary": {
            "Id": "<ポリシー ID>",
            "Name": null,
            "Type": "DECLARATIVE_POLICY_EC2"
        }
    }
}

BPA 設定が block-new-sharing に変化したことを確認

aws ec2 get-snapshot-block-public-access-state \
  --region ap-northeast-1
{
    "State": "block-new-sharing",
    "ManagedBy": "declarative-policy"
}

block-new-sharing に変化。EC2.182 は block-new-sharing では FAILED のままとなる(ステップ 2〜3 で確認済み)。

9. クリーンアップ

宣言型ポリシーのデタッチ

aws organizations detach-policy \
  --policy-id <ポリシー ID> \
  --target-id <OU ID> \
  --region ap-northeast-1 --profile Master
(出力なし)

宣言型ポリシーの削除

aws organizations delete-policy \
  --policy-id <ポリシー ID> \
  --region ap-northeast-1 --profile Master
(出力なし)

EBS Snapshot BPA の状態を確認(unblocked に戻ったことを確認)

aws ec2 get-snapshot-block-public-access-state \
  --region ap-northeast-1
{
    "State": "unblocked",
    "ManagedBy": "account"
}

宣言型ポリシーのデタッチ後、アカウントレベルの設定はポリシー適用前の状態(unblocked)に復帰する。

補足:Config ルールと Security Hub の反映について

ebs-snapshot-block-public-access は Change triggered 型ルールである。

手動で BPA を変更した場合enable-snapshot-block-public-access / disable-snapshot-block-public-access)は Config が変更を検知して自動評価される。すぐに確認したい場合は Config ルールを手動でトリガーする。

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ebs-snapshot-block-public-access-6026c41a \
  --region ap-northeast-1
(出力なし)

Config の評価結果が更新された後、Security Hub への反映にさらに数分かかる。

Declarative Policy による BPA 変更(CT.EC2.PV.7 または宣言型ポリシー直接適用)は Config の変更検知を発火させない。手動トリガーを実行しても Config が記録した古い状態で評価されるため NON_COMPLIANT のままとなる。Security Hub の定期スキャンによる自動更新を待つ必要があり、反映には数時間かかる場合がある。

Amazonアソシエイトリンク