🐶

OpenSSHのProxyJumpとProxyCommandの関係

2024/06/11に公開

多段SSH接続の為の二種類の設定

中継サーバーを経由して目的のサーバーに接続する、多段SSH接続。

OpenSSHで多段SSH接続をする為の設定として、ProxyCommandを使う方法とProxyJumpを使う方法の二種類が有ります。
ProxyCommandを使う方法は昔からあり、ProxyJumpを使う方法は比較的最近[1]追加された方法です。

この二つの方法について、ごく一部ですが「ProxyCommandを使う方法は危険なのでProxyJumpを使う方法に切り替えるべき」と言う人々がいます。
しかしProxyCommandを使う方法が危険だというのは本当なのでしょうか?

今回はProxyJumpProxyCommandの関係を調べる事によって、本当にProxyCommandが危険なのかを調べてみます。

環境

今回は多段SSH接続という事で、以下の3台のサーバーが登場します。

接続元サーバー: ryuho
踏み台サーバー: taiyo
接続先サーバー: hiyo

ryuho から taiyo を経由して hiyo にSSH接続するのを、ProxyCommandを使った方法とProxyJumpを使った方法で比べます。

今回の試験では各sshコマンドはryuhoで起動しているtmuxの中で実行しています。
これはpstreeでプロセスの親子関係を表示する時にtmuxの下に纏まっていると比較しやすいからです。

ProxyCommandとProxyJumpの比較

まずはProxyCommandを使った方法です。

sue@ryuho% ssh -o ProxyCommand="ssh -W '[%h]:%p' taiyo" hiyo
Last login: Tue Jun 11 03:38:00 2024 from taiyo.iwmt.org
sue@hiyo% who am i
sue      pts/0        Jun 11  3:38 (taiyo.iwmt.org)
sue@hiyo%

hiyoにログインしました。taiyo経由で有る事がwho am iの出力から確認できます。

tmuxの別ウィンドウでpstreeを使って、起動したプロセスを確認します。

sue@ryuho% pstree -a $(echo $TMUX|cut -f 2 -d ,)
tmux: server
  ├─ssh -o ProxyCommand=ssh -W '[%h]:%p' taiyo hiyo
  │   └─ssh -W [hiyo]:22 taiyo
  └─zsh
      └─pstree -a 134617

ProxyCommandで設定したコマンドが子プロセスとして起動されているのが確認できます。

次にProxyJump (-J)を使ってログインしてみます。

sue@ryuho% ssh -J taiyo hiyo
Last login: Tue Jun 11 03:38:04 2024 from taiyo.iwmt.org
sue@hiyo% who am i
sue      pts/1        Jun 11  3:39 (taiyo.iwmt.org)
sue@hiyo% 

ログインしました。

この状態でpstreeで確認します。

sue@ryuho% pstree -a $(echo $TMUX|cut -f 2 -d ,)
tmux: server
  ├─ssh -o ProxyCommand=ssh -W '[%h]:%p' taiyo hiyo
  │   └─ssh -W [hiyo]:22 taiyo
  ├─ssh -J taiyo hiyo
  │   └─ssh -W [hiyo]:22 taiyo
  └─zsh
      └─pstree -a 134617

起動した子プロセスのパラメーターはProxyCommandを設定した時と同じです。

念のため、-oProxyJumpを指定する方法でも試して見ましょう。

sue@ryuho% ssh -o ProxyJump=taiyo hiyo
Last login: Tue Jun 11 03:39:21 2024 from taiyo.iwmt.org
sue@hiyo% who am i
sue      pts/2        Jun 11  3:40 (taiyo.iwmt.org)
sue@hiyo% 

ログイン出来たので、pstreeを実行します。

sue@ryuho% pstree -a $(echo $TMUX|cut -f 2 -d ,)
tmux: server
  ├─ssh -o ProxyCommand=ssh -W '[%h]:%p' taiyo hiyo
  │   └─ssh -W [hiyo]:22 taiyo
  ├─ssh -J taiyo hiyo
  │   └─ssh -W [hiyo]:22 taiyo
  ├─ssh -o ProxyJump=taiyo hiyo
  │   └─ssh -W [hiyo]:22 taiyo
  └─zsh
      └─pstree -a 134617

こちらも子プロセスのパラメーターはProxyCommandの時と同じになっています。

ProxyJumpの正体

ProxyJumpで起動されるコマンドはProxyCommandssh -W '[%h]:%p' 踏み台サーバーを設定した時と同じ物だという事が分かりました。
それではProxyJumpとはいったい何なのでしょうか? ヒントはssh -vでのデバッグメッセージに有ります。

% ssh -v -J taiyo hiyo
OpenSSH_8.0p1, OpenSSL 1.1.1g FIPS  21 Apr 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Reading configuration data /etc/ssh/ssh_config.d/05-redhat.conf
  ~略~
debug1: Setting implicit ProxyCommand from ProxyJump: ssh -v -W '[%h]:%p' taiyo
debug1: Executing proxy command: exec ssh -v -W '[hiyo]:22' taiyo
  ~略~

この出力にあるように、ProxyJump (-J)が指定されると内部ではProxyCommandが設定されて起動されます。
つまりProxyJumpProxyCommandを使って多段SSH接続する設定を簡潔に行う為の物だったのです。

まとめ

ProxyJumpは内部でProxyCommandを設定する事で動作しています。
その為起動されるコマンドも同じであり、ProxyJumpの方がセキュリティ的に優れているという事はありません。
なので~/.ssh/config等でProxyCommandを使っていたとしても、慌ててProxyJumpに書き換える必要は無いでしょう。

一方で、ProxyJumpProxyCommandで設定するより簡潔な記述で済みます。
この点から、新たに設定する場合はProxyJumpを使う方がいいでしょう。

脚注
  1. それでも8年前からあります ↩︎

Discussion