web-dev-qa-db-ja.com

シェルスクリプトを実行するとき、stdinまたは文字列オプションを使用して機密情報を渡す方が安全ですか?

暗号化された環境(フルディスク暗号化)内で実行されるいくつかの自動化スクリプトを作成しています。

Windowsと* nixの両方の多くのコマンドには、パスワードなどの機密情報を入力する方法が2つあります。 1つのモードでは、プログラムはユーザーにパスワードの入力を求め、もう1つのモードでは、パスワードはオプション引数を使用して指定されます。

シェルスクリプトを記述する場合、コマンドはこれらのプロセスのいずれかを使用して自動化できます。最初のケースでは、コマンドが実行され、次に標準入力(stdin)がリダイレクトされ、プロンプトが表示されたときにパスワードがプログラムにパイプされます。 2番目のケースでは、パスワードはプログラムの引数として指定されます。

これらの1つは本質的に他よりも危険ですか?知っておくべきトレードオフはありますか?どちらの場合も、パスワードをディスクに保存することに伴うリスクや脆弱性ではなく、パスワードの指定方法について具体的に質問します。

以下は、VeraCryptのCLIバージョンを使用したPythonの例です。

Stdinのリダイレクト:

_cmd = ['veracrypt', "--text", partition, mount_point]
input_file = open_file()
vc_call = subprocess.run(cmd, stdin=input_file)
vc_call.wait()
_


引数としてパスワードを渡す:

_password = get_password_from_file():
cmd = ['veracrypt', "--text", "--non-interactive", "--password", password, partition, mount_point]
vc_call = subprocess.run(cmd)
_

注意:

問題かどうかはわかりませんが、* nixでは、コマンドをシステムコールとして直接実行できます。上記のコードでは、subprocess.run()への呼び出しに_Shell=True_オプションが指定されていないため、デフォルトのシェル内でコマンドが実行されます。私の理解では、Windowsでは、すべてのコマンドはcmdシェルを介して実行する必要があります。これにより2つのオプションに違いが生じる可能性がありますが、その方法はわかりません。

4
BrianHVB

引数はプロセスツリーに表示されるため、stdinを介して渡す方が安全です。

秘密の値を引数として渡すことは、通常、より危険です。引数として何かが渡されると、同じユーザーの下で実行されている他のすべてのプロセス(および他のすべてのユーザーのプロセス、ピリオド)は、各プロセスの引数を表示できます。これが、ps auxを実行して引数を表示できる理由です。一方、stdinを介して値を渡すと、ファイル記述子を介して送信されます。この記述子は、特権のないプロセスでは読み取ることができません。脅威モデルに他の悪意のあるローカルプロセスが含まれる場合は、stdinを介して機密情報を送信する必要があります。

Stdinを介してデータを渡すには、プログラムが標準のIO呼び出しを使用して読み取ることができるファイル記述子を介して渡すことが含まれます。この場合、ファイルを開いて読み取るのと同じくらい安全です。コマンド一方、行引数は、メモリ内のプロセスのargvに保持されます。引数を表示するには、プログラムはメモリのアドレスにアクセスするだけです。ただし、このデータは、プロセス '/proc/<pid>/cmdline。これは実際には一部のシステム(特に古い* nixシステム)の環境変数にも当てはまるため、環境にシークレットを渡すことも必ずしも良い考えではありません。

6
forest

Unixライクなシステムでは、コマンドライン引数がさまざまな方法でリークする可能性があります。それらは通常、同じユーザーとして実行されていないプロセスでさえ、他のプロセスから見えます。 (一部のUnixバリアント(特定の強化されたLinux構成など)は、他のユーザーに対してコマンドライン引数を非表示にできます。)それらは監査ログに保存される場合があります。

Windowsについてはよくわかりませんが、リスクはほぼ同じです。

パイプを介して情報を渡すと(プロセスが標準入力で情報を受け取るため)、デバッガーでスクリプトを実行するなどの特別な手順を実行しない限り、送信プロセスと受信プロセスの外部にリークすることはありません。

選択肢が与えられると、データ漏洩のリスクが減少するという非常に明確な順序があります。パイプは安全です。サブプロセスが他のサブプロセスを生成しない場合、環境変数は通常安全です。コマンドライン引数は機密として扱われるべきではありません。