[AWS] Bastion Host + Session Manager で秘密鍵管理がいらない踏み台サーバを作成する

こんにちは。
開発本部の藤田です。

巷ではAWS System Manager Session Manager を使用してSSHが楽になった!移行した!
等の記事が多いのですが弊社は従来のSSH踏み台サーバ(bastion)+Sessions Managerの構成にしました。
理由は以下のようなありふれたものです。

  • 全員の環境にAWS-CLI環境導入と各自設定を行うには時間がかかりそう
  • 全てSession Manager運用に変更するにもSCP等作業がネック
  • AWS以外に他のパブリッククラウドも利用しているので今までのSSH接続方式が望ましい

接続図は以下になります。※どこかで見たような図なのはご容赦ください。

接続までの流れ

  1. ユーザが秘密鍵で踏み台へSSH接続
  2. 踏み台から接続先へSSHコマンドを実行
    2.1. sshconfig内でssh-ssm.shの呼び出し
    2.2. ssh-keygenコマンドで一時鍵を作成
    2.3. aws ssm send-commandで接続先EC2に一時公開鍵を登録
    2.4. aws ssm start-session でSSH Port Forwarding開始
    2.5. 15秒後に接続の有無に関わらず一時鍵の削除
  3. Session Manager 経由でのSSH Port Forwarding接続の確立

踏み台サーバはパブリックサブネットに設置しているEC2です。
昔からあるLinux Bastion Hostに従った構築を行いログイン時にログが取得されるようになっています。
参考URL:
How to Record SSH Sessions Established Through a Bastion Host | AWS Security Blog
[5分で]AWSベストプラクティスにのっとって踏み台(Bastion)サーバを構築する – Linux編 – | Developers.IO

踏み台からsshconfig内で呼び出すssh-ssm.shの設定には以下を利用しています。
ssm-toolsはネームタグの接続設定も含めたsshconfigを自動生成してくれるので助かります。
GitHub – elpy1/ssh-over-ssm: SSH over AWS SSM
GitHub – elpy1/ssm-tool: AWS SSM and SSH toolkit

踏み台サーバーとの比較

  • 踏み台に設置する秘密鍵の管理が不要
  • 接続先のSecurity Group ポート管理不要

Systems Managerとの比較

  • ユーザ側でのAWS-CLI環境、sshconfig設定不要
  • IAMアカウントなしでも利用可能
  • 接続先EC2への公開鍵の登録不要
  • SCPも問題なく可能
  • 鍵要らずで普通にAnsible実行可能(ssh_args ControlMaster=auto 必須です)

運用上の気になる点などをまとめると

  • ユーザ登録+個人鍵管理はつきまとう
  • 踏み台サーバ構築や管理が少し煩雑(Log回りや可用性)
  • 踏み台サーバのsshconfig管理(サーバ追加時に更新が必要)
  • プライベートサブネット用のSSMエンドポイントが高額
  • ed25519をサポートしていない古いEC2がある場合ssh-ssm.shの修正が必要
  • ポートフォワード禁止の為、踏み台サーバまではSFTPし各サーバにはSCP利用になってしまった…

おわりに

いかがだったでしょうか。
SSHの管理自体大変ですよね。

この記事が皆さまの快適なインフラ業務の一助になれば幸いです。