子プロセスにパスワードを渡すには?

子プロセスにパスワードを渡すには?

コマンドラインから(私のプログラムで起動されたサブプロセスに)パスワードを渡すことは安全ではないと悪名高いです(他のユーザーもpsコマンドを使用してパスワードを見ることができるからです)。環境変数として渡すことはできますか?

それを克服するために何を使用することができますか? (環境変数を除く)最も簡単な解決策はパイプを使用するようですが、この簡単な解決策も容易ではありません。

私はPerlでプログラムします。

ベストアンサー1

プロセスパラメータはすべてのユーザーに表示されますが、環境は同じユーザー(少なくともLinuxでは、そして私はすべての最新のUNIXバリエーションについて考えます)。したがって、環境変数を介してパスワードを渡すのは安全です。誰かが環境変数を読むことができれば、その人もあなたと同じようにプロセスを実行できるので、ゲームは終了します。

psたとえば、何かを調査し、誤って結果(機密環境変数を含む)をコピーして公共の場所に貼り付けると、環境コンテンツが間接的に漏洩する危険性があります。もう1つのリスクは、環境変数を必要としないプログラム(パスワードが必要なプロセスの子プロセスを含む)に環境変数を渡し、そのプログラムが環境変数を秘密にしたくないために公開することです。この二次漏洩リスクの重大度は、パスワードのあるプロセスの役割(実行期間、子プロセスが実行されるかどうか)によって異なります。

パイプなどの盗聴用に設計されていないチャネルを介してパスワードを渡すと、誤ってパスワードが漏洩しないようにするのが簡単になります。送信側ではこれを行うのは簡単です。たとえば、シェル変数にパスワードがある場合は、次のようにします。

echo "$password" | theprogram

theprogram標準入力にパスワードが必要な場合。これはecho内蔵されているので安全です。外部コマンドを使用すると、パラメータが出力psに公開されるため安全ではありません。同じ効果を得るもう一つの方法は、ここでドキュメントを使用することです。

theprogram <<EOF
$password
EOF

パスワードが必要な特定のプログラムには、特定のファイル記述子からパスワードを読み取るように指示できます。他に標準入力が必要な場合は、標準入力以外のファイル記述子を使用できます。たとえば、次のようにしますgpg

get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP

プログラムにファイル記述子を読み込むように指示することはできませんが、プログラムにファイルから読み取るように指示できる場合は、「/dev/fd/3」などのファイル名を使用して、プログラムにファイルから読み取るように指示できます。記述子。

theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF

ksh、bash、またはzshでは、プロセスの置き換えによってこれをよりきれいにすることができます。

theprogram --password-from-file=<(echo "$password")

おすすめ記事