ちょっと話題の記事

踏み台サーバ経由の多段SSH接続をローカル端末の秘密鍵のみで実施する

踏み台サーバへSSH接続先の秘密鍵をコピーするのは卒業しよう!!
2021.08.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは!コンサル部のinomaso(@inomasosan)です。

踏み台サーバ用のEC2から、別のEC2 LinuxにSSH接続する際の秘密鍵の扱い方は皆さんどうしておりますでしょうか?

一番簡単なのは踏み台サーバに秘密鍵をアップロードし、別のEC2にSSH接続することです。 ただし、このやり方だと踏み台サーバが乗っ取られた場合に、他のサーバにも侵入されるリスクが大きくなってしまいます。

そこで今回は、ローカル端末にある秘密鍵のみを利用した、多段SSH接続を検証していきます。

弊社カジにこのブログを書くきっかけを頂きました。改めてありがとうございます。

この記事で学べること

  • 踏み台サーバにSSH接続先の秘密鍵をコピーする必要はないということ
  • 踏み台サーバ経由の多段SSH接続方法

ちなみに踏み台サーバ経由でWindows Serverに接続したい場合は?

Windows Serverの場合、リモートデスクトップ接続は鍵認証ではなくパスワード認証となるので、SSHポートフォワーディングを利用して接続しましょう。
弊社の下記ブログに、ローカル端末がMacとWindowsの両パターンで接続方法が解説されています。

検証環境の構成図

今回の検証ではAmazon Linux 2でEC2を構築しました。
踏み台経由でプライベートサーバにアクセスするのが目的となります。

やってみた

環境

今回実行した環境は以下の通りです。

  • macOS Big Sur 11.4

やり方その① ~/.ssh/configに記述

ひとつめの多段SSH接続方法は~/.ssh/configを記述するやり方です。
接続先やユーザ、秘密鍵等をあらかじめ記述することで、sshコマンドを簡素化できるのでタイポ防止にも繋がります。

今回の検証環境の場合は、以下のような記述内容となります。

~/.ssh/config

# ログインするサーバ毎にHostを記載
# Hostの名前は任意で設定可能
Host bastion
  # 踏み台サーバのパブリックIP(DNS名でも指定可能)
  HostName xxx.xxx.xxx.xxx
  # sshポート番号(省略可能)
  Port 22
  # ログインするユーザ名
  User ec2-user
  # ローカル端末に保存した、踏み台サーバの秘密鍵のパス指定
  IdentityFile ~/path/bastion.pem

Host private
  # プライベートサーバのプライベートIP(DNS名でも指定可能)
  HostName xxx.xxx.xxx.xxx
  # sshポート番号(省略可能)
  Port 22
  # ログインするユーザ名
  User ec2-user
  # 踏み台サーバを経由してログイン
  ProxyCommand ssh bastion -W %h:%p
  # ローカル端末に保存した、プライベートサーバの秘密鍵のパス指定
  IdentityFile ~/path/private.pem

あとは下記コマンドを実行すれば、プライベートサーバへ簡単にログインすることができます

ssh private

やり方その② ProxyCommandにてワンライナでログイン

~/.ssh/configを既に利用している等で記述が困難な場合は、ワンライナでプライベートサーバへログインすることも可能です。

ssh -o ProxyCommand='ssh -i ~/path/bastion.pem -W %h:%p ec2-user@踏み台サーバのパブリックIP' -i ~/path/private.pem ec2-user@プライベートサーバのプライベートIP

参考ブログ

まとめ

~/.ssh/configの書き方を理解できれば、秘密鍵をセキュアに運用でき、楽にログインできることがわかりました。 ちょっとした工夫で運用が楽になりますので、これを機に踏み台サーバへSSH接続先の秘密鍵をコピーするのは卒業しましょう!!

この記事が、どなたかのお役に立てば幸いです。それでは!