犬でも分かるsshのProxyJump

SEのお仕事をしていると、多段でssh接続をしなければならないことがよくあります。例えば、お客様先のホストにssh接続するのに、一度ゲートウェイ(踏み台)となるホストにssh接続してから、目的のホストにssh接続するようなケースです。sshログインして作業する場合もそうですが、scpでファイル転送するのにも、何度もsshログインを繰り返すのはとても面倒です。
でも、sshのProxyJumpの機能を使えば、目的とするホストへの多段ssh接続を1回で済ませることができます。知っておくととても便利な機能です。

ProxyJumpとは?

ProxyJumpを使用しない場合(通常)

ローカルホスト(localhost)からホストrhost2に対してsshログインをしたいとき、ホストrhost1をゲートウェイとして中継しなければならないとします。通常の場合、localhostからrhost1にsshログインして、更にrhost1からrhost2にsshログインするという多段のログイン操作が必要となります。
パスワードの入力もあるととても面倒ですね。

パスワード入力が面倒なので、鍵認証方式でログインできるようにしましょう。この場合、ssh接続する接続元のホストには秘密鍵、接続先のホストには公開鍵を設置する必要があります。
パスワード入力が省略されますが(鍵作成時に、秘密鍵の読み取りパスフレーズを設定しない場合)、2回のsshログインの操作は必要となります。それに、リモート先のrhost1に大事な秘密鍵を置くというのもなんか嫌ですね。

ProxyJumpを使用する場合

ProxyJumpを使うと、ゲートウェイとなるrhost1を中継して、1回のssh操作でrhost2にログインできるようになります。

sshログインだけでなく、sshによるコマンドのリモート実行、scpによるファイル転送もできます。scpでは、ゲートウェイとなるrhost1にファイルを一時的に置く必要もなく、localhostとrhost2間で直接転送できるので本当に便利です。

そして、ProxyJumpではゲートウェイとなるrhost1には、秘密鍵を設置しなくても良いところがセキュリティ面における長所です。ssh接続するには、rhost1とrhost2にログインアカウントを作成してもらわないとならないですが、rhost1,rhost2の管理者には、公開鍵のみ渡して設置してもらえば良いということです。秘密鍵は他人には渡したくないですからね。

ProxyJumpは、ゲートウェイホストが何段あっても1度のssh操作で対象となるリモートホストにログインすることが可能です。そして、ログアウトも1回だけで済みます。便利だ。

ProxyJumpの設定は ~/.ssh/config に定義する

ProxyJumpはsshが標準で持っている機能です。
sshコマンドの引数オプションで指定することもできますが、通常はsshのconfigファイルに設定を記述します。だって、毎回のように使うオプションですから。。

sshのconfigファイルの場所は以下の通りです。

Linuxの場合~/.ssh/config
(~ はユーザのホームディレクトリです)
Windowsの場合C:\Users\<ユーザ名>\.ssh\config

前述の、localhost → rhost1 → rhost2 → rhost3 のProxyJumpでは、以下の例のように設定しましょう。
(ホスト名、IPアドレス、ユーザ名はあくまでも私の環境における設定です)

Host rhost1
  HostName      192.168.1.211
  User          user01

Host rhost2
  Hostname      192.168.2.210
  User          guest01
  ProxyJump     rhost1

Host rhost3
  Hostname      192.168.122.11
  User          test01
  ProxyJump     rhost2  
Host行ssh接続するホスト名を定義します。configに定義しておけば、/etc/hostsに名前を登録していなくても、ホスト名でssh接続できます。
HostName行/etc/hostsに定義されたホスト名、DNSに登録されているFQDN、またはIPアドレスを定義します。
User行sshログインで使用するユーザ名を定義します。
ProxyJump行ProxyJumpで使用するゲートウェイ(踏み台)となるホストを定義します。

さて、秘密鍵のデフォルトのパスは ~/.ssh/id_ed25519 や ~/.ssh/id_rsa なのですが、デフォルト以外のパスで秘密鍵を指定する場合は、「IdentityFile <秘密鍵のパス>」のようにconfigファイルに指定することができます。
前述のように、秘密鍵はローカルホストのものを使用することになるので、それぞれのHostの定義において、Identity行の秘密鍵はローカルホストのパスを指定しましょう。例えば、秘密鍵に「~/.ssh/id_ed25519.test」を指定する場合は、configファイルの記述は以下の通りになります。

Host rhost1
  HostName      192.168.1.211
  User          user01
  IdentityFile  ~/.ssh/id_ed25519.test

Host rhost2
  Hostname      192.168.2.210
  User          guest01
  ProxyJump     rhost1
  IdentityFile  ~/.ssh/id_ed25519.test

Host rhost3
  Hostname      192.168.122.11
  User          test01
  ProxyJump     rhost2    
  IdentityFile  ~/.ssh/id_ed25519.test

~/.ssh/config の記述例

~/.ssh/config には、ProxyJump以外にも常用するsshのオプションを定義しておくと便利です。
ひとつの記述例として紹介します。

Host *
  StrictHostKeyChecking no
  UserKnownHostsFile    /dev/null
  ServerAliveInterval 60
  ServerAliveCountMax 3
  Compression yes

Host rhost1
  HostName      192.168.1.211
  User          user01

Host rhost2
  Hostname      192.168.2.210
  User          guest01
  ProxyJump     rhost1

Host rhost3
  Hostname      192.168.122.11
  User          test01
  ProxyJump     rhost2 
Host *ホスト名にメタ記述を使用することで、複数のホストを対象にすることができます。「Host *」を記述することで、全てのホストに共通の設定を定義することができます。「Host rhost*」のように記載すると「rhost*」にマッチしたホストが対象になります。
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
このオプションを定義しておくと、ssh接続するときにknown_hostsに登録するかどうかを尋ねられるのを無効にできます。
ServerAliveInterval 6060秒ごとにサーバにキープアライブパケット(null packet)を送信してssh接続を維持します。操作していない時間が長いことでセッションが切断されてしまうことを防止できます。
ServerAliveCountMax 3キープアライブパケットの送信に失敗した場合、3回失敗したら接続を切断します。
Compression yes通信を圧縮します。

広告主へのリンク

ミニPCのお勧め

おウチでLinuxを勉強するのに、ミニPCはどうですか。
仮想環境(KVM)使えば、仮想マシンを複数起動できますし、とても安価にシステム構築の練習ができます。ミニPCはとっても静かで消費電力も小さいので部屋で常時起動させています。

このブログにおける関連リンク

パスワード無しでsshするための設定
犬でも分かる sshポートフォワーディング
犬でも分かる sshポートフォーワーディング2: リバーストンネル

コメント

タイトルとURLをコピーしました