Amazon Web Services ブログ

AWS Systems Manager Session Manager コンソールログを検索する — Part 2

AWS System Manager を Amazon Key Management Services (KMS)Amazon CloudWatch、および Amazon OpenSearch Service と組み合わせることで、ユーザーセッションログを暗号化して安全に保存し、ログデータを探索することができます。これらのツールは統合が容易で、強力な分析機能を使用できます。

このシリーズの Part1 では、Amazon Key Management Service でカスタマー管理型のキーを作成し、そのキーを使用して Amazon CloudWatch にセッションログを安全に保存するように AWS Systems Manager Session Manager と Amazon CloudWatch を設定しました。このパートでは、Amazon CloudWatch でログをクエリし、カスタムメトリクスメトリクス名前空間を作成し、最後に Amazon OpenSearch Service にログを配信して高度な分析を行う方法について説明します。

CloudWatch で結果をクエリする

セキュアな CloudWatch ロググループにログストリームが書き込まれたので、Session Manager セッション中にユーザーが実行した可能性のあるコマンドについてログストリームをクエリしてみましょう。ログストリームの名前には、ユーザー ID (Session Manager セッションを開始したユーザーの AWS コンソール ID) とそれに続く英数字のセットが含まれ、これは第一段階のフィルタリングに役立ちます。特定のユーザーのログを検索する場合は、ユーザー ID でログストリーム名をフィルタリングし、ログストリームをクリックして詳細を表示できます。関心のあるユーザーを特定したあとは、ログエントリをふるいにかけてそのユーザーが実行したものを見つける必要があります。CloudWatch は単語検索機能を備えているため、検索が簡単になります。例として、全ユーザーを対象に過去 12 時間以内に “sudo” コマンドが使用されたか調べてみましょう。

CloudWatch ロググループから、Session Manager のログ用に作成したロググループを選択します。Session Manager で Amazon Elastic Compute Cloud (EC2) インスタンスにアクセスするさまざまなユーザーのログストリームのリストが表示されます。「Search all」ボタンを選択します。

これにより、すべてのログイベントが行としてリストされた画面が表示されます。検索バーに “sudo” を入力し、Enter を押下します。時間枠を過去 12 時間に制限するには、「12h」をクリックします。”sudo” という単語を含む、過去 12 時間以内に発生したイベントのみがフィルタリングされて表示されます。返された各行を選択して、入力した正確なコマンドとシステムの応答を調べることができます。この方法では、プレーンテキスト検索を使用してイベントのリストを絞り込むことができます。

過去 12 時間に “sudo” というテキストがイベントログに含まれていたものとして、10 個のログイベントがありました。より具体的に、例えばソフトウェアのインストールに使用されたイベントの数を調べる場合には、“sudo yum install” と検索できます。検索バーの “sudo” を引用符で囲んだ “sudo yum install” に置き換えて、Enter を押下します。指定した引用符で囲まれたテキストが見つかったイベントのみを一覧表示します。今回のケースでは、一致するものが 2 つしか見つかりませんでした。ユーザーは “sudo” コマンドを使用して Apache Web サーバー (httpd) をインストールし、2 つ目のケースでは nano エディターをインストールしています。

メトリクスフィルタを使ってメトリクスを作る

CloudWatch には、イベントログの検出結果に基づいて CloudWatch メトリクスを生成できる機能が用意されています。メトリクスフィルタは、ログイベント内の用語、フレーズ、値を検索して一致させるメカニズムです。メトリクスフィルタの設定に一致する用語が見つかったら、その一致数を CloudWatch メトリクスに追加できます。ここでは、”sudo” を使用するなど、ユーザーがセッション中に実行した、昇格された権限を必要とするコマンドの数を特定する例を考えてみましょう。

では、CloudWatch で “sudo” をカウントするメトリクスを設定してみましょう。「ロググループ」で、該当のロググループ名の横にあるチェックボックスをオンにし、「アクション」から「メトリクスフィルターを作成」を選択します。

次の画面で「フィルターパターン」に “sudo” と入力します。「パターンをテスト」セクションで、パターンマッチを試すことができるログデータを選択します。選択すると、「イベントメッセージをログ記録」セクションにイベントのサンプルリストが表示され、「パターンをテスト」 ボタンを選択すると、結果セクションに “sudo” の付いたイベントが表示されます。ここで、「Next」を押下します。

メトリクスフィルターの名前を入力します。ここでは “sudo-filter” を使いました。メトリクス名前空間では、「新規作成」 オプションを選択したままにし、値として “ssmlogs-ec2” と入力します。メトリクス名には “sudo-count” と入力します。メトリクス名は名前空間内で一意である必要があります。新しい名前空間を作成しているので、これは一意です。「メトリクス値」フィールドに “1” と入力します。これはフィルターマッチに割り当てられる値です。”sudo” という単語を含むログイベントが見つかると値 “1 ” に相当します。デフォルト値を “0” に設定し、「Unit」フィールドで 「カウント」を選択します。「次へ」ボタンを選択します。

内容を確認し、「メトリクスフィルターを作成」ボタンを押下します。

メトリクスフィルターが作成されたことを示す確認メッセージが表示されます。次のステップとして、過去 1 時間に “sudo” コマンドが使用された回数を表示するウィジェットを作成しましょう。Systems Manager Session Manager を使用して EC2 インスタンスでいくつかのセッションを開始し、”sudo” でいくつかのコマンドを実行しておいてください。メトリクスフィルターとカスタムメトリクスは、メトリクスの作成後に生成されたデータからのみメトリクスを収集することに注意してください。以前の “sudo” の呼び出しはカウントされない場合があります。左側のナビゲーションペインで、「メトリクス」メニューの 「すべてのメトリクス」を選択します。これで、作成した名前空間 「ssmlogs-ec2」が  custom namespaces セクションに一覧表示されます。

ssmlogs-ec2」「ディメンションなしのメトリクス」を選択します。「グラフ化したメトリクス」タブの「sudo-count」の横にあるチェックボックスを選択し、「統計」ドロップダウンから「合計」を選択します。トップパネルで、3h を選択しグラフタイプに「数値」を選び、過去 3 時間の “sudo” が実行された回数を確認します。グラフ領域に、過去 に “sudo” がログエントリで見つかった回数が表示されます。

動的ラベルや数式を追加するなど、グラフをさらにカスタマイズするには、「グラフ化されたメトリクス」 タブを選択します。ここでは、メトリクスの前に名前空間 (ns) 名を追加し、メトリクスのラベルを “sudos” に変更しました。ここでは “[ns: ssmlogs-ec2] sudos” と読み込まれます。ラベル名の横にある編集アイコンを選択し、 “[ns: ${PROP(‘Namespace’)}] sudos” と入力して適用します。ラベルが更新され、グラフ内の数値を選択すると、メトリクスの詳細がポップアップとして表示されます。

ユースケースに基づいて、設定したカスタムメトリクスをダッシュボードに追加したり、メトリクスの値が特定のしきい値を超えた場合にアラームをトリガーするために使用したりできます。

Advanced Example : Amazon OpenSearch Service への配信

CloudWatch ログのサブスクリプション機能を使用して、Session Manger イベントログをほぼリアルタイムで Amazon OpenSearch Service にストリーミングし、高度な分析を行うように CloudWatch ロググループを設定できます。ログは既存の OpenSearch Service ドメインにストリームしたり、コマンドラインを使用してドメインをすばやく作成したりできます。コンソールとコマンドラインを使用して新しいドメインを作成するための詳細なガイドは、こちらにあります。この投稿では「my-ssm-logs-domain」という名前のドメインを使用します。新しい OpenSearch Service ドメインを作成する場合、ドメインが初期化されるまでに約 15 分かかります。ドメインの初期化が完了し、ドメインステータスが「アクティブ」になった後、次のステップに進んでください。

CloudWatch ログサブスクリプションでは、Lambda 関数を使用してログイベントを OpenSearch Service ドメインにストリーミングします。Lambda 関数が OpenSearch Service ドメインと通信できるようにするには、適切な信頼関係とアクセス権限を持つ IAM ロールを AWS IAM で設定する必要があります。最初のステップとして、新しいポリシーを設定しましょう。

コンソールで IAM を選択し、左側のナビゲーションメニューから「ポリシー」を選択します。右上の「ポリシーを作成」ボタンを選択し、次の画面で JSON エディタを選択します。次のポリシーをエディタにコピーし、<REGION>、<ACCOUNT-ID>および<TARGET-DOMAIN-NAME>値を更新します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "es:*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:es:<REGION>:<ACCOUNT-ID>:domain/<TARGET-DOMAIN-NAME>/*"
        }
    ]
}

次のステップ」「確認」ボタンを選択します。このポリシーの名前をmySSMDomainESPolicy とし、「ポリシーの作成」を選択してポリシーを作成します。

次に、Lambda 関数がログイベントをストリーミングするために使用するロールを作成します。AWS IAM コンソールの左側のナビゲーションメニューから「ロール」を選択し、右上の「ロールを作成」ボタンを選択します。このロールは Lambda 用であるため、AWS サービスリストから Lambda を信頼されたエンティティとして選択します。「次のステップ」ボタンを選択し、mySSMDomainESPolicy を検索します。これは前のステップで作成したポリシーです。名前の横にあるチェックボックスを選択してポリシーを選択し、「次のステップ」を選択し、最後に「確認」ページに移動します。ロールに LambdaSSMLogsStream という名前を付け、「ロールの作成」を選択します。これにより、Lambda 関数が OpenSearch Service ドメインにイベントログを送信するために使用できる、必要なアクセス権限を持つ IAM ロールが作成されます。Lambda 関数が実行されたときに CloudWatch で Lambda 関数の実行ログを確認する場合は、AWSLambdaBasicExecutionRole ポリシーをロールにアタッチします。このポリシーのアクセス権限は、Lambda 関数が CloudWatch に実行ログを書き込むために必要です。

OpenSearch Service ドメインのステータスがアクティブになったら、コンソールで CloudWatch に移動し、「ロググループ」で前のセクションで作成したロググループを選択します。アクションメニューから 「サブスクリプションフィルター」を選択し、サブメニューで 「Create Amazon OpenSearch Service subscription filter」を選択します。

次の画面で、宛先としてドロップダウンメニューから Amazon OpenSearch Service クラスタードメイン名を選択します。「Lambda Function」セクションで、ドロップダウンメニューからLambdaSSMLogsStream ロールを選択します。

「ログの形式」ドロップダウンメニューで、形式として「JSON」を選択します。サブスクリプションフィルターを使用すると、フィルターされたログイベントのみを OpenSearch Service に送信できます。今回のケースでは、テキストに “sudo” が入っているコマンドだけを送ります。サブスクリプションフィルターのパターンに “sudo” と入力し、サブスクリプションフィルター名に “sudo-filter” と入力します。

パターンをテスト」セクションを使用して、パターンで関連するイベントが選択されるかどうかをテストおよび確認できます。ドロップダウンメニューからログファイルを選択すると、ファイル内のログイベントがメッセージボックスに表示されます。「パターンをテスト」 ボタンを選択すると、「結果」セクションに “sudo” を含むログのイベントが入力されます。ストリーミングを開始するには、「ストリーミングを開始」ボタンを選択します。

以前のイベント (サブスクリプションフィルターを設定した時より前) は OpenSearch Service には送信されず、新しいイベントのみが転送されることに注意してください。Session Manager で “sudo” コマンドを含む新しいイベントをいくつかトリガーしてみましょう。また、 “sudo” という単語を含むイベントだけが OpenSearch Service にストリームされることを確認してください。

Systems Manager で何らかのアクティビティを生成し、CloudWatch にログが表示されることを確認したら、Amazon OpenSearch Service ダッシュボードにログインし、Amazon OpenSearch Service に送信された “sudo” コマンドを含む Systems Manager のログが見つかるかどうかを確認します。”sudo” コマンドは一例です。このソリューションは、組織のニーズに基づいてダッシュボードを拡張できます。

クリーンアップ

この記事の手順に従って作成されたリソースに対して料金が発生する場合があります。AWS Session Manager ログの統合を無効にするには、AWS コンソールで AWS System Manager に移動し、Session Manager の「設定」を編集して KMS と CloudWatch の統合を無効にします。AWS KMS キーを無効化または削除するには、「Customer Managed Key」セクションに移動し、作成したキーを無効にします。Amazon Opensearch Service との統合を無効にするには、AWS コンソールで Amazon CloudWatch に移動し、ロググループのサブスクリプションフィルタを選択して削除します。ロググループはコンソールから削除することもできます。

まとめ

このブログでは、CloudWatch コンソールを使用してログを検索し、フィルターパターンに基づくメトリクスフィルターを設定し、新しいカスタム名前空間を設定し、名前空間に新しいカスタムメトリクスを追加しました。また、カスタムメトリクスに基づいたダッシュボードウィジェットも作成しました。次に、Lambda 関数が Amazon CloudWatch からログを取得し、Amazon OpenSearch Service に送信できるように IAM ポリシーを設定しました。Amazon OpenSearch Service ドメインにログを送信するサブスクリプションフィルターを作成し、Amazon OpenSearch Service ダッシュボードでログをクエリできました。AWS Systems Manager の詳細については、こちらをご覧ください。Amazon CloudWatch の詳細については、こちらを参照してください。

著者について

Rich McDonough

Rich McDonough は、トロントを拠点とする AWS のシニア WW CloudOps スペシャリストソリューションアーキテクトです。彼は主に、Cloud Operations で、お客様が AWS の使用を安全かつ安全に拡大できるよう支援し、可観測性の実践とサービスの採用を顧客に導きます。2018 年に AWS に入社する前は、顧客のクラウドへの移行を支援していました。

Manoj Subhadevan

Manoj Subhadevan は、Amazon Mobile Shopping Foundation のエンジニアリングリーダー兼ソフトウェア開発マネージャーです。彼のチームは Amazon モバイルショッピングアプリのリリースエンジニアリングを担当し、AWS のテクノロジーを使用して規模を拡大しています。自由時間には、音楽を聴き、世界中を旅する予定です。

翻訳はSA石橋が担当しました。原文はこちら