コンテンツにスキップ

SSM.7

検証日: 2026-05-07 / リージョン: ap-northeast-1、us-east-1(Region 独立性検証)

概要

SSM.7 は、アカウントの Block Public Sharing 設定 が有効になっているかをチェックする Security Hub CSPM コントロールである。対応する Config ルールは ssm-automation-block-public-sharing。対象リソースタイプは AWS::::Account(アカウント単位のコントロール)。

Config ルール名の混乱: Config ルール名に ssm-automation-block-public-sharing と “automation” が含まれるが、実際の評価対象は SSM ドキュメント全般 の Block Public Sharing 設定である。Config 公式ドキュメント にも “Checks if AWS Systems Manager Documents has block public sharing enabled” と明記されており、対象は SSM Documents 全般(Automation 限定ではない)。Security Hub コントロール名も “SSM documents should have the block public sharing setting enabled” であり一貫している。automation の表記は実装の名残と考えられる。
SSM ドキュメントとは: AWS Systems Manager(SSM)で、EC2 インスタンスなどに対して実行する操作を定義した JSON または YAML のドキュメント。詳細は SSM.4 の概要を参照。

検出範囲

SSM.7 は「アカウントの Block Public Sharing 設定値(/ssm/documents/console/public-sharing-permission)が Disable であるか」をチェックする。

アカウント設定SettingValueSSM.7
Block Public Sharing 有効(SSM ドキュメントのパブリック共有をブロック)DisablePASSED
Block Public Sharing 無効(SSM ドキュメントのパブリック共有を許可)EnableFAILED

この設定は Region 単位のアカウント設定 で、各 Region で個別に設定する必要がある。

設定値の意味の反転に注意: SettingValue: Disable が「Block Public Sharing を有効にした状態」、SettingValue: Enable が「Block Public Sharing を無効にした状態」である。設定 ID 名の public-sharing-permission に対する値として解釈するため、Disable(パブリック共有を Disable する)が望ましい状態となる。
Config と Security Hub での ResourceId 形式SSM.4 と同じパターン): Config(AWS::::Account リソース)の ResourceId はアカウント ID そのまま(例: <アカウント ID>)、Security Hub finding の ResourceIdAWS::::Account:<アカウント ID> 形式(例: AWS::::Account:<アカウント ID>)。get-compliance-details-by-config-rulesecurityhub get-findings でフィルタを書く際は両者の違いに注意。
SSM.7 は Periodic 評価(定期実行)の Config ルール。update-service-setting の変更は設定変更イベントとして Config に直接通知されるわけではない。手動トリガー(start-config-rules-evaluation)で即座に評価を促すことができる。

外部アクセス制御レイヤー

SSM ドキュメントの外部アクセスに関わるコントロールは以下の通り。SSM.7 は CSPM によるアカウント単位の検出レイヤーに位置する。SSM.4(ドキュメント単位の検出)と対になる。

レイヤーコントロール役割
デフォルト保護ドキュメント作成時のデフォルトはプライベート(共有設定なし)明示的に modify-document-permission しない限りパブリックにはならない
予防(SCP / RCP / 宣言型ポリシー)なしControl Tower の標準予防コントロールに SSM Block Public Sharing を強制するものは存在しない。カスタム SCP で ssm:UpdateServiceSettingssm:ModifyDocumentPermission を Deny する運用は可能(ただし ssm:UpdateServiceSetting を全 Deny すると、SSM.7 がデフォルト FAILED のまま永久に有効化できなくなる点に注意。事前に BPS を有効化してから SCP を適用するか、条件付き Deny が必要)
SSM のサービス機能(Block Public Sharing)update-service-setting /ssm/documents/console/public-sharing-permission Disableアカウント全体で SSM ドキュメントのパブリック共有を物理的にブロック(有効時は modify-document-permission --account-ids-to-add 'all' が API レベルで拒否される)
検出(CSPM、ドキュメント単位)SSM.4個別の SSM ドキュメントがパブリック共有されているかチェック
検出(CSPM、アカウント単位)SSM.7(本記事)アカウントの Block Public Sharing 設定が有効かチェック

SSM.4 と SSM.7 の違い

SSM.4 と SSM.7 はどちらも Security Hub CSPM の検出コントロールだが、評価対象・タイミング・関係性が異なる。両者は独立して動作し、一方が FAILED でも他方の評価に直接影響しない。

観点SSM.4SSM.7
評価単位個別 SSM ドキュメントアカウント(Region 単位)
対象リソースAWS::SSM::DocumentAWS::::Account
評価内容ドキュメントがパブリック共有されているかアカウントの Block Public Sharing 設定が有効か
Config ルールssm-document-not-publicssm-automation-block-public-sharing
FAILED になる条件自アカウント所有の SSM ドキュメントが all で共有されているBlock Public Sharing 設定が Enable(=パブリック共有が許可されている)

SSM.7 が PASSED(Block Public Sharing が Disable)な状態だと、ユーザーは新規に modify-document-permission --account-ids-to-add 'all' を実行してもエラーで拒否される。つまり SSM.7 の有効化は、SSM.4 違反を将来的に発生させない予防的効果がある。ただし SSM.7 を有効化する前から既にパブリック化されているドキュメントには影響しない(SSM.4 は FAILED のまま)。

デフォルト値について: AWS 公式ブログ(2021 年 7 月) には「By default, this setting is disabled」と記載されており、Block Public Sharing はデフォルトで 無効(パブリック共有を許可)である。本検証の 3 アカウント(組織管理アカウント、組織配下の Workload アカウント、組織外アカウント)すべてで、全リージョンで実測値は SettingValue: EnableStatus: DefaultLastModifiedUser: System であり、公式ブログの記述通り。つまり 新規アカウントでも SSM.7 は初期状態で FAILED になる。Block Public Sharing を有効化するには、各アカウント・各 Region で明示的に update-service-setting する必要がある。

本記事で確認すること

#検証観点状態
1デフォルト状態(SettingValue: Enable)で SSM.7 が FAILED本記事で検証(3. デフォルト状態の FAILED 確認
2update-service-setting --setting-value Disable で Block Public Sharing を有効化後、SSM.7 が PASSED本記事で検証(5. Block Public Sharing 有効化後の PASSED 確認
3遡及性(時間軸): 有効化前にパブリック化したドキュメントは、有効化後も SSM.4 で FAILED のまま(BPA は既存リソースに遡及しない)本記事で検証(6. 遡及性の確認
4新規違反の予防(時間軸): SSM.7 が PASSED(BPA 有効)の状態では、SSM.4 を FAILED にするパブリック化操作(modify-document-permission --account-ids-to-add 'all')が API レベルで拒否される本記事で検証(7. 新規の SSM.4 違反を作れないことの確認
5Region 独立性(空間軸): ap-northeast-1 で Disable 設定しても、別 Region(us-east-1)の SSM.7 設定は変わらず、その Region ではパブリック化もブロックされない本記事で検証(8. Region 独立性の確認
6update-service-setting --setting-value Enable で戻した後、SSM.7 が FAILED に戻る本記事で検証(10. 設定を戻した後の FAILED 確認

結果

  • デフォルト(SettingValue: Enable: Block Public Sharing 無効の状態で SSM.7 は FAILED
  • update-service-setting --setting-value Disable: BPA 有効化後、SSM.7 は PASSED(約 30 秒で Config 再評価)
  • 遡及性(時間軸): BPA 有効化前にパブリック化したドキュメントは、有効化後も SSM.4 で FAILED のまま。BPA は既存の SSM.4 違反を自動解消しない(遡及しない)(BPA 有効化後の SSM.4 再評価は手動トリガーから約 5 秒で完了、結果は NON_COMPLIANT のまま)
  • 新規違反の予防(時間軸): BPA 有効状態では、SSM.4 を FAILED にするパブリック化操作(modify-document-permission --account-ids-to-add 'all')が InvalidDocumentOperation エラーで API レベルで拒否される。新規の SSM.4 違反を予防できる。なお、プライベート共有(特定アカウント ID 指定)は BPA の影響を受けず API 呼び出しは成功する
  • Region 独立性(空間軸): ap-northeast-1 で BPA 有効化しても us-east-1 では設定値が Enable のままで、パブリック化 API もブロックされない。Region ごとに個別設定が必要
  • update-service-setting --setting-value Enable: 元に戻すと SSM.7 は FAILED に復帰(約 18 秒)。ただし StatusCustomized のまま(Default には戻らない)

検証環境

検証環境の構成図

本記事のコマンドは、--profile 指定がない場合は Workload アカウントで実行する。事前に export AWS_PROFILE=Workload でデフォルトを設定しておくと便利。

本検証では ap-northeast-1 と us-east-1 の 2 リージョンを使用する(ステップ 8 の Region 独立性確認のため)。

検証の流れ

    flowchart LR
    A[1. 現状確認<br>SettingValue: Enable] --> B[2. 有効化前の<br>パブリックドキュメント作成]
    B --> C[3. FAILED 確認]
    C --> D[4. BPA 有効化<br>SettingValue: Disable]
    D --> E[5. PASSED 確認]
    E --> F[6. 遡及性確認<br>既存パブリック文書は<br>SSM.4 FAILED のまま]
    F --> G[7. 新規 SSM.4 違反の<br>予防確認]
    G --> H[8. Region 独立性確認<br>us-east-1 では<br>ブロックされない]
    H --> I[9. BPA 無効化<br>SettingValue: Enable]
    I --> J[10. FAILED 確認]
    J --> K[11. クリーンアップ]
  
検証後の状態: 本検証では初期状態が SettingValue: Enable(FAILED)の前提で進め、最後に元の Enable に戻す。もし検証前に意図的に Disable(BPA 有効)に設定していた環境であれば、検証終了後に再度 Disable に戻す必要がある。検証開始前の状態を記録しておくこと。

1. 現状確認(SettingValue: Enable

aws ssm get-service-setting \
  --setting-id /ssm/documents/console/public-sharing-permission \
  --query 'ServiceSetting.{SettingValue:SettingValue,Status:Status,LastModifiedDate:LastModifiedDate,LastModifiedUser:LastModifiedUser}' \
  --region ap-northeast-1
{
    "SettingValue": "Enable",
    "Status": "Default",
    "LastModifiedDate": "<日時>",
    "LastModifiedUser": "System"
}

SettingValue: Enable であれば Block Public Sharing は無効で、SSM.7 は FAILED のはず。本検証ではこの状態から始める。

もし既に SettingValue: Disable の場合: Block Public Sharing が有効で SSM.7 は PASSED の状態。本検証は「Enable → Disable → Enable」の遷移を前提とするため、事前に一度 update-service-setting --setting-value Enable で無効化してから進める必要がある。検証終了時に元の Disable に戻すことを忘れないよう、検証開始前の状態を記録しておくこと。

2. 有効化前のパブリックドキュメント作成(遡及性検証の準備)

後続の 6. 遡及性の確認 で「BPA 有効化前からパブリックだったドキュメントは、有効化後も SSM.4 で FAILED のまま」を検証するため、先にパブリック化された SSM ドキュメントを作成しておく。

まず定義ファイルを用意する。

cat > /tmp/ssm-7-pre-bpa-doc.json <<'EOF'
{
  "schemaVersion": "2.2",
  "description": "SSM.7 verification - created before BPA enabled",
  "mainSteps": [
    {
      "action": "aws:runShellScript",
      "name": "sampleStep",
      "inputs": {
        "runCommand": ["echo hello"]
      }
    }
  ]
}
EOF

ドキュメントを作成する。

aws ssm create-document \
  --name ssm-7-pre-bpa-doc \
  --document-type Command \
  --document-format JSON \
  --content file:///tmp/ssm-7-pre-bpa-doc.json \
  --query 'DocumentDescription.{Name:Name,Status:Status,Owner:Owner}' \
  --region ap-northeast-1
{
    "Name": "ssm-7-pre-bpa-doc",
    "Status": "Creating",
    "Owner": "<アカウント ID>"
}

パブリック化する(BPA 無効状態のため成功する)。

aws ssm modify-document-permission \
  --name ssm-7-pre-bpa-doc \
  --permission-type Share \
  --account-ids-to-add all \
  --region ap-northeast-1
(出力なし)

パブリック化を確認する。

aws ssm describe-document-permission \
  --name ssm-7-pre-bpa-doc \
  --permission-type Share \
  --region ap-northeast-1
{
    "AccountIds": ["all"],
    "AccountSharingInfoList": [
        {
            "AccountId": "all",
            "SharedDocumentVersion": "$DEFAULT"
        }
    ]
}

このドキュメントは 6. 遡及性の確認 まで削除しない。

事前評価(SSM.4 FAILED 確認)

ステップ 6 での「FAILED のまま」を厳密に示すには、BPA 有効化前の時点で既に SSM.4 が FAILED であることを記録しておく必要がある。ここで一度 SSM.4 の評価結果を確認しておく。

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ssm-document-not-public-<サフィックス> \
  --region ap-northeast-1
(出力なし)
sleep 90
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-ssm-document-not-public-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`ssm-7-pre-bpa-doc`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "ssm-7-pre-bpa-doc",
        "ComplianceType": "NON_COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]

この時点で SSM.4 は NON_COMPLIANT(FAILED)。ステップ 6 でこの状態が維持されることを確認する。

3. デフォルト状態の FAILED 確認

ここからは本記事の対象コントロールである SSM.7securityhub-ssm-automation-block-public-sharing)の評価結果確認に戻る。ステップ 1 で確認した通り SettingValue: Enable(Block Public Sharing 無効)の状態であるため、SSM.7 は FAILED となることを実測する。

Config ルールを手動トリガーして即座に評価させる。

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ssm-automation-block-public-sharing-<サフィックス> \
  --region ap-northeast-1
(出力なし)

1〜2 分待ってから評価結果を確認する。

sleep 90
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-ssm-automation-block-public-sharing-<サフィックス> \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='<アカウント ID>'].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1
[
    {
        "ResourceId": "<アカウント ID>",
        "ComplianceType": "NON_COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]

Security Hub への反映を待ってから、finding を確認する。

sleep 120
aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SSM.7"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "AWS::::Account:<アカウント ID>"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "FAILED",
        "ResourceId": "AWS::::Account:<アカウント ID>",
        "UpdatedAt": "<更新時刻>"
    }
]

4. Block Public Sharing を有効化(SettingValue: Disable

update-service-settingDisable に変更する。

aws ssm update-service-setting \
  --setting-id /ssm/documents/console/public-sharing-permission \
  --setting-value Disable \
  --region ap-northeast-1
(出力なし)

反映を確認する。

aws ssm get-service-setting \
  --setting-id /ssm/documents/console/public-sharing-permission \
  --query 'ServiceSetting.{SettingValue:SettingValue,Status:Status}' \
  --region ap-northeast-1
{
    "SettingValue": "Disable",
    "Status": "Customized"
}

SettingValueDisableStatusCustomized(ユーザー設定済み)に変化している。

5. Block Public Sharing 有効化後の PASSED 確認

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ssm-automation-block-public-sharing-<サフィックス> \
  --region ap-northeast-1
(出力なし)
sleep 90
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-ssm-automation-block-public-sharing-<サフィックス> \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='<アカウント ID>'].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1
[
    {
        "ResourceId": "<アカウント ID>",
        "ComplianceType": "COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]

ResultRecordedTime がステップ 4 の update-service-setting 実行時刻より後であることを確認する。

設定変更直後の Config トリガーでは NON_COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。

Security Hub への反映を待ってから、finding を確認する。

sleep 120
aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SSM.7"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "AWS::::Account:<アカウント ID>"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "PASSED",
        "ResourceId": "AWS::::Account:<アカウント ID>",
        "UpdatedAt": "<更新時刻>"
    }
]

6. 遡及性の確認(有効化前のパブリックドキュメントは SSM.4 FAILED のまま)

ステップ 2 で作成したパブリックドキュメント(ssm-7-pre-bpa-doc)が、BPA 有効化後も SSM.4 で FAILED のままであることを確認する。これにより、Block Public Sharing は 既存のパブリックドキュメントを自動的にプライベート化しない こと(遡及しないこと)を実証する。

評価タイミングに関する注意: BPA 有効化直後に SSM.4 を評価しても、Security Hub 側の再評価が走っていない場合がある。SSM.4 の評価は個別ドキュメントのパブリック共有状態を見るため、BPA 設定値の変更による影響はない。ただし本検証では「BPA 有効化後のタイミングでも SSM.4 は FAILED のまま」を明示的に確認するため、改めて Config ルールを手動トリガーする。

まず SSM.4 の Config ルールを手動トリガーする。

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ssm-document-not-public-<サフィックス> \
  --region ap-northeast-1
(出力なし)

評価結果を確認する。

sleep 90
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-ssm-document-not-public-<サフィックス> \
  --query 'EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId==`ssm-7-pre-bpa-doc`].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}' \
  --region ap-northeast-1
[
    {
        "ResourceId": "ssm-7-pre-bpa-doc",
        "ComplianceType": "NON_COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]

Security Hub での確認(ssm-7-pre-bpa-doc は SSM.4 で FAILED のまま)。

sleep 120
aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SSM.4"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "arn:aws:ssm:ap-northeast-1:<アカウント ID>:document/ssm-7-pre-bpa-doc"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "FAILED",
        "ResourceId": "arn:aws:ssm:ap-northeast-1:<アカウント ID>:document/ssm-7-pre-bpa-doc",
        "UpdatedAt": "<更新時刻>"
    }
]

結論: BPA 有効化前にパブリック化されたドキュメントは、BPA 有効化後も SSM.4 で FAILED のまま。BPA は新規のパブリック化操作を防ぐものであり、既存のパブリックドキュメントに対して遡及的な効果はない。

7. 新規の SSM.4 違反を作れないことの確認(SSM.7 の予防効果)

SSM.7 が PASSED(BPA 有効)な状態で、SSM.4 を FAILED にする設定変更(modify-document-permission --account-ids-to-add 'all' によるパブリック化)ができないことを確認する。BPA 有効化が既存の SSM.4 違反を解消しないこと(ステップ 6 で検証)と対になり、将来の新規違反を予防する効果を実証する。

検証用の新規ドキュメントを作成する。

cat > /tmp/ssm-7-post-bpa-doc.json <<'EOF'
{
  "schemaVersion": "2.2",
  "description": "SSM.7 verification - created after BPA enabled",
  "mainSteps": [
    {
      "action": "aws:runShellScript",
      "name": "sampleStep",
      "inputs": {
        "runCommand": ["echo hello"]
      }
    }
  ]
}
EOF

aws ssm create-document \
  --name ssm-7-post-bpa-doc \
  --document-type Command \
  --document-format JSON \
  --content file:///tmp/ssm-7-post-bpa-doc.json \
  --query 'DocumentDescription.{Name:Name,Status:Status,Owner:Owner}' \
  --region ap-northeast-1
{
    "Name": "ssm-7-post-bpa-doc",
    "Status": "Creating",
    "Owner": "<アカウント ID>"
}

ドキュメント作成自体は BPA の影響を受けないため成功する。次に、パブリック化を試みる。

aws ssm modify-document-permission \
  --name ssm-7-post-bpa-doc \
  --permission-type Share \
  --account-ids-to-add all \
  --region ap-northeast-1
An error occurred (InvalidDocumentOperation) when calling the ModifyDocumentPermission operation: This document cannot be shared with all, because public sharing permission is disabled.

期待エラー: エラーコード InvalidDocumentOperation、メッセージは “This document cannot be shared with all, because public sharing permission is disabled."。Block Public Sharing(SettingValue: Disable)が有効な状態で --account-ids-to-add 'all' を実行した際の挙動として AWS が返すエラー。

なお、エラーメッセージ中の “public sharing permission is disabled” は SettingValue: Disable(= Block Public Sharing 有効)の状態を指す。冒頭の「設定値の意味の反転に注意」で説明した通り、Disable(パブリック共有を Disable する = ブロックする)が望ましい設定値である点に注意。

プライベート共有(特定アカウント ID 指定)は BPA の影響を受けないことも確認する。

aws ssm modify-document-permission \
  --name ssm-7-post-bpa-doc \
  --permission-type Share \
  --account-ids-to-add <検証用アカウント ID> \
  --region ap-northeast-1
(出力なし)
aws ssm describe-document-permission \
  --name ssm-7-post-bpa-doc \
  --permission-type Share \
  --region ap-northeast-1
{
    "AccountIds": ["<検証用アカウント ID>"],
    "AccountSharingInfoList": [
        {
            "AccountId": "<検証用アカウント ID>",
            "SharedDocumentVersion": "$DEFAULT"
        }
    ]
}

特定アカウント ID への共有が成功することを確認する。Block Public Sharing は「all」指定のパブリック化のみをブロックし、プライベート共有には影響しない。

結論: SSM.7 が PASSED(BPA 有効)の状態では、SSM.4 を FAILED にするパブリック化操作(--account-ids-to-add 'all')は API レベルで拒否される。ステップ 6 で確認した通り既存のパブリックドキュメントには遡及しないが、有効化後の新規 SSM.4 違反は予防できる。プライベート共有(特定アカウント ID 指定)は BPA の影響を受けず API 呼び出しは成功する(本記事ではプライベート共有状態での SSM.4 評価は実施していない)。

8. Region 独立性の確認

Block Public Sharing は Region 単位のアカウント設定である。ap-northeast-1 で Disable 設定しても、別 Region(本検証では us-east-1)の SSM.7 状態は変わらず、その Region ではパブリック化もブロックされないことを確認する。

まず us-east-1 の Block Public Sharing 設定が Enable(BPA 無効)のままであることを確認する。

aws ssm get-service-setting \
  --setting-id /ssm/documents/console/public-sharing-permission \
  --query 'ServiceSetting.{SettingValue:SettingValue,Status:Status}' \
  --region us-east-1
{
    "SettingValue": "Enable",
    "Status": "Default"
}

ap-northeast-1 で BPA を有効化したにもかかわらず、us-east-1 では Enable(BPA 無効)のまま。設定値が Region 間で独立していることが示される。

次に、us-east-1 で検証用ドキュメントを作成してパブリック化を試みる(ブロックされないことを確認)。

cat > /tmp/ssm-7-region-test.json <<'EOF'
{
  "schemaVersion": "2.2",
  "description": "SSM.7 verification - Region independence test (us-east-1)",
  "mainSteps": [
    {
      "action": "aws:runShellScript",
      "name": "sampleStep",
      "inputs": {
        "runCommand": ["echo hello"]
      }
    }
  ]
}
EOF

aws ssm create-document \
  --name ssm-7-region-test \
  --document-type Command \
  --document-format JSON \
  --content file:///tmp/ssm-7-region-test.json \
  --query 'DocumentDescription.{Name:Name,Status:Status,Owner:Owner}' \
  --region us-east-1
{
    "Name": "ssm-7-region-test",
    "Status": "Creating",
    "Owner": "<アカウント ID>"
}

us-east-1 でパブリック化を試みる。

aws ssm modify-document-permission \
  --name ssm-7-region-test \
  --permission-type Share \
  --account-ids-to-add all \
  --region us-east-1
(出力なし、成功する)

us-east-1 ではパブリック化が成功する。Block Public Sharing の設定は Region ごとに独立していることが実動作レベルでも確認できる。

結論: Block Public Sharing は Region 単位の設定であり、ある Region で有効化しても別 Region には波及しない。マルチリージョン構成のアカウントでは、SSM を利用する可能性がある全 Region で個別に update-service-setting --setting-value Disable を実行する必要がある。

検証中の Security Hub finding について: us-east-1 で Security Hub が有効化されている場合、ssm-7-region-test のパブリック化により us-east-1 側で一時的に SSM.4 の FAILED finding が発生する。ステップ 11 のクリーンアップで共有解除・ドキュメント削除を行えば、Security Hub の再評価を経て finding は ARCHIVED 状態に遷移する(数分〜数十分のラグあり)。

9. Block Public Sharing を無効化(SettingValue: Enable

設定を元に戻す。

aws ssm update-service-setting \
  --setting-id /ssm/documents/console/public-sharing-permission \
  --setting-value Enable \
  --region ap-northeast-1
(出力なし)
aws ssm get-service-setting \
  --setting-id /ssm/documents/console/public-sharing-permission \
  --query 'ServiceSetting.{SettingValue:SettingValue,Status:Status}' \
  --region ap-northeast-1
{
    "SettingValue": "Enable",
    "Status": "Customized"
}
Status: Default には戻らない: 一度 update-service-setting を実行すると StatusCustomized のまま。検証前の Default 状態には戻らないが、SettingValue は元の値(Enable)に戻っているため実運用上は問題なし。

10. 設定を戻した後の FAILED 確認

aws configservice start-config-rules-evaluation \
  --config-rule-names securityhub-ssm-automation-block-public-sharing-<サフィックス> \
  --region ap-northeast-1
(出力なし)
sleep 90
aws configservice get-compliance-details-by-config-rule \
  --config-rule-name securityhub-ssm-automation-block-public-sharing-<サフィックス> \
  --query "EvaluationResults[?EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId=='<アカウント ID>'].{ResourceId:EvaluationResultIdentifier.EvaluationResultQualifier.ResourceId,ComplianceType:ComplianceType,ResultRecordedTime:ResultRecordedTime}" \
  --region ap-northeast-1
[
    {
        "ResourceId": "<アカウント ID>",
        "ComplianceType": "NON_COMPLIANT",
        "ResultRecordedTime": "<評価時刻>"
    }
]

ResultRecordedTime がステップ 9 の update-service-setting 実行時刻より後であることを確認する。

設定変更直後の Config トリガーでは COMPLIANT のままの結果が返る場合がある(設定変更の反映ラグにより、直前の評価結果がそのまま返ることがある)。その場合は数分待ってから再度 start-config-rules-evaluation で再トリガーする。

Security Hub への反映を待ってから、finding を確認する。

sleep 120
aws securityhub get-findings \
  --filters '{
    "ComplianceSecurityControlId": [{"Comparison": "EQUALS", "Value": "SSM.7"}],
    "AwsAccountId": [{"Comparison": "EQUALS", "Value": "<アカウント ID>"}],
    "ResourceId": [{"Comparison": "EQUALS", "Value": "AWS::::Account:<アカウント ID>"}],
    "RecordState": [{"Comparison": "EQUALS", "Value": "ACTIVE"}]
  }' \
  --query 'Findings[].{Status:Compliance.Status,ResourceId:Resources[0].Id,UpdatedAt:UpdatedAt}' \
  --region ap-northeast-1
[
    {
        "Status": "FAILED",
        "ResourceId": "AWS::::Account:<アカウント ID>",
        "UpdatedAt": "<更新時刻>"
    }
]

11. クリーンアップ

検証用リソースをすべて削除する。SSM ドキュメントは パブリック共有中は削除できない ため、先に共有解除してから削除する。

ssm-7-pre-bpa-doc の削除(ap-northeast-1)

パブリック共有を解除する。

aws ssm modify-document-permission \
  --name ssm-7-pre-bpa-doc \
  --permission-type Share \
  --account-ids-to-remove all \
  --region ap-northeast-1
(出力なし)

ドキュメントを削除する。

aws ssm delete-document \
  --name ssm-7-pre-bpa-doc \
  --region ap-northeast-1
(出力なし)

ssm-7-post-bpa-doc の削除(ap-northeast-1)

ステップ 7 でパブリック化がブロックされているため、プライベート共有の場合のみ共有解除が必要。

ステップ 7 で --account-ids-to-add <アカウント ID> を実行してプライベート共有していた場合、事前に解除する。

aws ssm modify-document-permission \
  --name ssm-7-post-bpa-doc \
  --permission-type Share \
  --account-ids-to-remove <検証用アカウント ID> \
  --region ap-northeast-1
(出力なし)

ドキュメントを削除する。

aws ssm delete-document \
  --name ssm-7-post-bpa-doc \
  --region ap-northeast-1
(出力なし)

ssm-7-region-test の削除(us-east-1)

パブリック共有を解除する。

aws ssm modify-document-permission \
  --name ssm-7-region-test \
  --permission-type Share \
  --account-ids-to-remove all \
  --region us-east-1
(出力なし)

ドキュメントを削除する。

aws ssm delete-document \
  --name ssm-7-region-test \
  --region us-east-1
(出力なし)

定義ファイルの削除

rm /tmp/ssm-7-pre-bpa-doc.json /tmp/ssm-7-post-bpa-doc.json /tmp/ssm-7-region-test.json

推奨設定

本検証で確認する通り、Block Public Sharing はデフォルトで無効(SSM.7 は FAILED)である。組織内の全アカウント・全 Region で update-service-setting --setting-value Disable を実行して Block Public Sharing を有効化することを推奨する。

aws ssm update-service-setting \
  --setting-id /ssm/documents/console/public-sharing-permission \
  --setting-value Disable \
  --region <リージョン>

SSM を利用する可能性がある Region ごとに個別に設定する必要がある点に注意。

Amazonアソシエイトリンク