Security Hub コントロール [SSM.6] Systems Manager Automation のログをCloudWatch Logsに出力する設定をAWS CDKカスタムリソースで実装してみた

Security Hub コントロール [SSM.6] Systems Manager Automation のログをCloudWatch Logsに出力する設定をAWS CDKカスタムリソースで実装してみた

2025.07.25

こんにちは!製造ビジネステクノロジー部の小林です。

2025年7月中旬から、Security Hub コントロール [SSM.6] が検知されるようになりました。このコントロールは、Systems Manager Automation のログがCloudWatch Logsへ出力されていないことを検知するものです。
https://docs.aws.amazon.com/securityhub/latest/userguide/ssm-controls.html#ssm-6

このコントロールに対応するため、今回は AWS CDKカスタムリソースを使ってこのログ設定を有効化する方法についてご紹介します。

現状のAutomationのログ設定を確認

現在のSystems Manager Automationのログ設定がどうなっているか、コンソールで確認してみます。今回はテスト用にRunbookを作成しています。
スクリーンショット 2025-07-25 13.44.21

「Preferences」タブをクリックすると「CloudWatch log stream enabled」がfalseになっていることがわかります。この falseの状態は、現在AutomationのログがCloudWatch Logsに送信されていないことを意味します。
スクリーンショット 2025-07-25 13.47.29

Security Hub コントロール [SSM.6] への対応

このSecurity Hubコントロールに対応するには、Systems Manager AutomationのログをCloudWatch Logsへ出力する設定を有効にする必要があります。手動でコンソールから設定することも可能ですが、今回は AWS CDKカスタムリソースを使ってこの設定を実装します。

AWS CDKカスタムリソースで実装

AWS CDKを使ってAutomationのCloudWatch Logsへのログ設定を有効にするには、'AwsCustomResource'を利用します。AwsCustomResource についての詳細はこちらの記事をご覧ください。

実際にデプロイしたソースは以下の通りです。

import * as cdk from 'aws-cdk-lib';
import * as custom_resources from 'aws-cdk-lib/custom-resources';
import { Construct } from 'constructs';

export class SsmAutomationLoggingCdkStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    /**
     * SSM Automation の CloudWatch Logs 出力を有効化するためのカスタムリソース
     * この設定により、Automation の aws:executeScript アクションの出力が CloudWatch Logs に送信されます
     * @see https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-action-logging.html
     */
    new custom_resources.AwsCustomResource(this, 'SsmAutomationLoggingResource', {
      /**
       * SSM Automation の CloudWatch Logs 出力を有効化
       */
      onCreate: {
        service: 'SSM', // 呼び出すAWSサービスは Systems Manager
        action: 'updateServiceSetting', // 実行するAPIアクションは updateServiceSetting
        parameters: {
          SettingId: `/ssm/automation/customer-script-log-destination`, // 設定IDは、CloudWatch Logs への出力先を制御するパス形式のID
          SettingValue: 'CloudWatch', // 設定値は 'CloudWatch' を指定し、CloudWatch Logs への出力を有効化
        },
        physicalResourceId: custom_resources.PhysicalResourceId.of('SsmAutomationLogging'),
      },
      // このカスタムリソースがAPIコールを実行するためのIAMポリシー
      policy: custom_resources.AwsCustomResourcePolicy.fromSdkCalls({
        resources: custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE,
      }),
    });
  }
}

このカスタムリソースは、内部的に以下のAWS CLIコマンドに相当するAPIを呼び出しています。

aws ssm update-service-setting \
    --setting-id arn:aws:ssm:region:account-id:servicesetting/ssm/automation/customer-script-log-destination \
    --setting-value CloudWatch

https://docs.aws.amazon.com/systems-manager/latest/userguide/automation-action-logging.html

デプロイ後の確認

デプロイ後、再度 Systems Manager Automationのコンソールに戻り、「Preferences」タブを確認してみましょう。
スクリーンショット 2025-07-25 15.12.38
「CloudWatch log stream enabled」がtrueになっていることが確認できました!これで、Security Hubコントロール [SSM.6] も解消されるはずです!

ログはどのCloudWatch Logs ロググループに送られるのだろう?

AutomationのログがCloudWatch Logsに送信される設定が有効になりました。しかし、この設定でログはどのCloudWatch Logs ロググループに送られるのでしょうか?

今回デプロイしたCDKソースでは、ロググループの具体的な指定は行っていません。updateServiceSetting API には、ロググループを指定するための別の SettingId (/ssm/automation/customer-script-log-group-name) が存在しますが、今回のソースではそれを設定していません。

この場合、SSM Automation は以下のデフォルトの動作に従います。
スクリーンショット 2025-07-25 21.18.31

この画面で以下のような記載があります。

If the default log group doesn't exist yet (/aws/ssm/automation/executeScript), Systems Manager creates it for you.

これは、「デフォルトのロググループ(/aws/ssm/automation/executeScript)がまだ存在しない場合、Systems Manager が自動的に作成します。」という意味です。

カスタムリソースでは、ロググループを指定していないため、このデフォルトロググループが自動作成されます。

ロググループが作成されるタイミング

Automationが初めてaws:executeScriptアクションを含むRunbookを実行した際に、Systems Managerが自動的にこのロググループを作成してくれます。aws:executeScriptはこちらのアクションです。
スクリーンショット 2025-07-25 16.56.03
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/automation-action-executeScript.html

また、aws:executeScriptアクション以外のアクションについてはログが作成されません。以下は公式ドキュメントからの引用です。

aws:executeScriptアクションを使用しないドキュメントに対してはロググループやログストリームを作成しません。ドキュメントが を使用する場合 aws:executeScript、CloudWatch Logs に送信される出力は、それらのアクションに関係するだけです。

IAM 権限について

Systems Manager AutomationがCloudWatch Logsにログを送信するためには、Runbookを実行するユーザーまたはIAM ロールに以下の権限が必要です。

  • logs:CreateLogGroup
  • logs:CreateLogStream
  • logs:DescribeLogGroups
  • logs:DescribeLogStreams
  • logs:PutLogEvents

しかし今回実装した以下のソースで実現しているのは、「Systems Manager AutomationがCloudWatch Logsにログを送ることを許可する」 部分の許可設定です。

policy: custom_resources.AwsCustomResourcePolicy.fromSdkCalls({
  resources: custom_resources.AwsCustomResourcePolicy.ANY_RESOURCE,
}),

CDK コードをデプロイすることと、Runbookが実際にCloudWatch Logsにログを書き込むことは、別々の権限が必要になります。

今回は、Runbookをテスト用に作成し、実際の利用は想定していないため、ログ書き込み用の権限付与は行いませんでした。Runbookを実際に利用しており、ログ出力をしたい方は権限付与を別に行う必要があります。

Tips

Systems Manager Automationを使用していない場合でも、このコントロール [SSM.6]は検知されるのでしょうか?結論として、Automationを使用していなくてもこのコントロールは検知されます。しかし、この場合も今回利用したカスタムリソースで、CloudWatchへのログ設定を有効にできます。

Automationを利用していない場合のログ設定確認は、コンソールで以下のように確認できます。
スクリーンショット 2025-07-25 20.54.52
スクリーンショット 2025-07-25 20.56.34

まとめ

  • Security Hub コントロール [SSM.6] は、Systems Manager AutomationのCloudWatch Logs出力設定をチェック
  • AWS CDKカスタムリソースでupdateServiceSetting API を呼び出して対応可能
  • 実際のログ出力には、Runbook実行ユーザーへの追加IAM権限が必要
  • デフォルトでは /aws/ssm/automation/executeScript ロググループが自動作成される

おわりに

今回は、AWS CDKカスタムリソースを使ってSystems Manager AutomationのCloudWatch Logs ログ設定を有効化する方法についてご紹介しました。この記事が、Security Hub運用のお役に立てれば幸いです!

この記事をシェアする

facebookのロゴhatenaのロゴtwitterのロゴ

© Classmethod, Inc. All rights reserved.