先日投稿しましたページで、MySQL で「パスワード設定されていないユーザーがあるよ!」という指摘をいただきましたので対応いたします。
ポイント
# MySQL のユーザー、接続元、パスワードを表示 SELECT user, host, password FROM mysql.user; # ユーザーを削除(条件:無名ユーザーまたはパスワードが設定されていないユーザー) DELETE FROM mysql.user WHERE user='' or password=''; # 全ての対象に全ての権限を付与して、ユーザー名:username、接続元:hostname、パスワード:password、であるユーザーを追加 GRANT ALL ON *.* TO username@"hostname"IDENTIFIED BY "password";
MySQL でパスワード設定されていないユーザーを確認して方針を考えました♪
まずは現状を確認します。
mysql> SELECT user, host, password FROM mysql.user; +---------------+---------------+-------------------------------------------+ | user | host | password | +---------------+---------------+-------------------------------------------+ | root | localhost | *Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | root | dti-vps-srv57 | | | root | 127.0.0.1 | | | root | ::1 | | | | localhost | | | | dti-vps-srv57 | | | wordpressuser | localhost | *6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | +---------------+---------------+-------------------------------------------+ 7 rows in set (0.00 sec) mysql>
dti-vps-srv57 から接続する root ユーザー、127.0.0.1 から接続する root ユーザー、::1 から接続する root ユーザー、localhost から接続する無名ユーザー、dti-vps-srv57 から接続する無名ユーザー、の 5 つのユーザーにパスワードが設定されていません。
わたくし、今まで存じあげず、でもなんとなくわかってきていて、今回もう少しわかってきたことがあります。
MySQL ユーザーは、接続元を指定すればそれぞれの接続元に対してパスワードを設定することが可能です。ひとつのユーザーにひとつのパスワードだけではありません。
ということで、root ユーザーのいくつかの接続元に対して、パスワードを設定しておりませんでした。ななんと!われながら甘すぎます><。
コワイ。
これらの接続元を見てみますと、127.0.0.1 = ::1(補:IPv6) = localhost です。また、dti-vps-srv57 ですが、これも自分自身を指しています。ただし、これは今使用しておりませんので、そのうち消そうかと考えています。ともかく、これらは皆同じですので、すでに設定してある localhost と同じパスワードを設定いたしました。
MySQL でパスワード設定されていないユーザーの削除・またはパスワード設定記録♪
まずは無名のユーザーまたは、パスワードが設定されていないユーザーを削除いたしました。
mysql> # 無名のユーザーまたはパスワードが設定されていないユーザーを削除 mysql> DELETE FROM mysql.user WHERE user='' or password=''; Query OK, 5 rows affected (0.01 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.01 sec) mysql>
あ。
あ、間違えました。
無名のユーザーは削除してよかったのですけれども、パスワードが設定されていないユーザーは削除してはダメでした><。ですので、ユーザーを作成してその時同時にパスワードを設定いたしました。
mysql> # GRANT ALL ON *.* ← 全ての対象に全ての権限を付与 mysql> # username@"hostname" ← 接続元とユーザー名を指定 mysql> # IDENTIFIED BY "password" ← パスワードを指定 mysql> GRANT ALL ON *.* TO root@"127.0.0.1"IDENTIFIED BY "password"; Query OK, 0 rows affected (0.04 sec) mysql> GRANT ALL ON *.* TO root@"::1"IDENTIFIED BY "password"; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL ON *.* TO root@"dti-vps-srv57"IDENTIFIED BY "password"; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql>
これでよいはずです。
あらためて MySQL のユーザー、ホスト、パスワードを確認
mysql> SELECT user, host, password FROM mysql.user; +---------------+---------------+-------------------------------------------+ | user | host | password | +---------------+---------------+-------------------------------------------+ | root | localhost | *Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | root | dti-vps-srv57 | *Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | root | ::1 | *Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | root | 127.0.0.1 | *Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | wordpressuser | localhost | *6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | +---------------+---------------+-------------------------------------------+ 5 rows in set (0.00 sec) mysql>
大丈夫ですね。
おわりに
ふたたび MySQLTuner を実行してみましたらパスワード設定に関しましては OK との診断をいただきました。
-------- Security Recommendations ------------------------------------------- [OK] All database users have passwords assigned
また上述しました、ホストが「dti-vps-srv57」の root ユーザーを削除いたしました。
mysql> DELETE FROM mysql.user WHERE host = 'dti-vps-srv57'; Query OK, 1 row affected (0.00 sec) mysql>
残りの MySQLTuner をきっかけとしたチューニングはあと 3 つです。取り組んでいきたいと思います。
- テーブルが断片化しているよ!
- Query cache が無効になっているよ!
- Thread cache が無効になっているよ!
以上です。