🛠️

【AWS】SSM Session ManagerのログからIAM User名を特定できるようにする

に公開

はじめに

AWS上に構築したシステムにて、踏み台サーバ等の用途でEC2を用いるケースがあるかと思います。
EC2にログインする際、SSHで直接接続するのではなく、SSM Session Managerを用いて接続することで、以下のメリットを得ることが出来るため、これを用いるケースが多いかと思います。

  • EC2インスタンスにPublic IPアドレスの付与不要
  • Internetからのインバウンド通信の許可が不要
  • EC2インスタンス上での作業ログを自動的に記録することが可能

しかしながら、一部のケースにおいて、「誰が接続したのかトラッキングするのが難しい」という状況が発生し得ます。
本稿は、どのようなケースでトラッキングが難しくなるのか、またどのように解決すれば良いのかをまとめます。

概要

前提条件

以下の構成でAWSアカウントを運用している場合が該当します。

  • AWSアカウント構成
    • 複数のAWSアカウントを運用している
    • システム開発者/システム運用者のIAM Userは1つのAWSアカウント(以下、「集約AWSアカウント」)に作成し、他のAWSアカウント(以下、「各システムAWSアカウント」)へはSwitch Roleして利用している
    • IAM Identity Center(旧称:AWS SSO)は未導入
  • 各システムAWSアカウントの利用方法
    • システム開発者/システム運用者は、AWS Management ConsoleおよびAWS CLI両方を用いて各種作業を行う。
    • 集約AWSアカウント上のIAM Userでの認証後、その権限を以て各システムAWSアカウント上のIAM RoleをAssumeRoleする、という形で利用することとなる。

課題内容

SSM Session Managerはログを記録することが出来、「誰が」「いつ」ログインし、「何が」実行されたのかをCloudWatch LogsやS3 Bucketに記録することが出来ます。
しかしながら、ログに直接記録されるのはSSM StartSessionを実行したIAM Principal名のみであり、すぐに特定できるのは当該AWSアカウントのIAM Role名までです。

AWS Management ConsoleからSSM Session Managerを利用した場合、それぞれ下記のように記録されます。

AWS Management Consoleの場合、SSM Session Managerのログには下記のように記録されます。Roleセッション名にIAM User名が入っています。
1-1_SessionManagerLog_ManagementConsole

Management Consoleの場合
"userIdentity": {
    "arn": "arn:aws:sts::987654321098:assumed-role/OrganizationAccountAccessRole/tmiki"
},

AWS CLIの場合、SSM Session Managerのログには下記のように記録されます。Roleセッション名にはIAM User名は入っていません。
1-2_SessionManagerLog_AWSCLI

AWS CLIの場合
"userIdentity": {
    "arn": "arn:aws:sts::987654321098:assumed-role/OrganizationAccountAccessRole/botocore-session-1761353144"
},

userIdentity は、SSM StartSessionを開始したIAM Principal名になります。前提に記載したような構成で用いる場合、当該AWSアカウントのIAM RoleのRoleセッション名となります。
(ちなみに sessionId は、SSM Session Managerのセッションを特定するIDであり、SSMのSession Managerダッシュボードの「Sessions」や「Session history」に記録されるIDであるため、IAM Principalを辿るには役に立たない情報となります)

CloudTrailのログからAssumeRoleした元をたどることで、集約AWSアカウントのIAM Userの情報にたどり着くことはもちろん可能です。ただ、AWSアカウントの運用方法・役割分担によって、かなりの手間を要すケースが出てきます。

AWS Management Consoleからの利用した場合、Role Session名にIAM User名が含まれるのでこれで特定可能です。
しかしながら、AWS CLIからSSM Session Managerを利用した場合は、botocore-session-1761353144といった名称しかありません。
CloudTrailのログの突き合わせで特定は可能ですが、システムAWSアカウント側の情報だけでは元のIAM Userを特定できません。下記のように、集約AWSアカウントとシステムAWSアカウントの双方のログを突き合わせる必要があります。

2-2_AssumeRole_AWSCLI_Origin
2-2_AssumeRole_AWSCLI_Target

全てのAWSアカウントが、1つの組織で管理されている/組織間のコミュニケーションが密に行われている場合であればそれほど問題はありませんが、集約AWSアカウントと各システムAWSアカウントが別の組織で運営されており、調整やコミュニケーションに時間がかかる場合はかなりの時間と手間がかかります。
SSM Session Managerを利用したIAM Userを特定したいケースは、何らかのセキュリティ侵害によりその侵入経路や被害範囲の調査を行うような緊急性の高いケースが多いであろうと推測できますので、これはかなりリスクとなり得ます。

対応策

結論から言うと、下記のような構成・運用とすることで、SSM Session Managerのログ上から、元のIAM Userの名称を簡単に特定できるようになります。Roleセッション名にIAM User名が必ず入るようになるためです。

  • AWS CLIの設定ファイル(~/.aws/config)にて、下記のように role_session_name を指定する
  • システムAWSアカウントのIAM RoleのTrust Relationshipsに、下記のTrust policyを指定する

整理すると、下記の2点を確実に実現できるようにすることがポイントとなります。

  • 利用元にIAM User情報を付与することを強制する
  • 付与されたIAM User情報のなりすましを禁止する

下記ドキュメントにも記載があるパターンです。

IAM and AWS STS condition context keys - AWS Identity and Access Management
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#condition-keys-sts

具体的な設定例は下記の通りです。AWSアカウントIDは下記の前提です。

  • 集約AWSアカウントのアカウントID: 111111111111
  • システムAWSアカウントのアカウントID: 987654321098
~/.aws/config
[profile origin-account]
# 集約AWSアカウント用の設定
# ※省略

[profile system-account-1]
source_profile=origin-account
# AssumeRolet対象となるシステムAWSアカウントのIAM Role ARNを指定する
role_arn=arn:aws:iam::987654321098:role/OrganizationAccountAccessRole
# IAM User名を指定する
role_session_name=your_iam_user_name
output=json
region=us-west-2
システムAWSアカウント側IAM RoleのTrust Policy
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::987654321098:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:RoleSessionName": "${aws:username}"
        }
      }
    }
  ]
}

他の対応策

現在、IAMサービスにはSession TagsやSource Identityという仕組みもあり、AssumeRoleされる側のIAM RoleのTrust Policyに、特定のSession TagがIAM User名に一致する、Source IdentityがIAM User名に一致する、といったConditionを指定することで、同様のことが実現可能です。

Pass session tags in AWS STS - AWS Identity and Access Management
Monitor and control actions taken with assumed roles - AWS Identity and Access Management

しかしながら、2025/10/25現在、AWS CLIにはSession TagsやSource Identityを自動的に付与する機能がありません。
それらの値を自動的に付与するためのラッパーを実装すれば、これまでの使用感と変わらずAWS CLIを利用することも可能ですが、余計な個別実装を増やすこととなるため、実際のシステムで運用するには難しいかと思います。
AWS CLIに実装されるよう、折に触れてAWSサポートに要望を挙げ続けるのが良いでしょう。

おわりに

ちなみに、IAM Identity Center(AWS SSO)を利用する場合、このような課題は考慮不要です。
AWS Management Console、AWS CLIどちらを利用するにしても、CloudTrailイベントの "userIdentity.principalId"およびRoleセッション名に、IdPのログインユーザ名が記録されます。

Discussion