セッションマネージャーを使ったログインを検知して通知してみた

セッションマネージャーを利用した際にメールで利用の詳細が通知されるように設定をしてみました。
2021.12.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、望月です。
みなさんはセッションマネージャーを利用していますか?
私は SSH ポートを開けることなく、インスタンスに接続できるのが便利でよく使っています。
今回はそんなよく利用されているであろうセッションマネージャーでログインしたときに、いつ、誰が、どこから、どこへがわかるようにやってみました。

やってみた

前提

  • Amazon SNS トピックは作成済み
    • Email を利用しています。Chatbot は「入力トランスフォーマー」の場合、通知ができないため使えません。
  • CloudTrail が有効化されていること

EventBridge の設定

セッションマネージャーでは「StartSession」「ResumeSession」「TerminateSession」が使われますが、事前定義パターンには用意されていないためカスタムパターンを利用し、CloudTrail の AWS API コールを利用する形でイベントパターンを設定します。
また、そのままだと JSON がメールで送られてきて見づらいため、入力トランスフォーマーを利用し、見やすいようにテンプレートを利用します。

それでは、まず EventBridge のサービスページから新しいルールを作成します。

ルールの作成で以下を入力します。詳しくは画像を用意したのでそちらをご覧ください。

  • 名前と説明
    • 名前を入力
  • パターンを定義
    • イベントパターンを選択
    • カスタムパターンを選択
    • イベントパターンに後述しているイベントパターンを入力し、保存

「イベントパターン」

{
  "detail": {
    "eventSource": ["ssm.amazonaws.com"],
    "eventName": ["StartSession", "ResumeSession", "TerminateSession"]
  },
  "detail-type": ["AWS API Call via CloudTrail"],
  "source": ["aws.ssm"]
}
  • ターゲットを選択
    • ターゲットを「SNS トピック」にし、作成済みの SNS トピックを選択
    • 入力の設定は入力トランスフォーマーを選択し、後述している入力トランスフォーマーを入力し、保存

「入力トランスフォーマー」

上の枠に入力します。ここでは入力パスを定義します。IAM ユーザーとスイッチロールを利用した IAM ロールのアクセスで出力される JSON の構造が変わるため注意します。

  • IAM ユーザーでのアクセス環境の場合は以下を利用
{
  "time": "$.time",
  "arn": "$.detail.userIdentity.arn",
  "accountId": "$.detail.userIdentity.accountId",
  "userName": "$.detail.userIdentity.userName",
  "eventSource": "$.detail.eventSource",
  "eventName": "$.detail.eventName",
  "sourceIPAddress": "$.detail.sourceIPAddress",
  "userAgent": "$.detail.userAgent",
  "target": "$.detail.requestParameters.target"
}
  • スイッチロールを利用した IAM ロールでのアクセス環境の場合は以下を利用
{
  "time": "$.time",
  "arn": "$.detail.userIdentity.sessionContext.sessionIssuer.arn",
  "accountId": "$.detail.userIdentity.sessionContext.sessionIssuer.accountId",
  "userName": "$.detail.userIdentity.sessionContext.sessionIssuer.userName",
  "eventSource": "$.detail.eventSource",
  "eventName": "$.detail.eventName",
  "sourceIPAddress": "$.detail.sourceIPAddress",
  "userAgent": "$.detail.userAgent",
  "target": "$.detail.requestParameters.target"
}

下の枠に入力します。ここでは入力テンプレートを定義します。入力パスで定義した変数をテンプレートで指定することで必要な情報を出力できます。

"セッションマネージャーの利用を検知しました、詳細は以下確認してください"
"日時: <time>"
"ARN: <arn>"
"AWSアカウントID: <accountId>"
"ユーザーID: <userName>"
"イベントソース: <eventSource>"
"イベントネーム: <eventName>"
"ソースIPアドレス: <sourceIPAddress>"
"ユーザーエージェント: <userAgent>"
"ターゲットインスタンスID: <target>"

入力がすべて終わったら「作成」をクリックし、ルールを作成します。

動作確認

作成した EventBridge のルールがちゃんと動作するか確認します。
試しにセッションマネージャーを利用して SNS トピックに設定した通知先メールアドレスにメールがきていることを確認し、想定通りの情報が入力されていることを確認します。

以降はセッションマネージャーが利用されるたびに同じようにメールが通知される形になります。

まとめ

EventBridge を利用して、セッションマネージャーのログインを検知し、メールで通知できるようにしてみました。
セッションマネージャーでは操作ログも取得できるため、合わせて利用することでより詳細に記録することができるので必要であれば、そちらも合わせて設定してみてください。