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-server
ssh
繰り返しますが、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
printf
sh
リモートシステムによっては組み込まれない場合があります。 Linux( bash
)dash
では組み込みプログラムとして実行されますが、echo 'printf --version' | ssh host
OpenBSDsh
では実行されません。より大きな問題は、「リモートシステムのSSHユーザーアカウントへの他の人のアクセスを厳密に制御できない」です。これらのユーザー(十分なスキルを持つ)は、ルートアクセスなしでいくつかの悪いことをする可能性があります。
- 公開鍵があり、公開鍵がわかっている場合は、ファイル内
command="..."
の項目を使用して別のタスクを実行できます。~/.ssh/authorized_keys
bash
printf
-and- -formsを使用してもcat
シェルのrcファイルを読み取るssh host < seed.txt command
ことができるため、export LD_PRELOAD=/something/naughty.so
ライブラリはstdinを別の場所にコピーしたり何かを実行しようとしたときに興味深い作業を実行できます。gpg-preset-passphrase