SSHを使用して文字列をローカルテキストファイルからリモートコマンドに安全に送信する

SSHを使用して文字列をローカルテキストファイルからリモートコマンドに安全に送信する

Ubuntu 18では、次のことが起こりました。

自動化する必要があります離れてgpg-agent私のファイルに保存されているパスワードを使用してシーディング地元のSSHを使用するマシン。

パスワードは、他のユーザーが見やすくするために、主にリモートサーバーで処理する必要がありますが、ローカルシステムでも安全でなければなりません。

問題は、GPG関連の質問ではなく、一般的な質問です。リモートサーバーで実行されているプログラムに文字列を安全に渡すにはssh

コマンドラインにパスワードを入力すると、ps -efローカル(ssh)とリモートシステム()bash -cの両方で使用できることがわかります。だから私はこれを避けるべきです。

また、環境変数にパスワードを格納することは、プロセスの初期環境を見て現在の状態を表示するために使用できることを意味するcat /proc/<pid>/environことも知っています。gdbしたがって、ローカル環境変数を渡すと、ローカルコンピュータまたはリモートコンピュータの詳細を表示できます。特に、リモートシステムのSSHユーザーアカウントへの他の人のアクセスを厳密に制御できないため、これは理想的ではありません。

いくつかを読んで実験した後、次の結論に達しました。実際に動作します!ローカルサーバーにrootアクセス権を持つ人がseed.txtいない場合はchmod 400、ファイルが安全である(または少なくとも私のSSHキーと同じくらい安全である)と仮定できます。

注 -seed.txtリモートサーバーにはなく、ローカルサーバーにのみ存在するため、その内容をリモートサーバーに転送する必要があります。

SSH接続はキーを使用するため、パスワードは必要ありません。

#!/bin/bash
ssh -T my-server <<EOSSH > /dev/null
printf '%s\n' "$(cat seed.txt)" | /usr/lib/gnupg2/gpg-preset-passphrase -c 123456789
EOSSH

ローカルコンピュータでこれを使用すると、リモートで実行される実際のコマンドはコマンドラインを使用するのではなくstdinにパイプ処理されるため、結果のみがps -ef生成されます。ssh -T my-serverssh

繰り返しますが、catコマンドラインにはファイル名のみが表示されます。 printfは組み込みコマンドなので、リモートシステムで実行されているとps考えられます。printf

リモートサーバーでは、ps標準入力を使用してパスワードを再入力した場合にのみ表示されます。/usr/lib/gnupg2/gpg-preset-passphrase -c 123456789

環境変数を直接使用しないので、ここに問題はないはずです。 SSH環境変数が何かを公開するのかと少し心配していますか?

私の質問は - 私のアプローチが合理的で/単純で/安全ですか(ルートアクセスが損なわれないと仮定)、明らかな問題はありますか?それでは、提案された回避策は何ですか?

私が取り組んできた唯一の他のオプションはusingですが、両方をexpect考慮し、sshインタラクティブgpg-preset-passphraseではなく標準入力として入力を幸せに受け入れるように見えるのは少し過剰ですexpect

修正する

以下は非常に便利な答えです。ありがとうございます!それについて考えるほど、私はこれを少し考え直します。おそらく、単一のLinuxアカウント内でそのアカウントの他のユーザーから隔離された何かが他のユーザーが決定した場合、常に達成できないことを受け入れるべきでしょうか?これは通常正しい論理的前提であるようですが、(そのアカウントの)他のユーザーに対して(アカウント別)gpg-agentを実行しようとしていますが、そのユーザーが実際の実行を実行するための資格情報にアクセスできない場合(gpg-エージェントは常にユーザーごとだと思います。)アカウント自体内でこれを行う必要があります。そうですか?同じアカウントのユーザーが自分の作業を最高レベルに上げることができない場合はどうすればよいですか?短い答えは次のとおりです。ユーザーが最高レベルに到達するのは難しいかもしれませんが、決して不可能かもしれませんか?私が知っている限り、gpg-agent他のアカウントのユーザーが使用するように他のアカウントでシードすることは不可能ですか?

ベストアンサー1

printfshリモートシステムによっては組み込まれない場合があります。 Linux( bash)dashでは組み込みプログラムとして実行されますが、echo 'printf --version' | ssh hostOpenBSDshでは実行されません。より大きな問題は、「リモートシステムのSSHユーザーアカウントへの他の人のアクセスを厳密に制御できない」です。これらのユーザー(十分なスキルを持つ)は、ルートアクセスなしでいくつかの悪いことをする可能性があります。

  • 公開鍵があり、公開鍵がわかっている場合は、ファイル内command="..."の項目を使用して別のタスクを実行できます。~/.ssh/authorized_keys
  • bashprintf-and- -formsを使用してもcatシェルのrcファイルを読み取るssh host < seed.txt commandことができるため、export LD_PRELOAD=/something/naughty.soライブラリはstdinを別の場所にコピーしたり何かを実行しようとしたときに興味深い作業を実行できます。gpg-preset-passphrase

おすすめ記事