コマンドラインでMySQLパスワードを使用する安全な代替手段は何ですか?


35

データベースをバージョン管理するためのPHPコマンドラインスクリプトがあります。開発者が新しいデータベースパッチを追加するたびに、このスクリプトを実行します。

スクリプトはMySQLコマンドラインでパッチを実行します。

system('mysql --user=xxx --password=xxx < patch.sql');

ただし、MySQL 5.6では次の警告が発行されるようになりました。

警告:コマンドラインインターフェイスでパスワードを使用すると、安全でない可能性があります

これは明らかに真実ですが、ユーザーにとっては問題になる場合とそうでない場合があります。

  • その場合、安全な代替手段は何ですか?
  • あるいは、この警告を無効にすることは可能ですか?

外部のパスワードファイルに頼る必要はないことに注意してください。


2
ファイルに資格情報を保持することは、それほど大きな問題ではありません。ユーザーがサーバーのルート権限を持っている場合、特定のオプションでmysqlサーバーを再起動するだけで、認証システムを完全にバイパスできます。
ゾレダチェ

これは、提案された複製と同じ問題ではありません。MySQLはパスワードの入力を求めていません。私はそれを提供していますが、うまく機能しています。パスワードファイルを除く、パスワードを提供する代替手段を探しています。
ベンジャミン

回答:


17

MySQLの最新のGAバージョン、つまりバージョン 5.6では、http: //dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.htmlで説明されているように、mysql_config_editorコマンドを使用してこれを実行できます。

基本的には、ホストエイリアスを使用してユーザー/パスの資格情報を暗号化してから、ホストエイリアスを使用し、この情報をホームディレクトリの設定ファイルに入れてから、必要に応じて:

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

あなたは代わりに書く:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

これにより、パスワードを平文のスクリプトに入れないようにします。

これを機能させるには、最初に(一度だけ)次のように定義する必要がありますmyhostalias

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

必要に応じて、アカウントやホストごとに異なるログインパスを使用できます。あなたが私に尋ねるなら、かなり良い考えです。

メモとして、この機能は5.6より前のバージョンには存在しないと思います。


注:mysql_config_editorが実際に外部パスワードファイルを作成することは理解していますが、これはユーザーによって行われるのではなく、システムの仕組みなので、ユーザーが手動でen / de / cryptingを行う必要はありません。
TuncayGöncüoğlu13年

おかげで、MySQL 5.6を使用しているので、これは問題になりません。とはいえ、PHPの構成ファイルからリアルタイムでパスワードを取得し、コマンドラインに動的に渡すため、あなたのアプローチは(少なくとも現在の動作では)問題があります。あなたの提案では、を呼び出すときにコマンドラインでパスワードを使用する必要がありますmysql_config_editorので、残念ながらそれ以上の価値はありません。また、開発者が手動で行うことを避けようとしているため、PHP構成ファイル mysql構成の両方を維持する必要があります。
ベンジャミン

私の最善の解決策は、おそらく今のところ警告を無視することです。セキュリティの問題があるのか​​と思っています。PHPから呼び出されているため、コマンドラインはbashの履歴やマシン上のどこにも保存されていないのでしょうか。
ベンジャミン

私の知る限りではありません。bashの履歴には保存されません。ただし、php configファイル内のプレーンテキストのパスワードには、まったく別の形式のまったく同じリスクが伴います。mysql_config_editorを使用してパスワードを保存し、php configファイルにログインパスを保存することをお勧めしますか?そうすれば、パスワードをどこにも公開することはありません。(ただし、外部パスワードを維持する必要があります)。
TuncayGöncüoğlu13年

9

--defaults-fileまたは--defaults-extra-fileオプションを使用します。ユーザーIDとパスワードを指定できます。これはと同じ形式です/etc/my.cnf

さらに読むと、外部パスワードファイルに依存する必要はないと言いますが、それが唯一の本当に安全な方法です。他のものは、プロセステーブルなどに痕跡を残します。本当に必要な場合は、パスワードファイルをバージョン管理に入れることもできます。600(または400)にし、mysqlまたはそれを実行しているユーザーのみが読み取り可能にします。


1
私はセキュリティ上の理由でパスワードファイルに反対していません。MySQLのクレデンシャルはPHPアプリケーションのグローバル設定の一部であり(PDO接続にも使用されます)、そうすることは(一時的な)パスワードファイルを作成することを意味しますスクリプトの存続期間(数秒)の間、mysqlコマンドラインを実行するため。
ベンジャミン

Windows Server 2012でこれを行う方法は?--defaults-fileオプションを含む設定ファイルはどこにありますか?
ジェイク

次のように--defaults-fileのオプションとしてファイルを指定するだけですmysql --defaults-file c:\some\dirs\my.cnf
。– lsd

@Benjamin、セキュリティに関するものでない場合は、コマンドラインにパスワードを入力するだけです。(セキュリティ以外に)それを行うことの何が問題になっていますか?
パセリエ

@Benjamin既にPHPからMySQLを使用している場合、なぜmysqlコンソールクライアントをフォークするのですか?
ジョシップロダン

5

http://dev.mysql.com/doc/refman/5.1/en/password-security-user.htmlごとに4つのオプションがあります

  • コマンドラインで-pyour_passor --password=your_passオプションを使用する
  • パスワード値を指定せずにコマンドラインで-pまたは--passwordオプションを使用します。この場合、クライアントプログラムは対話形式でパスワードを要求します。
  • オプションファイルにパスワードを保存します。
  • MYSQL_PWD環境変数にパスワードを保存します

必要に応じて、MYSQL_PWDオプションがありますが、安全ではありません。本当にインタラクティブなプロセスを生成--passwordし、パスワードをインタラクティブに送信する必要がありますが、この問題の解決策はかなり複雑です。


1
MYSQL_PWDはコマンドラインよりも安全性が低いのでしょうか?PWがプロセスリストに表示されることはありません。これが主な関心事であるようです
-TheLQ

1
確かにそうです。man ps-E Display the environment as well. URLから私はにリンク:MySQLのパスワードを指定するこの方法は非常に安全でないとみなされなければならず、使用すべきではありません。psの一部のバージョンには、実行中のプロセスの環境を表示するオプションが含まれています。一部のシステムでは、MYSQL_PWDを設定すると、psを実行する他のユーザーにパスワードが公開されます。このようなバージョンのpsがないシステムでも、ユーザーがプロセス環境を調べることができる他の方法はないと想定するのは賢明ではありません。
RS

このMYSQL_PWDオプションからの選択:スクリプトの先頭で環境変数を設定し、MySQLコマンドラインを起動し、その後スクリプトの最後でクリアすると、露出時間を最小限に抑えることができると思います。それは理にかなっていますか?
superjos

@kormoc、最後の段落について詳しく説明してください。あなたが話していた、そのかなり複雑なソリューションとは何ですか?
パセリエ

1
環境変数を使用すると思われているコマンドラインよりも安全。デフォルトのdebianシステムpsでは、すべてのユーザーのすべてのプロセスのコマンドライン引数を確認できます。ただしps e、独自のプロセスの環境のみを表示します(もちろんルートでない限り)。わずかに安全性が高いだけですが、それでも安全性は高くなります。
jlh

4

PHPスクリプトに既にデータベース接続が開いている場合、なぜmysqli_multi_query().sqlファイルのインポートに使用しないのですか?もちろん、.sqlファイルの構文が有効な場合...


非常に大きな.sqlファイルでどの程度うまく機能するのかわかりません。
ベンジャミン

1
@Benjamin MySQLクライアントほど悪いことはないと思います-セキュリティについて本当に心配しているのなら、これが最もハック的な方法ですが、サイズは多くの方法で解決できる問題です。
voretaq7

PDOで可能かどうか知っていますか?
ベンジャミン

PDOには、データベースに一度に大量のクエリをスローするための同等の機能がないようです。ごめんなさい。それは...アイデアだった
マイケル・ハンプトン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.