FreeBSD 11.4 RELEASE - MySQL - パスワード設定

 クラウディア
1. 概要
2. パスワードの有効期限
3. validate_password
4. パスワードを一時的に単純化
5. パスワードを恒久的に単純化
6. validate_password 無効化

1. 概要

 パスワードに関する設定は、「my.cnf」に記述する内容もあるのですが、いささか面倒なこともあるので、ページを分けました。  ここでは、主にパスワードを単純化するような内容を書いていますが、開発時や私的につかうサーバのみに適用するようにしてください。  実際に他の人が使用するようなサーバでは、きちんとパスワードを利用するようにしないと、セキュリティ上、非常に問題があります。

2. パスワードの有効期限

 何も指定しなければ MySQL のパスワードの有効期限はデフォルトで 360日なのだそうです。  ただし、デフォルトの設定で [mysqld] セクション、32行目に

default_password_lifetime = 0
 という行があります。  これはパスワードの有効期限を無期限にする設定で、うっかり忘れると大変なことになりそうな気がします。  幸いなことに ports でインストールした場合、デフォルトで上記設定になっているようです。

3. validate_password

 「validate_password」というプラグインが、「MySQL 5.6」あたりから(?)登場しています。  パスワードのチェックは、通常は「validate_password」で行うようです。  明示的にインストールすることもあるようです。  少なくとも、「FreeBSD」上の、「MySQL 5.7」では、デフォルトでインストールされています。  以下、下記のサイトを参考にさせていただきました。
MySQL の validate_password のルールをゆるくする - Qiita」
「Mysql 5.7* パスワードを Policy に合わせるとめんどくさい件について - Qiita」
「MySQL(5.7)メモ - Qiita
 デフォルトの設定値は、以下の通り。

mysql> SHOW GLOBAL VARIABLES LIKE 'validate%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+
7 rows in set (0.00 sec)
 中でも「validate_password_policy」の設定値が、あれこれ左右するようで、以下のように設定されるようです。
設定値   意味   備考
LOW パスワードの長さのみチェック
MEDIUM LOW に加えて、数字・小文字・大文字・特殊文字をそれぞれ1文字ずつ含む
STRONG MIDIUM に加えて、4文字以上の文字列が辞書ファイルの内容と一致してはならない

 パスワードの長さは、「validate_password_length」で最小文字数が定義されていますが、4より小さい値には設定できません。

4. パスワードを一時的に単純化

 パスワードを、テンポラリに、最小文字数4文字のみに設定するには、「mysql」を起動して

SET GLOBAL validate_password_length = 4;
SET GLOBAL validate_password_policy = LOW;
 このまま、例えば、「root」パスワードを変更するのであれば

SET PASSWORD FOR root@localhost=password('パスワード');
 で、変更します。  このままの状態で、「CREATE USER」なり「ALTER USER」なりで、パスワードを設定・変更もできます。  「validate_password」の値は、サーバを再起動するとご破算になりますが、設定したパスワードは有効なままです。

5. パスワードを恒久的に単純化

 前項の状態を恒久的に設定するには

vi /usr/local/etc/mysql/my.cnf
 で

[mysqld]				←	のセクションに

validate_password_length       = 4
validate_password_policy       = LOW
 と2行加えます。  注意すべきは、この状態で、文法チェックしてみようとすると

> /usr/local/libexec/mysqld --verbose --help > /dev/null
2020-01-16T05:27:49.238768Z 0 [ERROR] unknown variable 'validate_password_length=4'
2020-01-16T05:27:49.262618Z 0 [ERROR] Aborting
 エラーになっちゃうのです。  これは、サーバ自体が起動していない状態でチェックするので、「validate_password」プラグインが読みこまれていないので、エラーと解釈してしまうものと思われます。  実際、サーバを再起動して、チェックしてみると

> service mysql-server restart
Stopping mysql.
Waiting for PIDS: 17473.
Starting mysql.

> mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.28-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW GLOBAL VARIABLES LIKE 'validate%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.01 sec)
 ちゃんと再起動するし、設定値も反映されているのだ。

6. validate_password 無効化


vi /usr/local/etc/mysql/my.cnf
 で

[mysqld]				←	のセクションに

validate_password               = OFF
 を記述すれば、「validate_password」を無効化できます。  アンインストールするより楽ちんですな。  上記の設定の代わりに

default_authentication_plugin   = mysql_native_password			←	NG
 と書くような記事もありましたが、うまく機能できませんでした。  極端な、話をすれば、「validate_password = OFF」を設定していれば

SET PASSWORD FOR root@localhost=password('');
 と、パスワードなしも設定できます。  「update user set authentication_string='' where User='root';」てなコマンドで、「root」パスワードをなしにする記事もありましたが、実行すると

ERROR 1046 (3D000): No database selected
 と怒られちゃいました。  データベースを選択していないと設定できない???  今回調べたのは、このあたりまでですわ(あ~、「FreeBSD 12.1 RELEASE」の頃のまま)。
ハイスピードプラン損保との違い