AWSSSMを使用したSSHロギングとセッション管理

公開: 2022-03-11

LinuxでSSHログを保持するためのカスタムツールまたはスクリプトの設定は、面倒でエラーが発生しやすい場合があります。

エンジニアは、 rootshscreen 、または別のユーティリティを使用してユーザーアクティビティをログに記録できますが、ユーザー権限が正しく設定されていない場合、熟練したユーザーは監査ログを消去して自分のトラックをカバーできます。 もう1つのオプションは、カーネルレベルでロギングを設定することですが、それに必要な専門知識はそれほど一般的ではありません。

ありがたいことに、Linuxコマンドを1つも記述せずに、ユーザーアクティビティをログに記録する方法があります。 次のサービスが必要になります。

  • EC2
  • IAM(IDおよびアクセス管理)
  • KMS(鍵管理サービス)
  • CloudWatchログ(および/またはS3)
  • AWS Systems Manager(旧称SSM)

それぞれの設定方法を見てみましょう。

EC2とIAM

EC2インスタンスの起動は通常かなり簡単ですが、起動中に実行する必要のある重要なタスクが1つあります。インスタンスにIAMロールをアタッチする必要があります。そうしないと、この最後に詳述されている期待される結果を達成できません。記事。

EC2インスタンスに関連付けるIAMロールには、組み込みのAmazonSSMManagedInstanceCoreポリシーに加えて、このポリシー(インラインまたはカスタマーマネージドとしてアタッチされている)が必要です。

 { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:DescribeLogGroups", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "*" } ] }

IAMの役割とは別に、通常は次のEC2インスタンス構成を使用します。

  • OSはAmazonLinux2です。これは、デフォルトでAWS Systems Manager Agent(SSM Agent)がインストールされているためです。 (Ubuntuディストリビューションも同様です。これもオプションです。)
  • インスタンスタイプはt3.microです(ただし、どのタイプでもかまいません)。
  • この演習ではSSHポートを開く必要がないため、AWSがVPCに割り当てるデフォルトのセキュリティグループが機能します。

EC2インスタンスが起動するのを待たずに、KMSのセットアップを開始できます。

KMS

CloudWatchに配信されるすべてのセッションログを暗号化して保存する場合は、KMSキーが必要です。 KMSサービスに行き、キーを作成しましょう。

ブレッドクラム「KMS」、「カスタマーマネージドキー」、「キーの作成」を含むAWSのスクリーンショット。現在、ステップ1:「キーの設定」にあります。 「キータイプ」は「対称」(選択)または「非対称」に設定できます。 [詳細オプション]で、[キーマテリアルの起点]の設定は[KMS](選択済み)、[外部]、または[カスタムキーストア(CloudHSM)]になります。
ステップ1:対称鍵タイプを選択します。

同じブレッドクラムを使用したAWSのスクリーンショット。ステップ2:「ラベルを追加」にあります。 Aliasフィールドは「cwlg」に設定され、オプションのDescriptionフィールドは空白のままになり、オプションのTagsフィールドにはタグが追加されません。
ステップ2:キーに名前を付ける。

同じブレッドクラムを使用したAWSのスクリーンショット。ステップ3:「主要な管理者権限を定義する」にあります。最初のフィールド「キー管理者」には、名前、パス、およびタイプの列を持つ10行の結果(1/3ページ)を含む空白の検索ボックスがあります。最初の行(それぞれの列の値が「admin」、「/」、および「User」)のみが、対応するチェックボックスがオンになっています。もう1つのフィールド「キーの削除」には、「キー管理者にこのキーの削除を許可する」という1つのオプションがあり、チェックボックスもオンになっています。
ステップ3(オプション):管理者を割り当てます。

AWSアカウントのrootユーザー以外のユーザーがキーを管理できるように管理者を割り当てることをお勧めしますが、他のユーザーがアクセスする必要がない場合は、手順3をスキップできます。

ここでは、IAMユーザー「admin」をキー管理者として選択しましたが、任意のユーザーまたはロールを自由に選択できます。 管理者のキー削除権限を無効にすることもできます。

同じブレッドクラムを使用したAWSのスクリーンショット。ステップ4:「キーの使用許可を定義する」にあります。最初のフィールド「このアカウント」には、手順3と同じ検索結果が表示されますが、いずれもチェックされていません。もう1つのフィールド「その他のAWSアカウント」には、何も追加されていません。
ステップ4:ユーザー割り当てページをスキップします。

このキーは、SSHログの暗号化および復号化操作のためにCloudWatch Logsサービスでのみ使用されるようにするため、このキーにユーザーを割り当てることはありません。

同じブレッドクラムを使用したAWSのスクリーンショット。現在はステップ5:「レビュー」にあります。最初のフィールド「キー設定」には、「キータイプ」が「対称」、「キー仕様」が「SYMMETRIC_DEFAULT」、「キー使用法」が「暗号化と復号化」、「オリジン」が「AWS_KMS」と表示されます。 。」次のフィールド「エイリアスと説明」には、説明のない1つのエイリアス「cwlg」が一覧表示されます。次のフィールド「タグ」にはデータが表示されません。最後のフィールド「キーポリシー」には、JSON形式のポリシーが事前に入力されたテキストボックスが含まれています。
ステップ5:構成を確認し、デフォルトのキーポリシーを交換します。

レビューページでは、CloudWatch Logsがキーを使用するためのパーミッションが含まれていないため、KMSで生成されたキーポリシーを変更する必要があります。 これを次のポリシーに置き換えます。

 { "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:user/USERNAME" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow access to CloudWatch Log", "Effect": "Allow", "Principal": { "Service": "logs.REGION.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT_ID:*" } } } ] }

必ずすべてのプレースホルダーを置き換えてください。

  • ACCOUNT_IDがAWSアカウントIDになります。
  • USERNAMEは、手順3で選択した管理者ユーザー名になります。この手順をオプトアウトした場合は、ここで2番目のステートメントブロック( "Sid": "Allow access for Key Administrators" )を削除します。
  • REGIONは、サービスをデプロイする地域IDコードになります(例: us-west-1 )。

これで、KMSの準備が整いました。

CloudWatchロググループ

次に、SSMエージェントがSSHセッションログを送信できるCloudWatch Logグループ(および/またはS3バケット-以下を参照)が必要です。 作成しましょう。

ブレッドクラム「CloudWatch」、「CloudWatch Logs」、「Log groups」、「Createloggroup」を含むAWSのスクリーンショット。マルチステップサイドバーはありません。最初のフィールド「ロググループの詳細」には、「ロググループ名」(「ssm-session-demo」に設定)、「保持設定」(ドロップダウンから「期限切れにしない」に設定)の3つのサブフィールドがあります。 「KMSキーARN-オプション」(「arn:aws:kms」で始まる切り捨てられた値に設定)。 2番目のフィールド「タグ」にはタグがありません。
「CloudWatchLogs」ロググループを作成します。

KMSキーのARNフィールドに注意してください。AWSは、KMSセクションのステップ5でキーが作成された後、ここで必要な値を提供します。

(以前に正しいポリシーをKMSキーに関連付けておらず、CloudWatch Logsサービスがキーを使用できるようにした場合、この時点でKMSキーに関連するエラーが発生します。)

SSHログをS3バケットに保存する

CloudWatch Logsの代わりに(またはCloudWatch Logsに加えて)S3でアクティビティログを保存するには、これらのパーミッションを別のポリシーとしてEC2インスタンスプロファイルに追加する必要があります(または、関連付けが必要な他のパーミッションと手動で組み合わせる)。

 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::BUCKET_NAME/*" }, { "Effect": "Allow", "Action": [ "s3:GetEncryptionConfiguration" ], "Resource": "*" }, { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "*" } ] }

上記のスニペットでは、必ずBUCKET_NAMEプレースホルダーを置き換えてください。

ログを保存する場所(CloudWatch Logs、S3バケット、またはその両方)を設定したので、SSHセッションを利用する準備が整いました。

AWSSystemsManagerセッションマネージャー

これが最後の重要なステップであり、SSHセッションの監視とロギングのためにLinuxマシンへの安全なアクセスを構成します。 まず、SessionManagerダッシュボードから始めます。

AWS Session Managerダッシュボードのスクリーンショット。「仕組み」、「Session Managerを使用する理由」、「はじめに」、「その他のリソース」、右上隅に「セッションを開始」のセクションがあります。後者のセクションには、オレンジ色の[セッションの開始]ボタンと白い[設定の構成]ボタンがあります。
ステップ1:ダッシュボードの使用を開始します。

ダッシュボードで、右上の[セッションの開始]ボックスにある白い[設定の構成]ボタンをクリックして、セッションログを有効にします。

[設定]ページには、探索できる複数のセクションがありますが、Linuxマシン内で何が起こっているかをすばやく確認できるようにSSHセッションログをCloudWatchまたはS3にストリーミングすることに焦点を当てます。

「CloudWatchlogging」というタイトルのAWSセクションのスクリーンショット。 「CloudWatchlogging」とも呼ばれる最初の設定には、[有効にする]というラベルの付いたチェックボックスがオンになっています。次の設定「好みのログオプションを選択してください」では、「セッションログのアップロード」ではなく「セッションログのストリーミング(推奨)」が選択されています。次の設定「暗号化を適用する」には、「暗号化されたCloudWatchロググループのみを許可する」というラベルの付いたチェックボックスがオンになっています。最終設定の「CloudWatchロググループ」では、「テキストボックスにロググループを入力してください」ではなく、「リストからロググループ名を選択してください」が選択されています。その下には、「ssm-session-demo」が選択された「CloudWatchロググループ」のリストがあります。対応する列「暗号化」(「暗号化」に設定)、「イベントの終了後」(「期限切れなし」に設定)、「メトリックフィルター」(0に設定)、「保存されたバイト」(0に設定)、および「作成時間」のタイムスタンプ。
ステップ2a:CloudWatchロギングを有効にします。

「CloudWatchlogging」セクションの直後に、バケットを選択できる「S3logging」セクションがあります。

「S3logging」というタイトルのAWSセクションのスクリーンショット。最初の設定である「セッションログをS3に送信する」には、「有効にする」というラベルの付いたチェックボックスがオンになっています。次の設定である「暗号化を適用する」には、「暗号化されたS3バケットのみを許可する」というラベルの付いたチェックボックスがオンになっています。次の設定である「ChooseS3bucket」では、「テキストボックスにバケット名を入力する」の代わりに「リストからバケット名を選択する」が選択されています。その下のドロップダウンリストから「ssm-session-demo」が選択されます。最後のフィールド「S3キープレフィックス-オプション」は空白です。
ステップ2b:S3ロギングを有効にします。

SSHロギングが構成されたら、LinuxマシンにSSHで接続し、いくつかのコマンドを実行して、アクティビティがキャプチャされているかどうかを確認できます。

それでは、セッションを開始しましょう。 同じページに、セッションを開始できる「セッション」タブがあります。 [セッションの開始]ボタンをクリックすると、セッションを開始できるEC2マシンのリストが表示されます。

ブレッドクラムを使用したAWSのスクリーンショットAWSSystemsManager、Session Manager、およびStartasession。 「ターゲットインスタンス」検索ボックスにはクエリが入力されておらず、結果が1つだけで、「インスタンス名」が「SSMデモ」に設定されています。
ステップ3:SSHセッションを開始するEC2インスタンスを選択します。

リストにEC2Linuxインスタンスが表示されない場合は、EC2 Linuxインスタンスが実行状態にあり、前に説明したIAMアクセス許可が関連付けられているかどうかを確認する必要があります。

SSMエージェントの処理「ストリーミングログをサポートしていません」エラー

EC2マシンにインストールされているSSMAgentバージョンがCloudWatchログのストリーミングをサポートしていないというエラーを受け取った場合でも、心配する必要はありません。 これを修正する簡単な方法があります。

赤い背景に白いテキストが表示されたAWSエラーメッセージのスクリーンショット。 「このインスタンスにインストールされているSSMAgentバージョンはCloudWatchへのストリーミングログをサポートしていません。SSMAgentを最新バージョンに更新するか、プリファレンスのストリーミングログオプションを無効にしてください。」というメッセージの横に丸で囲まれたXが表示されます。
潜在的な「古いSSMエージェントバージョン」エラー。

SSMエージェントを更新するには、 AWSSystemsManagerサービスの左側のパネルにある[コマンドの実行]に移動する必要があります。

AWS Systems Manager Run Commandダッシュボードのスクリーンショット。「仕組み」、「機能と利点」、「ユースケースとブログ投稿」、「ドキュメント」、右上隅に「インスタンスの管理」のセクションがあります。そのセクションには、オレンジ色の[コマンドの実行]ボタンのみが含まれています。
ステップ1:「コマンドの実行」ダッシュボードから始めます。

そこに着いたら、オレンジ色の「コマンドの実行」ボタンをクリックすると、いくつかのパラメーターを入力できる新しいページが表示されます。

ブレッドクラムを使用したAWSのスクリーンショットAWSSystemsManager、Run Command、およびRunacommand。 「コマンドドキュメント」というラベルの付いた検索ボックスには、「AWS-UpdateSSMAgent」という名前の行が選択された10行(5ページ以上の4ページ)が表示されます。 「所有者」列に「Amazon」、「プラットフォームタイプ」列に「Windows、Linux」があります。下部の[ドキュメントバージョン]フィールドでは、ドロップダウンリストから[1(デフォルト)]が選択されています。
ステップ2:コマンドドキュメントを選択します。

リストからAWS-UpdateSSMAgentを選択することから始めます。

「ターゲット」というタイトルのAWSセクションのスクリーンショット。 「ターゲット」とも呼ばれる最初のフィールドには、「インスタンスタグを指定する」、「インスタンスを手動で選択する」(選択)、および「リソースグループを選択する」オプションがあります。下部には、クエリのない「インスタンス」検索ボックスがあり、その結果は「SSMデモ」のみがチェックされています。行の対応するインスタンスIDは、「インスタンス」のすぐ上にあるXの付いたボックスにコピーされます。
ステップ3:アップデートが必要なSSMエージェントがあるEC2インスタンスを選択します。

それを選択したら、「ターゲット」セクションが表示されるまで下にスクロールします。 そこで、SSMエージェントを更新するEC2インスタンスを選択し、最後に「実行」ボタンを押す必要があります。 これにより、更新の進行状況を監視できるページに移動します。

ブレッドクラム「AWSSystemsManager」、「Run Command」、および「Command ID」(その後にGUIDが続く)を含むAWSのスクリーンショット。最初のセクション「コマンドステータス」には成功インジケーターが表示され、次のセクション「ターゲットと出力」の唯一の行には、前の単一インスタンスが一覧表示されます。下部には、「コマンドの説明」と「コマンドパラメータ」の2つの非展開セクションもあります。
ステップ4:更新の進行状況を監視します。

エージェントの更新には5分以上かかることはありません。 これが完了すると、セッションマネージャーでセッションを作成できるようになります。

この時点で、SSHセッションを開始する必要があります。

ターミナルの上にセッションIDとインスタンスIDがあるAWSのスクリーンショット。プロンプトは「sh-4.2$」で、コマンド「whoami」と「pwd」が入力され、それぞれ「ssm-user」と「/ usr/bin」が出力されます。
AWS Systems ManagerSessionManagerを介してSSMエージェントを使用するSSHセッション。

いくつかのコマンドを実行した後、CloudWatch Logsロググループ(またはS3バケット、表示されていません)に移動して、アクティビティが記録されていることを確認しましょう。

ブレッドクラム「CloudWatch」、「CloudWatch Logs」、「Log groups」、「ssm-session-demo」、および前のステップのセッションIDを含むAWSのスクリーンショット。唯一のセクションは検索ボックス「ログイベント」で、各行にはタイムスタンプとJSON形式のメッセージがあります。そのうちの1つが展開され、JSONがきれいに印刷され、右側に「コピー」というラベルの付いた白いボタンが表示されます。
CloudWatchLogsに記録されているSSHログイベント。

これで、保存時の暗号化を有効にして、Linuxマシンで実行されたすべてのコマンドを記録するセットアップが完了しました。

実際、すべてのコマンドは私たちが望む以上のものである可能性があります。セッション中に提供または生成されたシークレットはCloudWatchまたはS3に記録され、必要なアクセス許可を持っている人なら誰でも見ることができます。 これを防ぐために、 stty -echo; read passwd; stty echo; stty -echo; read passwd; stty echo; セッション中に提供する必要のあるシークレットごとに。

マイナーな警告を伴う優れたSSM/SSHAWSロギングソリューション

Session Managerは、ポート22を開かなくてもAWSの仮想マシンにリモートアクセスするための便利なツールです。実際、Session Managerとしてポート転送または直接SSH接続を使用する場合、この方法でSSHログを生成することはできません。ドキュメントノート。

それでも、Session Managerとセッションロギングを組み合わせることは、VM内のアクティビティを制御および監視するための堅牢なソリューションです。 さらに、SessionManagerサービスの使用に対して料金が発生することはありません。 EC2インスタンスとCloudWatchLogs、またはログを保存するためのS3バケットに対してのみ料金を支払います。

ビデオチュートリアルを好む読者のために、YouTubeで非常によく似た手順をもう少し詳しく説明しました。


Toptal Engineeringブログでさらに読む:

  • ケーススタディ:製品にAWSクラウドインフラストラクチャを使用する理由