🐚

[AWS] Session Managerのシェルを/bin/bashにする

に公開

この記事は jig.jp Engineers' Blog Advent Calendar 2025 の12月8日分の記事です。

はじめに

弊社では、一部の開発にAWS EC2を使用しており、SSHログインしてログ確認などの作業をしています。
SSHキー管理や22番ポート保護などの管理コストを減らす目的で、SSHログインの代わりにAWS Systems Manager Session Managerを使う方法を検討しました。その中で出てきた問題点とその解消について、記事としてまとめます。

最初にまとめ

Session Managerの設定のLinux シェルプロファイルに以下のコマンドを書くことで、Session Managerでのアクセス直後からホームディレクトリの状態でbashを起動することができます。

cd ~
exec /bin/bash

結論は以上のとおりで、ここから先はこの結論に至るまでの話です。

対象

  • Session Manager の設定 が済んでいるAmazon Linux 2 の EC2インスタンス
    • SSM Agentがインストールされている
      • Amazon Linux 2にはデフォルトでインストールされている
    • SSM関係のポリシーが対象のEC2インスタンスロールにアタッチされている

この記事の範囲外

Session Manager経由のSSH接続を使うことで、使い勝手やSSHキー、22番ポートのことは解決できますが、ログ取得を考慮すると取得できるログの種類に違いがあるので、今回は考えないこととしました。

AWS Systems Manager Session Managerとは?

AWSドキュメントより

Session Manager はフルマネージド型の AWS Systems Manager ツールです。Session Manager を使用すると、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、エッジデバイス、オンプレミスサーバー、仮想マシン (VM) を管理できます。ワンクリックのブラウザベースのインタラクティブシェルまたは AWS Command Line Interface (AWS CLI) を使用できます。Session Manager は安全なノード管理を実現し、インバウンドポートを開いたり、踏み台ホストを維持したり、SSH キーを管理したりする必要はありません。また Session Manager はマネージドノードの制御されたアクセス、厳格なセキュリティプラクティス、ノードアクセス詳細があるログを要件とする社内ポリシーの尊守を実現しつつ、エンドユーザーが簡単なワンクリックのクロスプラットフォームを使用してマネージドノードにアクセスできるようにします。Session Manager の使用を開始するには、Systems Manager コンソールを開きます。ナビゲーションペインで、[Session Manager] を選択します。

Session Managerを使うことで、22番ポートや踏み台サーバ、SSH キーなしで EC2 などにアクセスできます。SSHの代わりとして使うことができます。

Session ManagerでEC2インスタンスにアクセスしてみる

次の例は awscli を使ったものですが、AWSのマネジメントコンソールからアクセスすることもできます。

# i-XXXXXXXXXX はインスタンスID
aws ssm start-session --target i-XXXXXXXXXX

Starting session with SessionId: XXXXXXX
sh-4.2$ pwd
/usr/bin

sh-4.2$ whoami
ssm-user

sh-4.2$ echo $HOME
/home/ssm-user

sh-4.2$ echo $0
sh

sh-4.2$ exit
exit


Exiting session with sessionId: XXXXXXX.
比較用SSHログイン
[ec2-user@ip-xx-xx-xx-xx ~]$ pwd
/home/ec2-user

[ec2-user@ip-xx-xx-xx-xx ~]$ whoami
ec2-user

[ec2-user@ip-xx-xx-xx-xx ~]$ echo $HOME
/home/ec2-user

[ec2-user@ip-xx-xx-xx-xx ~]$ exit
ログアウト
Connection to xx.xx.xx.xx closed.

初めてSession Managerを使ったとき、次のように感じました

  • SSHログインの時は /bin/bash だったのに sh-4.2 でつらい 😥
  • カレントディレクトリが /usr/binls するといっぱいでてくる 😥

最終的には他の開発者も含めてSSHログインをやめてSession Managerでのアクセスに切り替えたいので、同じ思いをしてほしくないなと感じました。そこで、できるだけSSHログインの操作性と合わせるために、ホームディレクトリでbashを起動させることを目指しました。

Session Managerの設定を変えてホームディレクトリでbashを起動させる

Session Managerでは、セッション開始時にコマンドを実行することができます。以下の手順は、AWS re:POSTの記事を参考にしています。

AWSマネジメントコンソールから「AWS Systems Manager」 > 「セッションマネージャー」 > 「設定」にあるシェルプロファイルのLinux シェルプロファイルを編集することで可能です。

これを次のように設定してみます。

cd ~
/bin/bash

うまくいくか試してみます。

Starting session with SessionId: XXXXXXX
cd ~
/bin/bash
sh-4.2$ cd ~
sh-4.2$ /bin/bash
# ↑ 自動で入力されます。
[ssm-user@ip-xx-xx-xx-xx ~]$ pwd
/home/ssm-user

[ssm-user@ip-xx-xx-xx-xx ~]$ whoami
ssm-user

[ssm-user@ip-xx-xx-xx-xx ~]$ echo $HOME
/home/ssm-user

[ssm-user@ip-xx-xx-xx-xx ~]$ echo $0
/bin/bash

うまくいきました 🎉
ではセッションを閉じてみましょう。


[ssm-user@ip-xx-xx-xx-xx ~]$ exit
exit

sh-4.2$ exit
exit


Exiting session with sessionId: XXXXXXX.

exit 1度ではセッションが閉じられません。Session Managerでセッション開始時に入力された /bin/bash が終了し、 sh-4.2 が現れてしまいます 😥

セッションを閉じるには、もう1度 exit する必要があります。

execコマンドを使用して sh-4.2/bin/bash に置き換える

この原因は、shプロセスの子プロセスとしてbashが起動するからです。

[ssm-user@ip-xx-xx-xx-x ~]$ pstree -a
...()...
  ├─amazon-ssm-agen
  │   ├─ssm-agent-worke
  │   │   ├─ssm-session-wor XXXXXXX
  │   │   │   ├─sh
  │   │   │   │   └─bash
  │   │   │   │       └─pstree -a
  │   │   │   └─8*[{ssm-session-wor}]
  │   │   └─13*[{ssm-agent-worke}]
  │   └─8*[{amazon-ssm-agen}]
...()...

そこで、shの子プロセスとしてではなく、shプロセスを置き換える execコマンドを使用して、/bin/bash を起動するようにSession Managerの設定を変更します。

cd ~
exec /bin/bash

execコマンドによりshプロセス自体が置き換わるため、1度の exit でセッションを閉じることができます。

Starting session with SessionId: XXXXXXX
cd ~
exec /bin/bash
sh-4.2$ cd ~
sh-4.2$ exec /bin/bash
[ssm-user@ip-xx-xx-xx-xx ~]$ echo $0
/bin/bash

## 先ほどのshがbashに変わっていることが確認できます。
[ssm-user@ip-xx-xx-xx-x ~]$ pstree -a
...()...
  ├─amazon-ssm-agen
  │   ├─ssm-agent-worke
  │   │   ├─ssm-session-wor XXXXXXX
  │   │   │   ├─bash
  │   │   │   │   └─pstree -a
  │   │   │   └─8*[{ssm-session-wor}]
  │   │   └─13*[{ssm-agent-worke}]
  │   └─8*[{amazon-ssm-agen}]
...()...

[ssm-user@ip-xx-xx-xx-xx ~]$ exit
exit


Exiting session with sessionId: XXXXXXX.

exit 1度でうまくセッションが閉じました 🎉

今後確認したいこと

セッション開始時にコマンドを実行すると、自動的に実行したコマンドもhistoryに残ってしまうため、コマンド履歴からコマンドを実行するときの邪魔になってしまいます。
そのため、historyを汚染しないようにできないか考えていきたいと思います。

[ssm-user@ip-xx-xx-xx-xx ~]$ history
    1  cd ~
    2  exec /bin/bash
    3  history

後日談

記事完成後、AWSドキュメント を確認していたら exec /bin/bash を設定していることを発見し、きちんとドキュメントを見るべきだと思いました。

jig.jp Engineers' Blog

Discussion