ProxyJump を Bash に置き換える

ProxyJump を Bash に置き換える

リモート ボックスで開発を行う必要があります。幸い、シェル アクセスはありますが、AllowTcpForwarding が false に設定されているゲートウェイを通過する必要があります。

ドキュメントをちょっと見てみたところ、次のように書いてありました。

AllowTcpForwarding TCP 転送を許可するかどうかを指定します。デフォルトは「はい」です。TCP 転送を無効にしても、ユーザーがシェル アクセスも拒否されない限り、セキュリティは向上しません。ユーザーはいつでも独自の転送プログラムをインストールできるためです。

独自のフォワーダーをインストール(または構築)するにはどうすればいいでしょうか?ここでの私の目標は、Pycharm を使用したリモート通訳SSH 経由でローカル ポートにバインドし、そのデータを SSH 経由で送信し、ゲートウェイ経由で、コードが実際に実行される開発ボックスに送信します。この作業には、nc やその他の UNIX ユーティリティを何らかの方法で利用できると思います。

次のようにすればリモートボックスに ssh できることがわかります。

ssh -t user1@gateway ssh user2@devbox

しかし、明らかにこのオプションはpycharmでは利用できません。ローカルポートを開いて、

ssh -p 12345 localhost
(or variant)

user2@devbox に接続します。これにより、リモート インタープリターがポートを使用してリモート ボックスに接続するように構成できるようになり12345ますlocalhost

答え1

実行できる限りsocatローカルで およびgateway(または および のみbashcat最後gatewayの例を参照)であり、ないpty を使用して 8 ビット クリーンにすると、ssh 経由でトンネルを確立できます。次の 4 つの例は、前の例を改良したものです。

一度だけ動作する基本的な例

(フォークすると、トンネルごとに 1 つの ssh 接続が必要になるため、好ましくありません)。socat が:exec コマンドを受け入れるようにエスケープする必要があります。

  • 用語1:
    $ socat tcp-listen:12345,reuseaddr exec:'ssh user1@gateway exec socat - tcp\:devbox\:22',nofork
    
  • 用語2:
    $ ssh -p 12345 user2@localhost
    
  • 用語1:
    user1@gateway's password:
    
  • 用語2:
    user2@localhost's password: 
    

1番目と2番目のアドレスを逆にするとソケットがすぐに使用可能になる

socat責任を負い続けなければならないので、いいえnofork

  • 用語1:
    $ socat exec:'ssh user1@gateway exec socat - tcp\:devbox\:22' tcp-listen:12345,reuseaddr
    user1@gateway's password:
    
  • 用語2:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

を使ってControlMasterssh

ゲートウェイへの単一の SSH 接続のみを使用してフォークできるため、通常のポート転送と同様の動作が実現します。

  • 用語1:
    $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
    user1@gateway's password:
    
  • 用語2:
    $ socat tcp-listen:12345,reuseaddr,fork exec:'ssh -o ControlPath=~/mysshcontrolsocket user1@gateway exec socat - tcp\:devbox\:22'
    
  • 用語3:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

のみbashcat利用可能gateway

使用することでbashの組み込みTCPリダイレクト、および 2 つの半二重catコマンド (全二重の結果用) では、リモートまたはさえ必要ありませんsocatnetcatネストされエスケープされた引用符の複数のレイヤーの処理は少し扱いに​​くいため、リモート スクリプトを使用することで、より適切に実行したり、簡素化したりできます。出力のみにbash分岐するように注意する必要があります。cat

  • 用語1(変更なし):
    $ ssh -N -o ControlMaster=yes -o ControlPath=~/mysshcontrolsocket user1@gateway
    user1@gateway's password:
    
  • 用語2:
    $ socat tcp-listen:12345,reuseaddr,fork 'exec:ssh -T -o ControlPath=~/mysshcontrolsocket user1@gateway '\''exec bash -c \'\''"exec 2>/dev/null 8<>/dev/tcp/devbox/22; cat <&8 & cat >&8"\'\'\'
    
  • 用語3:
    $ ssh -p 12345 user2@localhost
    user2@localhost's password:
    

答え2

ProxyJump を Bash に置き換える

上記のアイデアは良いですね!これが私の一般的なssh_configバージョンです。プロキシジャンプ動かないなぜならTCP転送を許可するno に設定されており、デフォルトのシェルは BASH です。

ProxyCommand=ssh -T user1@gateway "exec 3<>/dev/tcp/%h/%p 2<&- ; cat <&3 & cat >&3 ; kill $!"
  • -T擬似端末割り当てを無効にする
  • 実行者新しいプロセス(bash)は作成されません
  • 3<>利用可能なファイル記述子へのリダイレクトです
  • /dev/tcp/...bash に対応する TCP ソケットを開くように要求します。
  • %hそして%pOpenSSHクライアントによって次のように評価されます開発ボックスそして22
  • 2<&-STDERRを閉じます(/dev/nullにリダイレクトすることもできます)
  • 猫 <&3 &選択されたファイル記述子3をバックグラウンドで読み取ります
  • 猫 >&3フォアグラウンドでファイル記述子を書き込む
  • $を殺せ!「読書」を殺すだろう猫 <&3接続を閉じたり切断したりするときに、コマンドはバックグラウンドで実行されます。そうでない場合は、コマンドは実行され続けます。

ジャンプ サーバーで ProxyJump が無効になっている場合に ProxyJump を置き換えることはできますが、追加の暗号化レベルなしでそこに秘密鍵を転送したり、パスワードを入力したりすることは本当にしたくありませんでした。他の SSH_AUTH_SOCK をルートとして使用したり、キーストロークでターミナル セッションを完全に記録したりすることは、どちらも実際に可能です。

ただし、自分に適用されるポリシーに違反しないように常に注意してください。

答え3

ああ、Netcat を忘れるところでした!

ジャンプ ホストに Netcat (任意のバージョン) がある場合は、通常、次のように設定で ProxyJump の代わりに Netcat を使用できます。

ProxyCommand=ssh -T user1@gateway "exec nc %h %p"

またはコマンドラインから:

ssh user2@devbox -oProxyCommand="ssh -T user1@gateway 'exec nc devbox 22'"

答え4

別のポートで実行するために別の sshd を設定するだけです。
設定を編集して、tcpforwarding が許可されるようにします。

cp /etc/ssh/sshd{,-second}_config 

sshd-second_configを編集する

Port 22220
cp /usr/lib/systemd/system/sshd.service  /etc/systemd/system/sshd-second.service

/etc/systemd/system/sshd-second.service を次のように変更します。

Description=OpenSSH server second instance daemon
ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS

ExecStart 行はリリースによって異なる場合があります。

systemctl daemon-reload
systemctl enable sshd-second.service --now

詳細は以下をご覧ください:
https://access.redhat.com/solutions/1166283

これで、必要なものを何でも転送できるはずです。

関連情報