パスワードを利用して安全にプログラムを提供

パスワードを利用して安全にプログラムを提供

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

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

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

編集(6月9日、3:55 UTC):
コマンドラインからrootを介してパスワードを使用してmysqlを呼び出します。

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")通常のユーザー(dor)を介して実行し、以下を実行します
ps aux | grep mysqlパスワードを表示しない
(一部)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

どうやってこれができますか?

答え1

アップデート関連:

プロセスが開始されると、パラメータを格納するための専用メモリ領域と、渡されたパラメータの数を知らせる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サイクル中にのみ表示されます。


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

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

編集する:

〜のように@ギルスできると言う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環境変数ですが、これを行う必要があります。いいえ多くの実装では、Linuxのファイルに環境をリストするのと同じように使用できますpsps -e/proc/<PID>/environ

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

このトピックに関する追加情報ここ

また、見たいと思うかもしれませんMySQL設定ユーティリティこれにより、ホームディレクトリ()の暗号化されたファイルにパスワードを保存できます.mylogin.cnf

答え2

一般的な解決策は、ファイルまたは標準入力(または引数として渡される必要がある他のファイル記述子)からパスワードを読み取ることです。

答え3

ftpこれは、一部のプログラム(コマンドラインなど)がパスワードを読み取る/dev/ttyプロセス制御TTYを表す各プロセスの特殊ファイルです。これにより、プログラムがパスワードを画面に表示するのを防ぎ、パスワードのソースをより確実に確認できます。

#!/bin/bash

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

echo $PASSWORD

関連情報