パスワードとセキュリティのパイピング


11

私は時々やりますecho "secret" | mysql -u root -p ...。今、私はここでセキュリティについて心配しています:すべてのプロセスをリストする誰かがパスワードを見ることができますか?

確認するには、「ps aux」の出力にecho "test" | sleep 1000秘密のechoコマンドが表示されていませんでした。だから私はそれが安全だと思います-しかし、セキュリティの専門家はそれを確認できますか?:)


無限ループを実行しているとき、プロセスリストに表示されません。良い質問。
ティム

1
さらに、ほとんどのシェルで入力したものは、どこかに(など.history)履歴ファイルに保存されることを忘れないでください。
アレクサンダーバード

回答:


13

これに対する答えは、使用しているシェルによって異なります。多くのシェルが持っているechoとして、組み込みのそれはリストのプロセスに表示されませんので、別のプロセスを生成していないことを意味コマンド。しかし、あなたが入力した場合/bin/echo./echo、またはあなたが組み込みコマンドを無効にした場合enable -n echo、コマンドは、シェルは、その組み込みコマンドを使用せず、代わりにバイナリバージョンを使用します。これはプロセスリストに表示されます。

シェルのビルトインではなくバイナリを使用している場合、他のプロセスのSTDINバッファーにデータを移動するのにかかる限り、echoコマンドが表示されます。このバッファのサイズは有限であるため、バッファに収まらないデータがある場合、他のプロセスがバッファからデータの一部を読み取ることができるようになるまで、echoコマンドはしばらく待機する必要があります。ほとんどの場合(上記の2つの例など)、この期間はマイクロ秒になります。エコーを使用してMySQLに20MBのSQLダンプを貼り付ける場合、これは長くなる可能性があります。どんなに短い時間であっても、シェル組み込みの代わりにバイナリを使用していて、誰かがたまたまタイミングを合わせると、プロセスリストでプロセスを見ることができます。

これを回避するには、秘密データをファイルに(適切なアクセス許可を使用して)入れ、このファイルを次のようにSTDINとして使用します。

mysql -u root -p < file_with_secret.sql

5
このようにコマンドラインでパスワードを入力すると、シェルの履歴ファイルに保存される可能性が高いため、履歴ファイルの許可と内容を確認する価値があることに注意してください。
aculich

3

mysqlの場合、〜/ .my.cnfを使用してシークレットを保存できます。

[client]
user = DBUSERNAME
password = DBPASSWORD
host = DBSERVER

[mysql]
database = DBNAME

1

使うだけ

mysql -uroot -p

Enterキーを押します。次に、パスワードの入力を求められ、プロセスリストまたは履歴ファイルのいずれにも表示されなくなります。


MySQLがSTDINで受け入れたデータは、ログイン後に実行されるコマンドです。質問の「秘密」はパスワードではありません。
ラダダダダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.