Change default root password of MySQL5.7
※ 追記あり
TL;DR
mysql --connect-expired-password -u root \
-p$(grep 'temporary password' /var/log/mysqld.log | cut -d' ' -f11) \
-e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword1234@';"
デフォルトのrootパスワードを変更する方法
MySQL5.7からインストール直後のrootパスワードがmysqld.logに吐かれるようになりました。mysqldを起動すると吐かれる。
この挙動はディストリビューションによって異なるようで、yumリポジトリの場合は上に述べたような挙動になっています。
以下のドキュメントに詳しく書いてあります。
ドキュメントにあるように、mysqld.logに吐かれます。
A superuser account 'root'@'localhost is created. A password for the superuser is set and stored in the error log file. To reveal it, use the following command:
shell> sudo grep 'temporary password' /var/log/mysqld.log
以下のようにするとパスワードだけ抜き出せます。
$ grep 'temporary password' /var/log/mysqld.log | cut -d' ' -f11
c?zEmdrQ(4io
このパスワードを使ってMySQLにrootでログインし、rootのパスワードを変更する必要があります。こんな感じでワンライナーでログインすればパスワードをhistoryに残さなくて済むので良さげです。
mysql -u root -p$(grep 'temporary password' /var/log/mysqld.log | cut -d' ' -f11)
ちなみにパスワードを変更しないで使おうとしても以下のようなメッセージが出て弾かれます。
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
ドキュメントにもあるように、以下のsqlでパスワードを変更します。
- MySQL5.7では
validate_password
プラグインがデフォルトで有効になっており、パスワードには少なくとも1つの大文字、1つの小文字、1つの数字、および1つの特殊文字が含まれ、パスワードの合計文字数が8文字以上であることが要求される
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword1234@';
ワンライナーではこんな感じでしょうか(見にくいので改行しています)。
- 期限切れのパスワード(デフォルトで作成されたパスワード)では非対話式での利用ができないので、ワンライナーでsqlを発行する場合は
--connect-expired-password
オプションが必要
mysql --connect-expired-password -u root \
-p$(grep 'temporary password' /var/log/mysqld.log | cut -d' ' -f11) \
-e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword1234@';"
追記
mysql_secure_installationの存在を教えてもらいました!
mysql_secure_instrationもおぬぬめ
— くろぶら (@cross_black777) 2017年9月5日
色々できるみたいですが「You can set a password for root accounts」とありました。そのものズバリ。とほほ。。
感想
MySQL5.7はセキュリティが固くなった感(MySQL5.6以前はインストール直後はrootのパスワードが無かったし)。
ただ、これ構成管理で扱うのだいぶ面倒そうですね…。別途考えてみようと思います。