MySQLのパスワードを隠蔽する

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

WordPressのバックアップに書いたとおり、コマンドラインからMySQLを操作する際には-uオプションに続けてユーザー名と、-pオプションに続けてパスワードを指定する必要があります。

パスワードを暗号化する

普通にシェルでパスワードまで指定してしまうとコマンド履歴に残ってしまうので、セキュリティ上よろしくありません。対話形式で実行する場合、パスワードは都度入力するようにした方がよさそうです。

問題は各種スクリプト。

シェルスクリプトの場合はQiita記事「シェスクリプトのパスワードを暗号化する」にあるようにopensslを利用して暗号化したものを実行時復号してやることで、スクリプトファイルにパスワードを平文で書いてしまうことを回避できます。

手順は次のとおり。

  1. 鍵ファイルの作成と設置
    ssh-keygen
    
  2. パスワード暗号化ファイルの作成と設置
    echo "password" | openssl rsautl -encrypt -inkey ~/.ssh/id_rsa > password.rsa
    
  3. シェルスクリプトで復号処理を記述
    mysql -uUSERNAME -p `openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in password.rsa`
    

パスワードを別ファイルにする

phpでMySQLを操作する場合PDOオブジェクトを使いますが、オブジェクト生成の際にパスワードを平文で書くことになります。

<?php
$dbh = new PDO('mysql:dbname=DBNAME;host=HOSTNAME', 'USERNAME', 'PASSWORD');

通常phpファイルはそのままブラウザに表示されることはありませんが、ちょっと気になる。そこでphpのrequire_onceを使うことで平文のパスワード部分を分離し、ブラウザがアクセスできない場所に移動させることが可能です。

http(s)アクセスさせたくない情報

<?php
// ドキュメントルートより上に置けばhttp(s)アクセスできない
// たとえば/hidden/login_info.phpなど
$dsn = 'mysql:dbname=DBNAME;host=HOSTNAME';
$user = 'USERNAME';
$password = 'PASSWORD';
?>

php本体

<?php
// 実行ファイル本体はドキュメントルート下に配置される
// たとえば/usr/local/www/index.phpなど
require_once('/hidden/login_info.php');
$dbh = new PDO($dsn, $user, $password);

読み取り専用ユーザーを作る

…他にも手法はあるようですが、データベースの内容自体は表示してしまうわけだし、読み取り権限以外を剥奪したユーザーならパスワードなしでもよくね?と思っちゃいました。

CREATE USER 'readonly'@'localhost';
GRANT SELECT ON *.dbname TO 'readonly'@'localhost';

ユーザー作成時にIDENTIFIED BY以降を指定しないことでパスワードレスのユーザーを作り、GRANT SELECTでdbnameの全テーブルについてSELECT以外の操作を拒否します。

これならphpファイルに平文のパスワードを書かなくて済みます。データの登録や編集操作がない場合にはこんな解もあるのかなと。

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。

スポンサーリンク




コメントを残す

*