[小ネタ] SSMセッションマネージャーのセッションログはechoしないものは記録されない

2023.09.05

「セッション中に機密データを入力するときに次のコマンドを使用することをお勧めします」とあるけど read -s してても記録されるなんてことないよね?

こんにちは、のんピ(@non____97)です。

皆さんはSSMセッションマネージャーのセッションログに入力したパスワードが記録されちゃうか気になったことはありますか? 私はあります。

AWS公式ドキュメントには以下のような記載がありました。

Session Manager は、セッション設定に応じて、セッション中に入力したコマンドとその出力を記録します。パスワードなどの機密データがセッションログに表示されないようにするには、セッション中に機密データを入力するときに次のコマンドを使用することをお勧めします。

stty -echo; read passwd; stty echo;

セッションアクティビティのログ記録 - AWS Systems Manager

stty -echo;で入力文字をechoしないようにすることで、セッションログに記録されないようにしているようですね。

以下記事でセッションログの出力にはscriptコマンドが動作していることを確認しました。

そのため、echoされないものは記録されないはずですが、必ずstty -echo;を実行する必要があるのか念の為確認をしてみます。

いきなりまとめ

  • SSMセッションマネージャーのセッションログはechoしないものは記録されない
  • そのため、read -sでも問題ない

試してみる

実際に試してみます。

使用したEC2インスタンスの情報は以下のとおりです。

  • AMIの名前 : RHEL-9.2.0_HVM-20230503-x86_64-41-Hourly2-GP2
  • AMI ID : ami-026ebd4cfe2c043b2
  • SSM Agentのバージョン : 3.2.1478.0-1

まず、事前に用意しておいたtest-userにスイッチする際に入力するパスワードがセッションログに記録されるのか確認します。

$ su test-user
Password:

$ whoami
test-user

セッションログには以下のように記録されていました。

{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:51:32Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "\u001b[?2004l\u001b]0;@ip-172-31-30-136:~\u0007\u001b[?2004h[ec2-user@ip-172-31-30-136 ~]$ su test-user"
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:51:33Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "Password: "
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:51:35Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "\u001b]0;test-user@ip-172-31-30-136:/home/ec2-user\u0007\u001b[?2004h[test-user@ip-172-31-30-136 ec2-user]$ "
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:51:39Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "\u001b[?2004l\u001b]0;test-user@ip-172-31-30-136:/home/ec2-user\u0007\u001b[?2004h[test-user@ip-172-31-30-136 ec2-user]$ whoami",
        "test-user",
        "\u001b]0;test-user@ip-172-31-30-136:/home/ec2-user\u0007\u001b[?2004h[test-user@ip-172-31-30-136 ec2-user]$ "
    ]
}

パスワードは記録されていないですね。安心しました。

パスワードを変更する際の動きも確認します。

$ passwd
Changing password for user test-user.
Current password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

セッションログは以下のとおりです。

{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:54:08Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "\u001b[?2004l\u001b]0;test-user@ip-172-31-30-136:/home/ec2-user\u0007\u001b[?2004h[test-user@ip-172-31-30-136 ec2-user]$ passwd",
        "Changing password for user test-user."
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:54:12Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "Current password: "
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:54:15Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "New password: "
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:54:16Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "Retype new password: "
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:54:17Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "passwd: all authentication tokens updated successfully.",
        "\u001b]0;test-user@ip-172-31-30-136:/home/ec2-user\u0007\u001b[?2004h[test-user@ip-172-31-30-136 ec2-user]$ "
    ]
}

こちらもパスワードは記録されていません。

最後にread -sとサイレントモードで受け付けた文字列もセッションログに記録されないか確認します。

$ read -sp "Enter Password: " password
Enter Password: 

$ echo $password
P@ssw0rd

セッションログは以下のとおりです。

{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:58:51Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "\u001b[?2004l\u001b]0;test-user@ip-172-31-30-136:/home/ec2-user\u0007\u001b[?2004h[test-user@ip-172-31-30-136 ec2-user]$ read -sp \"Enter Passowd\b\u001b[K\b\u001b[K\b\u001b[Kword: \" passo\b\u001b[Kword"
    ]
}
{
    "eventVersion": "1.0",
    "eventTime": "2023-09-04T09:59:05Z",
    "awsRegion": "us-east-1",
    "target": {
        "id": "i-06e2a9844c03f85f9"
    },
    "userIdentity": {
        "arn": "arn:aws:sts::<AWSアカウントID>:assumed-role/<IAMロール名>/<セッション名>"
    },
    "runAsUser": "ec2-user",
    "sessionId": "<セッション名>-06134c7b306229542",
    "sessionData": [
        "\u001b[?2004lEnter Password: \u001b]0;test-user@ip-172-31-30-136:/home/ec2-user\u0007\u001b[?2004h[test-user@ip-172-31-30-136 ec2-user]$ echo $password",
        "P@ssw0rd"
    ]
}

記録されていないですね。

セッションログに記録されないようにするためには必ず stty -echo; をしろということではなかった

SSMセッションマネージャーのセッションログはechoしないものは記録されないことを確認しました。

セッションログに記録されないようにするためには必ずstty -echo;をしろということではありませんでした。

個人的には変数に文字列を代入する場合はstty -echo; read 変数名; stty echo;よりもread -s 変数名の方が好みかつタイプ数も少ないので、後者を使いたいなと思います。stty -echoを使うのは一連の処理自体をセッションログに記録されないようにする場合でしょうか。ただし、多用すると作業エビデンスとしての効果がなくなってしまうので注意したいところです。

ちなみに、Windowsの場合は$Passwd = Read-Host -AsSecureStringでセッションログに記録されずに変数に文字列を代入することが可能です。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!