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 そのまま(例: <アカウント ID>)、Security Hub finding の ResourceId は AWS::::Account:<アカウント ID> 形式(例: AWS::::Account:<アカウント ID>)。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 しない限りパブリックにはならない |
| 予防(SCP / RCP / 宣言型ポリシー) | なし | Control Tower の標準予防コントロールに SSM Block Public Sharing を強制するものは存在しない。カスタム SCP で ssm:UpdateServiceSetting や ssm: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.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 | 本記事で検証(3. デフォルト状態の FAILED 確認) |
| 2 | update-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 違反を作れないことの確認) |
| 5 | Region 独立性(空間軸): ap-northeast-1 で Disable 設定しても、別 Region(us-east-1)の SSM.7 設定は変わらず、その Region ではパブリック化もブロックされない | 本記事で検証(8. Region 独立性の確認) |
| 6 | update-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 秒)。ただしStatusはCustomizedのまま(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.7(securityhub-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-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(ユーザー設定済み)に変化している。
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 実行時刻より後であることを確認する。
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 は 既存のパブリックドキュメントを自動的にプライベート化しない こと(遡及しないこと)を実証する。
まず 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-1An 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 を実行する必要がある。
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 を実行すると Status は Customized のまま。検証前の 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 実行時刻より後であることを確認する。
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 ごとに個別に設定する必要がある点に注意。