接続したいターゲットマシンT
があるとしましょう。 T
はプライベートネットワークにあるため、プロキシネットワークP
(そのネットワークに接続されている)を介して接続する必要があります。このため、最初にP
にsshし、そこからもう一度T
にsshします。
P
が悪意があると仮定しましょう。これは私のマシンM
にとってどれほど危険なのでしょうか?可能な攻撃方向は何でしょうか? P
はM
とT
の間で何らかの [〜#〜] mitm [〜#〜] 攻撃を実行できますか?
このため、最初にPにsshし、そこからもう一度Tにsshします。
これを正しく解釈した場合は、Pにログインしてシェルを取得し、このシェル内からsshを実行します。 Pが危険にさらされている場合、期待されるシェルや期待されるsshバイナリではなく、期待される端末を取得することを信頼できません。すべてにバグがある可能性があります。つまり、実行するすべてのキーストローク(パスワードを含む)を傍受したり、すべての入出力を記録したり、送信前に変更したりできます。
Opensshを使用している場合(覚えていれば> 7.3)、これにはMITM機能がないことを保証するProxyJump機能があります。 (以前のバージョンでも同じことができますが、ProxyJumpを使用すると非常に便利になります。)
ssh -J me@P me@T
できました。
man ssh
のスニペットは次のとおりです:
-J destination
Connect to the target Host by first making a ssh connection to the
jump Host described by destination and then establishing a TCP
forwarding to the ultimate destination from there.
クライアントは最初にジャンプホストに接続し、クライアントとターゲットのポート22の間に双方向パイプを確立するようジャンプホストに指示します。次に、クライアントはその双方向パイプを使用して、ターゲットとのssh接続を確立します。ジャンプホストはフェリーを実行しているだけです-「攻撃」は最悪の場合のサービス拒否に限定され、それ以上のものはありません。
Sshが「proxyjump」を追加する前は、次のようにします(以下の-f
はメモリからのものです。それが-f
か-N
だったかは思い出せません):
ssh -f -L 2222:target:22 me@jumphost
ssh -p 2222 [email protected]
しかし、proxyjumpはそれをずっと簡単にします。
まず、仮定:
T
に保存されているP
の正確な公開鍵があると仮定します(S
を通過しないチャネルを通じて取得する必要があります)。これらの前提条件が満たされる場合、S
(ソースシステム)とP
の間にポートフォワードを確立して、SからTに直接接続することができます(コメント@sitaramに感謝)。次に、S
からT
に直接SSHで接続し、T
を公開鍵で検証します。また、P
が侵害される脆弱性はありません(接続がないか、安全な接続です。
コマンド:
S:> ssh -L 9999:T:22 Puser@P # Don't use this Shell, but keep it running.
S:> ssh -p 9999 [email protected] # Use this Shell
これにより、P
が信頼できない場合に説明した攻撃を軽減できます。ただし、T
のSSHポートはマシンS
のすべてのユーザーに公開されるため、注意して選択する必要があります。
関連する質問を見ていると、2つの重要な概念が見つかりました。
SSHエージェント転送 (回答を参照 こちら )。質問で述べたケースでは、悪意のあるマシンのルートP
がM
の秘密のsshキーを使用して他のサーバーで認証できます。
X11 Forwarding (フラグ-X
、つまりssh -X user@Host
を使用してsshを実行する場合)、ここでサーバーはクライアントマシンでコマンドを実行できます。