Security Hubコントロール [SSM.7] パブリック共有のブロック設定をAWS CDKカスタムリソースで有効化してみた
こんにちは!製造ビジネステクノロジー部の小林です。
2025年7月中頃から、Security Hubコントロール[SSM.7]が検知されるようになりました。このコントロールは、AWS Systems Manager ドキュメントのパブリック共有ブロック設定を監視し、無効化されている場合にコントロールが失敗となります。
パブリック共有ブロック設定を有効化することでこのアラートは解消できます。
手動で有効化する場合は以下の記事をご参照ください。
今回は、AWS CDKカスタムリソースを利用して、このパブリック共有ブロック設定を有効化する方法をご紹介します。
カスタムリソースとは?
通常、CDKで利用できるリソースはAWSの各サービスに対応したコンストラクトとして提供されています。しかし、AWSのサービスの中には、CDKに直接対応するコンストラクトが提供されていない設定項目や操作も存在します。
このような場合、カスタムリソースが役立ちます。Lambda関数を自分で書く必要がなく、宣言的にAWS APIを呼び出すことができます。
なぜカスタムリソースで実装するのか?
Security Hubの[SSM.7]コントロールで指摘される「Systems Manager ドキュメントのパブリック共有ブロック設定」は、執筆時点(2025年7月)ではAWS CDKの標準コンストラクトとしては提供されていません。
この設定を手動で有効化することは可能ですが、IaCで管理しているAWS環境において、可能な限りIaCでリソースを管理したいですよね。カスタムリソースを利用することで、このパブリック共有ブロック設定をCDKのコードとして管理することができます。
やってみた
それでは、実際にAWS CDKカスタムリソースを使用して、Systems Manager ドキュメントのパブリック共有ブロック設定を有効化していきます。
Systems Manager ドキュメントのパブリック共有ブロック設定が有効になっていないことを確認します。
次に以下のカスタムリソースを実装します。
import * as cdk from 'aws-cdk-lib';
import * as custom_resources from 'aws-cdk-lib/custom-resources';
import { Construct } from 'constructs';
export class SsmPublicSharingBlockCdkStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Systems Manager ドキュメントのパブリック共有ブロック設定を有効化するカスタムリソース
new custom_resources.AwsCustomResource(this, 'SsmPublicSharingBlockCustomResource', {
/**
* Lambda関数の実行タイミングを指定
* 'onCreate'はリソース作成時にのみ実行されます
* @see https://dev.classmethod.jp/articles/aws-cdk-custom-resource-aws-sdk-call/
*/
onCreate: {
service: 'SSM', // 呼び出すAWSサービス
action: 'updateServiceSetting', // 呼び出すAPIアクション
parameters: {
SettingId: '/ssm/documents/console/public-sharing-permission',
SettingValue: 'Disable', // 'Disable'でパブリック共有をブロック
},
// リソースの物理IDを指定
physicalResourceId: custom_resources.PhysicalResourceId.of('SsmPublicSharingBlockSetting'),
},
// AwsCustomResourceがAPIコールを実行するためのIAMポリシー
policy: custom_resources.AwsCustomResourcePolicy.fromSdkCalls({
resources: custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE,
}),
});
}
}
ソース説明
1. 基本構造
new custom_resources.AwsCustomResource(this, 'SsmPublicSharingBlockCustomResource', {
});
AwsCustomResourceは内部的にLambda関数を作成し、指定されたAWS SDK呼び出しを実行します。
2. onCreate プロパティ
onCreate: {
service: 'SSM', // 呼び出すAWSサービス
action: 'updateServiceSetting', // 呼び出すAPIアクション
parameters: {
SettingId: '/ssm/documents/console/public-sharing-permission',
SettingValue: 'Disable',
},
physicalResourceId: custom_resources.PhysicalResourceId.of('SsmPublicSharingBlockSetting'),
}
service: AWS SDKのサービス名(この場合はSSM)
action: 実行するAPI操作(updateServiceSetting)
parameters: APIに渡すパラメータ
physicalResourceId: CloudFormationがリソースを識別するためのID
3. 実行タイミングオプション
AwsCustomResourceでは以下の実行タイミングを指定できます。
- onCreate: リソース作成時のみ実行
- onUpdate: リソース更新時のみ実行
- onDelete: リソース削除時のみ実行
詳細はこちらの記事をご覧ください。
4. policy プロパティ
policy: custom_resources.AwsCustomResourcePolicy.fromSdkCalls({
resources: custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE,
})
Lambda関数が実行するために必要なIAMポリシーを自動生成します。
CLI コマンドとカスタムリソースの対応関係
カスタムリソースからは以下のCLIをSDKで呼び出しています。
aws ssm update-service-setting \
--setting-id /ssm/documents/console/public-sharing-permission \
--setting-value Disable \
--region 'The AWS リージョン you want to block public sharing in'
AwsCustomResourceは、AWS CLIコマンドを内部的にAWS SDK呼び出しに変換し、Lambda関数として実行します。
onCreate: {
service: 'SSM', // aws ssm に対応
action: 'updateServiceSetting', // update-service-setting に対応
parameters: {
SettingId: '/ssm/documents/console/public-sharing-permission', // --setting-id に対応
SettingValue: 'Disable', // --setting-value に対応
},
// --region は自動的にスタックのリージョンが使用される
}
確認
デプロイ後、パブリック共有のブロック設定が有効になっているか確認してみましょう。
ブロック設定が有効化されていることが確認できましたね!
おわりに
今回は、Security Hubコントロール[SSM.7] パブリック共有のブロック設定をAWS CDKカスタムリソースで有効化する作業をやってみました!この記事がどなたかの参考になれば幸いです。