SSM.7
概要
SSM.7 は、アカウントの Block Public Sharing 設定 が有効になっているかをチェックする Security Hub CSPM コントロールである。対応する Config ルールは ssm-automation-block-public-sharing。対象リソースタイプは AWS::::Account(アカウント単位のコントロール)。
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.7 は「アカウントの Block Public Sharing 設定値(/ssm/documents/console/public-sharing-permission)が Disable であるか」をチェックする。
| アカウント設定 | SettingValue | SSM.7 |
|---|---|---|
| Block Public Sharing 有効(SSM ドキュメントのパブリック共有をブロック) | Disable | PASSED |
| Block Public Sharing 無効(SSM ドキュメントのパブリック共有を許可) | Enable | FAILED |
この設定は Region 単位のアカウント設定 で、各 Region で個別に設定する必要がある。
SettingValue: Disable が「Block Public Sharing を有効にした状態」、SettingValue: Enable が「Block Public Sharing を無効にした状態」である。設定 ID 名の public-sharing-permission に対する値として解釈するため、Disable(パブリック共有を Disable する)が望ましい状態となる。ResourceId 形式(SSM.4 と同じパターン): Config(AWS::::Account リソース)の ResourceId はアカウント ID そのまま(例: 250544872868)、Security Hub finding の ResourceId は AWS::::Account:<アカウント ID> 形式(例: AWS::::Account:250544872868)。get-compliance-details-by-config-rule と securityhub get-findings でフィルタを書く際は両者の違いに注意。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.4 | SSM.7 |
|---|---|---|
| 評価単位 | 個別 SSM ドキュメント | アカウント(Region 単位) |
| 対象リソース | AWS::SSM::Document | AWS::::Account |
| 評価内容 | ドキュメントがパブリック共有されているか | アカウントの Block Public Sharing 設定が有効か |
| Config ルール | ssm-document-not-public | ssm-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 のまま)。
SettingValue: Enable、Status: Default、LastModifiedUser: System であり、公式ブログの記述通り。つまり 新規アカウントでも SSM.7 は初期状態で FAILED になる。Block Public Sharing を有効化するには、各アカウント・各 Region で明示的に update-service-setting する必要がある。本記事で確認すること
| # | 検証観点 | 状態 |
|---|---|---|
| 1 | デフォルト状態(SettingValue: Enable)で SSM.7 が FAILED | 本記事で検証(2. デフォルト状態の FAILED 確認) |
| 2 | update-service-setting --setting-value Disable で Block Public Sharing を有効化後、SSM.7 が PASSED | 本記事で検証(4. Block Public Sharing 有効化後の PASSED 確認) |
| 3 | update-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-setting で Disable に変更する。
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"
}SettingValue が Disable、Status が Customized(ユーザー設定済み)に変化している。
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 実行時刻より後であることを確認する。
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 を実行すると Status は Customized のまま。検証前の 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 実行時刻より後であることを確認する。
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 ごとに個別に設定する必要がある点に注意。