一時的なSSHパイプを作成する方法は?

一時的なSSHパイプを作成する方法は?

サーバーAからBにギガバイトのデータを転送したいです。異なるネットワークにありますが、どちらもSSHを介してアクセスできます。私は別のネットワーク(AでもBでもない)にいるので、システムを介してトンネリングするよりもサーバー間の転送を好みます。 SSHなどの暗号化されたチャネルでこれを行うための最良の方法は何ですか?

最も簡単なオプションは、おそらく暗号化されたタールパイプ(tar | openssl enc | netcat)です。しかし、それほどきれいな感じではありません。

別のオプションは、一時的にユーザーを追加してSSHパイプ(tar | ssh)と一緒に使用するか、一時的に既存のユーザーに認証キーを追加して同じ操作を実行することです。これは、サーバーの1つに特定の条件を待つマルウェアがある可能性が無視できる場合でも、競合状態を可能にします。完全にきれいな感じでもありません。

このワンタイムデータ転送のための最良の方法は何ですか?

ベストアンサー1

私が正しく理解したら、AとBの間、つまりAからBへのSSH接続を確立したいと思います。 AからBへのTCP接続を確立することは可能ですが(Bはファイアウォールの背後にないため、これは不可能です)、Aが信頼できない場合、AのユーザーがBにログインすることを許可すると、Bでセキュリティ違反が発生する可能性があります。 。 。

OpenSSHはこれに簡単なソリューションを提供します。存在する~/.ssh/authorized_keysを使用すると、1つのコマンドのみを実行するようにキーストロークを制限できます。 A:に新しいキーペアを作成します。

serverA$ ssh-keygen -N '' -f ~/.ssh/copy_to_B.id_rsa
serverA$ cat ~/.ssh/copy_to_B.id_rsa.pub

生成された公開鍵を取得し、行末にforceコマンドを追加します。またrestrict、ポート転送のブロックなどのオプションを追加します(たとえば、AがBのファイアウォール境界内で要求を実行できるようにすることができます)。 Bの新しい行は~/.ssh/authorized_keys次のとおりです。

ssh-rsa AAAA… luc@serverA restrict command="cat >~/backups/B/latest.tgz"

このキーを使用してBにログインすると、それに渡したcat >~/backups/B/latest.tgz内容に関係なくコマンドが実行されますssh。このようにBができることはファイルに書くだけです。

serverA$ tar … | ssh -i ~/.ssh/copy_to_B.id_rsa luc@serverB whatever

BのSSHサーバーが十分に新しくない場合は、SSHサーバーがない可能性がありますrestrict。そうでない場合は、そのサーバーと利用可能な他のすべてのオプションをrestrict使用してください(確認B)。no-port-forwardingno-…man sshd

変数を使用してforceコマンドで元のコマンドを参照できますが、SSH_ORIGINAL_COMMANDここで複雑な操作を実行すると、セキュリティホールが開いていないことを確認するのが難しい場合があります。これは、必要なファイル名をコマンドとして渡して、Bがどのファイルにも書き込むことを可能にする簡単なラッパーです~/backups/B。ラッパーは書き込みを防ぐために文字をホワイトリストに追加します../../.ssh/authorized_keys

ssh-rsa AAAA… luc@serverA restrict command="case $SSH_ORIGINAL_COMMAND in *[!-.A-Za-z0-9_]*) echo >&2 'bad target file'; exit 120;; [!-.]*) cat >~/backups/B/\"$SSH_ORIGINAL_COMMAND\";; *) echo >&2 'bad target file'; exit 120;; esac"

おすすめ記事