Linuxサーバーでアプリケーションを実行し、アプリケーションを実行するときに、次のようにコマンドラインとしてパスワードを指定します。
./myapplication --smtp-password mypassword
私たちのアプリケーションでは、これまで暗号化/復号化を構築していませんでした。これは、非常に単純な監視アプリケーションであると想定されており、非常に単純な「ping」とヘルスチェック、および失敗した場合の電子メールの送信であるためです。
すべての管理者(および他に3人の管理者がいます)は、psを使用してプロセスを一覧表示し、コマンド引数を確認して、パスワードを把握できます。
それを隠す方法はありますか?
Linuxシステムでは、/proc
を適切な hidepid
設定でマウントすることにより、プロセス情報を非表示にできます。 mount -o remount /proc -o hidepid=2
。ただし、これはルートアクセス権を持つ人からプロセス情報を隠すことはありません。より良い解決策は、コマンドラインに機密データを含めないことです。
myapplication
を書き直して、stdinなどの他の手段でパスワードを取得することをお勧めします。環境は別のオプションですが、それは/proc/<pid>/environ
を介して同じeuid(またはeuid 0)を持つプロセスに引き続き表示されます。
そうでない場合は、4.2より前のバージョンのLinuxでは、パスワードがコマンドラインの最初の4096バイトにないようにして、他のプロセスが/proc/<pid>/cmdline
(ps
など)を介してパスワードを取得できないようにして、露出を制限できます。します)。 4.2以降では、/proc/<pid>/cmdline
が切り捨てられなくなりました。
たとえば、zsh
.${(l:4094::/:):-myapplication} --smtp-password=secret
.//////[...]///myapplication
のような最初の引数が4095バイトの大きさ(4096はPATH_MAX制限をトリップする)でmyapplicationを実行するので、パスワードは4095ブレークポイントを超えます。
監査ログとシェル履歴ファイルは、コマンドラインで渡される秘密の文字列に関するその他の懸念事項であることに注意してください。