SSM Session ManagerでログインするOSユーザーをIAMユーザー・ロールごとに切り替える

記事タイトルとURLをコピーする

はじめに

今回は、IAMユーザーごとにログインするユーザーを変える方法について書いていきます。

参考ドキュメントはこちらになります。

docs.aws.amazon.com

前提条件

今回は、Amazon Linux 2023での手順を記載しており、Session Managerにログイン可能な環境は揃っていることを前提とします。

そのため、本記事では以下のことは書いていません。

  • EC2作成方法
  • SSM Session Manager利用条件について

SSM Session Managerを利用してログインするにあたっては、いくつか前提条件がありますので、対象のドキュメントをご参照ください。

docs.aws.amazon.com

手順

EC2でOSユーザー作成

始めに、ログインするOSユーザーを作成します。 SSM Session ManagerでEC2にログインして、OSユーザー追加をします。

sudo useradd my-os-user

SSMでSSMSessionRunAsを有効化する

AWSマネジメントコンソールで、SSMのページへ遷移します。 左ペインからSession Managerをクリックし、「Preferences」タブを開いて、「Edit」をクリックします。

次に、「Enable Run As support for Linux Instances」を有効化します。

OSユーザー名を記入する欄が出てきますが、こちらにOSユーザー名を記載すると、IAMで指定していなかった場合に使うOSユーザー名となります。 ただし、OSユーザーが作成されるわけではないため、利用する場合は、事前にOSユーザーを作成する必要があることにご留意ください。

参考ドキュメントには、利用するOSユーザーの優先順位が記載されています。

  1. セッションを開始しているユーザーである場合、IAM エンティティ (ユーザーまたはロール) に SSMSessionRunAs = os user account name タグが付いていますか? 「はい」の場合、マネージドノードに OS ユーザー名が存在していますか? 存在する場合は、セッションを開始します。存在しない場合は、セッションの開始を許可しないでください。

  2. IAM エンティティに SSMSessionRunAs = os user account name タグが付いていない場合は、ステップ 2 に進みます。 IAM エンティティに SSMSessionRunAs = os user account name タグが付いていない場合、AWS アカウント の Session Manager の詳細設定で OS ユーザー名が指定されていますか? 「はい」の場合、マネージドノードに OS ユーザー名が存在していますか? 存在する場合は、セッションを開始します。存在しない場合は、セッションの開始を許可しないでください。

Linux と macOS のマネージドノードで Run As サポートを有効にする - AWS Systems Manager

今回、まずは設定せずにssm-userで入れないこと、デフォルトOSユーザーが動くのか検証してみます。

検証

EC2にSSM Session Managerを使っては入れるかやってみます。

エラーが出ました。

Invalid RunAs username. Set default username in Session Manager Preferences page.

IAMでログインOSユーザー設定も、デフォルトのOSユーザーを指定しなかったため、入れませんでした。

次に、先ほど作成したOSユーザーを指定してみました。

test-userで入れました。

あくまでIAMから制御をしたいので、設定有無はどちらでも大丈夫です。

ちなみに、「ssm-user」を設定すれば、ssm-userでもログイン可能です。

今回は、一つのIAMユーザーまたはIAMロールから特定のOSユーザーにログインしたいため、デフォルトOSユーザーの設定は削除して進めます。

IAMユーザー・ロールの設定

今回、作成したOSユーザーにログインさせたいIAMユーザーまたはロールに以下のようなタグ付けをします。

Key Value
SSMSessionRunAs {OSユーザー名}

今回は、IAMユーザーに以下のようなタグ付けをしました。

では、IAMユーザーでログインしてみます。

できました。

検証

ここで、タグ付けで設定したOSユーザー名が存在しなかった場合の挙動について見てみたいと思います。

今回、タグを以下のように設定してみました。

Key Value
SSMSessionRunAs os-test-user

OS内には「os-test-user」は存在しません。

入ってみたところ、失敗しました。

次に、タグはこのままにして、デフォルトOSユーザーを「test-user」に変更してみましたが、やはり同じエラーで入れませんでした。

ということで、この設定でSession Managerを使った運用でもOSユーザーの強制ができそうということだ分かりました。

ログについて

今回、ログインしたOSユーザーを変更してみましたが、ログでは以下のように見えていました。

どのIAMが、どのOSユーザーを使っているのかはっきりわかりますね。

{
    "eventVersion": "1.0",
    "eventTime": "2023-06-01T03:54:06Z",
    "awsRegion": "ap-northeast-1",
    "target": {
        "id": "i-***************"
    },
    "userIdentity": {
        "arn": "arn:aws:iam::000000000000:user/test-user"
    },
    "runAsUser": "test-user",
    "sessionId": "test-user-093b7e0ceca558bd8",
    "sessionData": [
        "sh-5.2$ sh-5.2$ whoami",
        "test-user"
    ]
}

最後に

今回は、Session Managerについて書いてみました。

「SSMで運用したいけど、複数のステークホルダーが同じサーバーを使うから結局SSHポート空けていた」もしくは、「結局1台SSMで入る踏み台を作って、そこからサーバーにログインするようにしていた」等あるかなと思いますが、IAMで制御できれば運用が楽になるかもしれません。

ぜひ利用の検討をしてみたらいかがでしょうか。 ご参考になれば幸いです。

篠﨑 勇輔(書いた記事を見る)

クラウドインテグレーション部 SRE2課

入社4年目