パスワードでプログラムを安全に供給する


9

コマンドラインでのパスワードの使用に関する問題を理解し、問題なく(どこかにパスワードが記録されずに)プログラムにパスワードを与える方法を見つける必要があります。

私はソースからLAMPサーバー全体を自動的にインストールするbashスクリプトを持っています:Apache、FastCGI、PHPおよびMySQL。これらのインストールにはパスワード、特にMySQLが必要です。

パスワードを明かさずにスクリプトを完全に自動化するにはどうすればよいですか?

編集(6月9日、3:55 UTC):
コマンドラインでパスワードを使用して、mysqlをroot経由で起動します。

root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

(この場合はPASS = "p4ssw0rd")
そしてps aux | grep mysql、通常のユーザー(dor)を介して実行しますが、パスワードは表示されません
(の一部)ps出力は次のとおりです。

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3562  0.0  0.0  34156  2864 pts/0    S+   05:53   0:00 mysql -u root -px xxxxxx

それはどうして可能ですか?


unix.stackexchange.com/q/385339/135943も参照してください。ただしこれによって安全になるわけではありません。
ワイルドカード

回答:


11

アップデートに関して:

プロセスが開始されると、引数が格納される専用のメモリ領域と、渡された引数の数を示すintがあります。

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar

MySQLは、パスワードがコマンドラインでによって渡されたかどうかを確認し-p、表示されていない新しい変数にコピーした場合は、そのメモリ領域をx'es で上書きします。

簡単に言えば、例:

argc 2
argv[1] -p
argv[2] p4ssw0rd

new_var = copy(argv[2]);
argv[2] = "xxxxx";

あなたはそれを例えばclient/mysqladmin.ccソースコードの中で見つけることができます:

  case 'p':
      ...
      opt_password=my_strdup(argument,MYF(MY_FAE));
      while (*argument) 
          *argument++= 'x';     /* Destroy argument */

ときにps実行するには、引数のメモリ領域を、(読み込みargv[N])、ひいてはそれがありますxxxx

パスワードが表示されている間は非常に短時間ですが、数CPUサイクルのみです。


MySQLのパスワードは、特別な--init-fileオプションと手順を使用して更新できます。C.5.4.1.2。ルートパスワードのリセット:Unixシステム

mysqld_safe --init-file=/home/me/mysql-init &

編集:

以下のよう@Gillesは言う、することができechoprintfまたは使用のhereスクリプトからドキュメント。

これを.my.cnfホームディレクトリまたは(一時)ファイルに--defaults-extra-file追加して、オプションを使用することもできます。(そのオプションをコマンドラインの早い段階で追加する必要があることを確信してください。)オプションでユーザーも含めます。また、構成としてそのファイルのみを使用する場合を除いて、オプション名の追加部分にも注意してください。

[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...

オプションで、[client]グループ化によりmysqld構成がスキップされます。

一つは、また、使用することができMYSQL_PWD、環境変数を、それは必要があります決してあなたが環境を一覧表示することができますよう、多くので、使用しないことpsにより、実装ps -eに、/proc/<PID>/environなどのLinux上のファイル

tr '\0' '\n' < /proc/<PID>/environ

トピックの詳細はこちら

また、ホームディレクトリの暗号化されたファイルにパスワードを保存できるようにするMySQL構成ユーティリティを確認することもできます.mylogin.cnf


mysql-initbash変数に格納されているパスワードを使用して、ファイル内のトークンを変更する方法はありますか?(明かされることなく)
2013年

4
@Dorは組み込みなecho 'password=p4ssw0rd' >>mysql.cnfので安全echoです。パスワードはどのプロセスのコマンドラインにも表示されません。hereドキュメントも安全です。
Gilles「SO-邪悪なことをやめ

4

典型的な解決策は、ファイルまたは標準入力(またはパラメーターとして渡す必要がある別のファイル記述子)からパスワードを読み取ることです。


3

一部のプログラム(コマンドラインftpなど)/dev/ttyは、プロセスの制御TTYを表すプロセスごとの特殊ファイルであるからパスワードを読み取ります。これにより、プログラムはパスワードを画面にエコーバックせず、パスワードがどこから来たのかについてもう少し確実になります。

#!/bin/bash

stty -F /dev/tty -echo 
read PASSWORD < /dev/tty

echo $PASSWORD
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.