MySQL5.7の初期設定を行う


MySQL5.7では、
初回起動と同時にrootユーザーにランダムな文字列がパスワードとして設定されます。
設定されるパスワードはインストールを行う度に全く違うものです。
それでは設定されたパスワードは何なのでしょうか？
初期パスワードはMySQLのログファイルに出力されています。
ログファイルは、
CentOSだと/var/log/mysqld.logです。
ログを開くと次のようにパスワードが記載されています。

```
[Note] A temporary password is generated for root@localhost: lNMg;#B/f6Y;
```

このパスワードはあくまでも初期パスワードであり、
このようにログに記述されてしまっていますので、
次に説明するmysql_secure_installationで違うものに変更するようにしてください。
※「;」や「,」「.」が含まれている場合もありますので注意してください。

mysql_secure_installation はローカルでの開発で MySQL を利用するような場合は必要ないかもしれませんが、実際に運用する環境にインストールしたのであれば行うべきでしょう。

　このスクリプトでも安全の為、root ユーザーのパスワードを変更するかを聞いてくれます。 既にパスワードを変更していれば改めてパスワードを変更する必要はありません。
　また、MySQL 5.7 から VALIDATE PASSWORD プラグインというプラグインを導入するかを聞かれるようになりました。 導入するとユーザーのパスワードとして設定できる文字列に一定の制限をかけることができます。 パスワードの設定ポリシーは3段階のレベルから設定できます。
　MySQL の初期状態では anonymous という匿名用ユーザーが設定してあります。 実際に運用するには安全ではないユーザーであるため削除することを推奨します。
　リモートホストから root ユーザーでアクセスすることを禁止します。 基本的にはリモートから MySQL にアクセスすることを許す場合は、それ専用のユーザーを作成して許可する方が良いです。
MySQL の初期状態に入っている test という名称のデータベースを削除します。

実際のコマンドは次のようになります。
対話式ですので、Yes(Y)かNo(n)で答えれば良いです。

```
# mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: 初期パスワードを入力する

The existing password for the user account root has expired. Please set a new password.

New password: 新しいパスワードを入力する

Re-enter new password: 再度同じ新しいパスワードを入力する

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: y

There are three levels of password validation policy:

LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: ポリシーに沿った新しいパスワードを入力

Re-enter new password: 再度新しいパスワードを入力する

Estimated strength of the password: 50 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user, a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y Success.

- Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done! 
```

最後にMySQLサーバーの設定を変更します。
細かい設定は、
運用するサービスに合わせて設定して頂きたいのですが、
ここでは筆者なりの最低限の設定について解説します。
設定ファイルはCentOSであれば/etc/my.cnfです。
[mysqld]節に次のものを追加します。

```
# vi /etc/my.cnf
[mysqld]
...(略)
character-set-server = utf8
default_password_lifetime = 0
```

まずはMySQLサーバーのデータベースで利用する文字コードにUTF-8を指定しました。
次にdefault_password_lifetimeですが、
MySQL5.7からユーザーのパスワードの有効期限がデフォルトで360日になりました。
360日するとパスワードの変更を促されてログインできなくなります。
パスワードを定期的に変更した方が良いのかという議論は賛否両論あると思いますが、
本番環境などでパスワードが有効期限を迎えてしまってサービスがストップすることは、
サービス提供を第一に考えた場合によろしくないので、
この有効期限の設定を0に設定して無効にしておきます。