コンテンツにスキップ

SSM.7

本記事は手順書作成段階で、実機検証は未実施。検証実施時に手順書の差分や出力例を更新する予定。
検証日: (未実施)/ リージョン: ap-northeast-1

概要

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 そのまま(例: 250544872868)、Security Hub finding の ResourceIdAWS::::Account:<アカウント ID> 形式(例: AWS::::Account:250544872868)。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 しない限りパブリックにはならない
予防(AWS サービス機能)SSM の Block Public Sharing(update-service-setting /ssm/documents/console/public-sharing-permission Disableアカウント全体で SSM ドキュメントのパブリック共有を物理的にブロックする
検出(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本記事で検証(2. デフォルト状態の FAILED 確認
2update-service-setting --setting-value Disable で Block Public Sharing を有効化後、SSM.7 が PASSED本記事で検証(4. Block Public Sharing 有効化後の PASSED 確認
3update-service-setting --setting-value Enable で戻した後、SSM.7 が FAILED に戻る本記事で検証(6. 設定を戻した後の FAILED 確認

結果

(検証前)

検証環境

検証環境の構成図

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

検証の流れ

    flowchart LR
    A[1. 現状確認<br>SettingValue: Enable] --> B[2. FAILED 確認]
    B --> C[3. BPA 有効化<br>SettingValue: Disable]
    C --> D[4. PASSED 確認]
    D --> E[5. BPA 無効化<br>SettingValue: Enable]
    E --> F[6. FAILED 確認]
  
検証後の状態: 本検証では初期状態が 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 の状態。この場合はステップ 2 で PASSED を確認してからステップ 5 に飛んで Enable に戻し、ステップ 6 で FAILED 確認する順序で進めるとよい。

2. デフォルト状態の 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": "<更新時刻>"
    }
]

3. 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(ユーザー設定済み)に変化している。

4. 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 がステップ 3 の 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": "<更新時刻>"
    }
]

5. 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)に戻っているため実運用上は問題なし。

6. 設定を戻した後の 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 がステップ 5 の 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": "<更新時刻>"
    }
]

推奨設定

本検証で確認する通り、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アソシエイトリンク