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の存在を教えてもらいました!

色々できるみたいですが「You can set a password for root accounts」とありました。そのものズバリ。とほほ。。

感想

MySQL5.7はセキュリティが固くなった感(MySQL5.6以前はインストール直後はrootのパスワードが無かったし)。

ただ、これ構成管理で扱うのだいぶ面倒そうですね…。別途考えてみようと思います。

参考リンク