Amazon Web Services ブログ

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

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

このシリーズでは、セッションログを Amazon CloudWatch にセキュアに保存し、ログから関連するメトリクスを生成し、特定のイベントについてログを探索できるように、 AWS SSM Session Manager を設定する手順について説明します。Part 1 では、Amazon KMS で Customer Managed Key (CMK) を作成し、そのキーを使用するために必要なアクセス権限を設定します。さらに Amazon CloudWatch でのセキュアな ロググループ を作成し、セッションログを Amazon CloudWatch にセキュアに送信する方法を説明します。Part 2 では、Amazon CloudWatch でログをクエリし、カスタムメトリクスとメトリクスの名前空間を作成し、最後に 高度な分析のために Amazon OpenSearch Service にログを配信するよう設定します。

背景

Session Manager は AWS Systems Manager の機能で、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、オンプレミスインスタンス、および仮想マシン (VM) を、ワンクリックで開始できるインタラクティブなブラウザベースのシェル接続、もしくは AWS Command Line Interface (CLI) を使用して管理できます。AWS SSM は、インバウンドポートを開いたり、踏み台ホストを維持したり、SSH キーを管理したりすることなく、セキュアなインスタンス管理を提供します。従来、システム管理者は基盤となるオペレーティングシステムの機能を使用して SSH セッションアクティビティをローカルでログファイルに記録し、調査のために必要に応じてこのファイルをエクスポートしていました。AWS SSM Session Manager は、Amazon CloudWatch の暗号化されたログストアにセッションログを転送して保存するだけでなく、セッションログを記録するプロセスを自動化できます。Amazon CloudWatch により、収集されたログからメトリクスを抽出し、適切な権限レベルを持つ担当者にのみ情報を共有できるようになります。

ソリューションの概要

このソリューションでは、AWS Identity and Access Manager (IAM) ロールを使用して、コンソールログにアクセスするための適切なアクセス許可レベルを設定します。AWS KMS は、コンソールログを暗号化する CMK を作成するために使用されます。また、このソリューションでは、Session Manager コンソールログを保存するために Amazon CloudWatch にセキュアなロググループを設定します。

このソリューションに関する重要な注意事項は次のとおりです。

  • このソリューションでは、AWS KMS 単一リージョンキーを使用します。このキーは、キーが作成されたリージョンでのみ保存および使用できます。マルチリージョンキーオプションは、複数のリージョンでキーにアクセスする必要がある場合に選択できます。ただし、これには追加の構成や手順が必要になりますが、このブログでは説明しません。

前提

このソリューションの前提は以下の通りです。

  1. AWS SSM をすでに使用している必要があります。そうでない場合は、Quick Setup を使用して、必要な IAM ロールを作成し、サービスを設定してください。
  2. Session Manager を介してアクセスする EC2 インスタンスまたはオンプレミスサーバーには、SSM Agent がインストールされ、適切に設定されている必要があります。Amazon Machine Image (AMI) の多くには、この Agent がプリインストールされています。この設定の詳細については、リンクを参照してください。
  3. インスタンスプロファイルで使用される IAM ロールには、AmazonSSMManagedInstanceCore 管理ポリシー、またはこれによって提供されるものと同等のアクセス権限が含まれている必要があります。
  4. 新しい CloudWatch Logs ロググループの名前を事前に決めておきます。その時、ロググループ名が一意であることを確認してください。(訳註)このブログでは、“ssm-secure-consolelog-group” としています。

前提条件を満たしたら、次のステップに進みましょう。

ステップ1:KMS キーとポリシーの作成

まず、Amazon KMS 内に新しい CMK を作成する必要があります。パスワードリセット操作中のキーボードストロークのマスキングなど、機密性の高いデータの難読化を実現するには、CMK を使用してセッションログを保護する必要があります。KMS キーを作成すると、アカウントに少額の料金がかかります。Amazon KMS の料金の詳細については、こちらをご覧ください。

セッションログデータに KMS 暗号化を使用することがベストプラクティスです。

KMS コンソールから、「カスタマー管理型のキー」を選び、「キーの作成」を押下します。

次に、「対称」キーを指定し、キーマテリアルオリジンに 「KMS 」を指定します。Cloud Hardware Security Module (HSM) の使用や、独自のキーマテリアルをインポートすることも可能です。その場合は、それに応じて処理を進めることができます。リージョナリティは「単一リージョンキー」を選択します。

新しい CMK の名前を入力します。ここでは “session-manager-logs” を使用します。他の名前でも構いません。「次へ」をクリックします。

CMK の作成プロセスで、このキーの管理を許可するユーザーまたはロールを選択します。これは非常にデリケートなアクションであり、できるだけ小さなグループに制限する必要があります。組織内で最も権限のあるユーザーのみを追加することをお勧めします。

このキーのユーザーも定義する必要があります。これもできる限り制限する必要がありますが、セッションログデータの読み取りを許可するグループと、インスタンスプロファイルで使用する IAM ロールを含める必要があります。たとえば、EC2 インスタンスの IAM ロールとしてカスタムロール「EC2RoleSSMCWSecureLogs」を使用している場合、このロールにはキーの使用権限が必要で、リストで選択する必要があります。

次へ」を選択し、「完了」を選択して CMK の作成を完了します。キーが「session-manager-logs」というエイリアス (または自身で指定した名前) で作成されたことを示すメッセージが表示されます。

次に、CloudWatch Logs サービスにこのキーへのアクセス権を付与するために、キーポリシーを手動で編集する必要があります。エイリアスまたはキー ID ハイパーリンクを選択すると、先ほど作成したキーの詳細が表示されます。新しく作成したキーの Amazon Resource Name (ARN) を書き留めます。この値は、ロググループの作成時に必要です。「キーポリシー」セクションで、「ポリシービューへの切り替え」ボタンを選択します。

表示された画面で 「編集」 ボタンを選択し、キーポリシーを手動で編集します。

次に示すポリシーステートメントを新しい権限としてポリシーに貼り付け、<REGION><ACCOUNTNUMBER>、<LOGGROUPNAME>を適切な値に置き換えてください。

{
            "Sid": "Allow access for CloudWatch secure log group",
"Effect": "Allow",
            "Principal": {
                "Service": "logs.<REGION>.amazonaws.com"
            },
            "Action": [
                "kms:Encrypt*",
                "kms:Decrypt*",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:Describe*"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals": {
                    "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:<REGION>:<ACCCOUNTNUMBER>:log-group:<LOGGROUPNAME>"
                }
            }
        }

変更の保存」 を選択して、ポリシーの変更を保存します。キーの ARN を書き留めます。これで、カスタマー管理の対称キーが作成され、そのキーに対し、指定したアクションを「ssm-secure-consolelog-group」という名前のロググループが使用できる権限を付与できました。

ステップ2:CloudWatch Logs ロググループの作成

次のステップでは、CMK のポリシーセクションで指定した名前と同じ名前の暗号化されたロググループを作成します。

CloudWatch Logs コンソールで、「ロググループを作成」を選択します。

「ロググループの詳細」セクションで、CMK のポリシーで指定したもの (ここでは「ssm-secure-consolelog-group」) と同じ名前を入力します。ご希望の保持期間を選択し、前に書き留めた新しい KMS キーの ARN を入力します。「作成」ボタンを選択して、ロググループの作成を完了します。

暗号化されたロググループを作成したら、そのロググループに Session Manager コンソールアクセスログを送信するように Amazon EC2 インスタンスを設定します。

ステップ3:EC2インスタンスプロファイルの更新

EC2 インスタンスが Session Manger ログを CloudWatch に送信できるようにするために、作成した CloudWatch Logs ロググループとの通信を許可するようにEC2 インスタンスで使用される IAM ロールを更新する必要があります。AmazonSSMManagedInstanceCore 管理ポリシーにはこのアクセス権限が含まれていないため、Session Manager を使用する前に手動で追加します。

AmazonSSMManagedInstanceCore 管理ポリシーをアタッチするロールをセットアップし、EC2 インスタンスの IAM ロールとして使用する必要があります。次の例では、 IAM ロール「EC2RoleSSMCWSecureLogs」がEC2で使用されています。

IAM ロールのハイパーリンクをクリックすると、 Amazon IAM が開きます。次のポリシーを既存のロール (この例では「EC2RoleSSMCWSecureLogs」) に追加する必要があります。これにより、ローカル SSM エージェントが新しいログ出力先を使用できるようになります。ここでも、<REGION>、<ACCOUNTNUMBER>および<LOGGROUPNAME>を置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "logs:DescribeLogGroups",
            "Resource": "arn:aws:logs:<REGION>:<ACCOUNTNUMBER>:log-group:*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:CreateLogGroup",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:<REGION>:<ACCOUNTNUMBER>:log-group:<LOGGROUPNAME>:log-stream:*",
                "arn:aws:logs:<REGION>:<ACCOUNTNUMBER>:log-group:<LOGGROUPNAME>"
            ]
        }
    ]
}

このインラインポリシーを追加するには、「インラインポリシーの追加」リンクを選択します。ポリシーエディタが開きます。

ポリシーエディタで 「JSON」タブを選択し、ポリシーステートメントをコピーして貼り付けます。ここで、<REGION><ACCOUNTNUMBER>、<LOGGROUPNAME>を正しい値に置き換えてください。エラーがないことを確認し、「ポリシーの確認」ボタンを選択します。

ポリシーの確認」ページで、インラインポリシーステートメントの名前を指定し、「ポリシーの作成」ボタンを選択します。

これで、ロール内にインラインポリシーとしてポリシーが作成されました。

ステップ4:Amazon CloudWatch Logs へのログ有効化

KMS キー、キーアクセスポリシー、CloudWatch ロググループ、および EC2 の CloudWatch ロググループへのアクセスが適切に設定されたので、CloudWatch へのセッションログの配信を有効にできます。そのためには、AWS SSM コンソールに移動し、「セッションマネージャー」の「設定」を選択します。KMS encryption と CloudWatch logging がデフォルトで無効になっていることがわかります。ソリューションを機能させるには、これを有効にする必要があります。「編集」ボタンを選択して続行します。

まず、チェックボックスを選択し、「KMS Key」 のドロップダウンから前に作成した名前の KMS キーを選択して、KMS 暗号化を有効にします。

CloudWatch logging のセクションまで下にスクロールします。ここで CloudWatch logging を有効にし、前に作成したロググループを選択します。

変更を「保存」して処理を完了します。以上で、ソリューションのセットアップは終了です。ここで、ソリューションが機能しているかどうかを確認するには、Session Manager を使用してセッションを開始し、セッションプロンプトにいくつかのコマンドを入力します。CloudWatch を開き、「ログ」 メニューで「ロググループ」を選択し、作成したロググループを選択すると、セッション、入力されたコマンド、セッション中にユーザーに表示された応答に関する情報を含むログファイルを確認できます。

トラブルシューティング

CloudWatch Logs にログがアップロードされない場合は、ほとんどの場合、Amazon SSM Agent ログから診断できます。EC2 インスタンス (またはオンプレミスサーバー) のログをチェックして、エラーがキーアクセス権限に関連していないか確認します。キーパーミッションマッピングの設定が誤っている例を以下に示します。

grep ERROR /var/log/amazon/ssm/amazon-ssm-agent.log |grep ssm-session-worker | tail 
2021-03-29 23:09:29 ERROR [ssm-session-worker] [me@me.local] [DataBackend] [pluginName=Standard_Stream] error when calling AWS APIs. error details - AccessDeniedException: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/managed-ec2-ssm-role/i-024259ed24a2cbaeb is not authorized to perform: logs:DescribeLogGroups on resource: arn:aws:logs:us-east-1:<ACCOUNT_NUMBER>:log-group::log-stream:
2021-03-29 23:09:29 ERROR [ssm-session-worker] [me@me.local-] [DataBackend] [pluginName=Standard_Stream] Validation failed, err: We couldn't start the session because encryption is not set up on the selected CloudWatch Logs log group. Either encrypt the log group or choose an option to enable logging without encryption.

まとめ

このシリーズのPart 1 では、Amazon CloudWatch に AWS SSM Session Manager のログを保存して検索するプロセスの概要を説明しました。Amazon KMS を使用して暗号化キーを作成し、そのキーを使用して Amazon CloudWatch に送信されるSession Manager のログを暗号化しました。Part 2 では、CloudWatch コンソールを使用してログを検索し、新しいメトリクス名前空間でフィルタパターンに基づいてメトリクスフィルタを設定する方法を説明します。また、詳細な分析のために ログデータを Amazon OpenSearch Service に送信する設定も行います。

著者について

Rich McDonough

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

Manoj Subhadevan

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

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