OpenSSHのProxyJumpとProxyCommandの関係
多段SSH接続の為の二種類の設定
中継サーバーを経由して目的のサーバーに接続する、多段SSH接続。
OpenSSHで多段SSH接続をする為の設定として、ProxyCommand
を使う方法とProxyJump
を使う方法の二種類が有ります。
ProxyCommand
を使う方法は昔からあり、ProxyJump
を使う方法は比較的最近[1]追加された方法です。
この二つの方法について、ごく一部ですが「ProxyCommand
を使う方法は危険なのでProxyJump
を使う方法に切り替えるべき」と言う人々がいます。
しかしProxyCommand
を使う方法が危険だというのは本当なのでしょうか?
今回はProxyJump
とProxyCommand
の関係を調べる事によって、本当に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
を設定した時と同じです。
念のため、-o
でProxyJump
を指定する方法でも試して見ましょう。
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
で起動されるコマンドはProxyCommand
でssh -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
が設定されて起動されます。
つまりProxyJump
はProxyCommand
を使って多段SSH接続する設定を簡潔に行う為の物だったのです。
まとめ
ProxyJump
は内部でProxyCommand
を設定する事で動作しています。
その為起動されるコマンドも同じであり、ProxyJump
の方がセキュリティ的に優れているという事はありません。
なので~/.ssh/config
等でProxyCommand
を使っていたとしても、慌ててProxyJump
に書き換える必要は無いでしょう。
一方で、ProxyJump
はProxyCommand
で設定するより簡潔な記述で済みます。
この点から、新たに設定する場合はProxyJump
を使う方がいいでしょう。
-
それでも8年前からあります ↩︎
Discussion