私はLinuxサーバー上でアプリケーションを実行しています。アプリケーションを実行すると、次のようにコマンドラインにパスワードが表示されます。
./myapplication --smtp-password mypassword
これまでのところ、私たちのアプリケーションは非常に単純な監視アプリケーションであると仮定し、「ping」とヘルスチェックを実行し、失敗したときに電子メールを送信するのは非常に簡単であるため、暗号化/暗号化解除機能は組み込まれていません。
すべての管理者(他の3人の管理者がいます)は、psを使用してプロセスのリストを一覧表示し、コマンド引数を表示し、パスワードを見つけることができます。
隠す方法はありますか?
答え1
myapplication
より良いアプローチは、他の手段(標準入力など)を介してパスワードを取得するようにそれを上書きすることです。環境は別のオプションですが、.environを介して同じeuid(またはeuid 0)を持つプロセスに表示され続けます/proc/<pid>/environ
。
そうでない場合、Linux 4.2より前のバージョンでは、パスワードがコマンドラインの最初の4096バイト内にないようにすることで、他のプロセスがそれを読み込んでパスワードを取得できないようにすることで露出を制限できます/proc/<pid>/cmdline
。ps
バージョン4.2以降ではこれ以上切り捨てられません/proc/<pid>/cmdline
。
例えば、zsh
.${(l:4094::/:):-myapplication} --smtp-password=secret
myapplicationを実行すると、最初のパラメーターのサイズは4095バイト(4096バイトはPATH_MAX制限を超えています)です。したがって、.//////[...]///myapplication
パスワードは4095ブレークポイントを超えています。
監査ログとシェル履歴ファイルは、コマンドラインに渡される秘密の文字列に関連するもう1つの関心領域です。
答え2
/proc
Linuxシステムでは、適切なマウントを使用してプロセス情報を隠すことができます。hidepid
たとえばmount -o remount /proc -o hidepid=2
、rootアクセス権を持つ人にはプロセス情報が隠されません。より良い解決策は、コマンドラインに機密データを含まないことです。