もしかして気づかれていないかも知れないMySQLのパスワード関連の機能
validate_passwordプラグイン
MySQL 5.6で登場し、MySQL 5.7.8からはYumまたはSLESレポジトリからのインストール、もしくはrpmパッケージでインストールした場合に有効になっているのがvalidate_passwordプラグインです。validate_passwordプラグインはパスワード強度の検証を行うプラグインです。「初心者殺しの罠」だの「クソ機能→速攻削除」だの言われちゃうかわいそうなかわいそうな機能だったりします。tarで入れればデフォルトでは無効なのでrpmじゃなくてtarで入れよう。
機能と設定の概要はMySQL 5.6の日本語リファレンスマニュアルを参考にしてみて下さい。
validate_passwordプラグインでは以下の項目を検証します。
https://dev.mysql.com/doc/refman/8.0/en/validate-password-options-variables.html
validate_password_check_user_name | パスワードとユーザ名を比較 |
validate_password_dictionary_file | 禁止されたパスワードのリストを格納した辞書ファイル名 |
validate_password_length | 最低文字数 |
validate_password_mixed_case_count | 大文字と小文字を含めることを強制 |
validate_password_number_count | 数字の数 |
validate_password_special_char_count | 特殊文字の数 |
validate_password_policy | ポリシーの強度 |
validate_password_check_user_nameはMySQL 5.7.15 (= GA後) にて追加されたオプションです。このパラメタを ON に設定すると、パスワードの設定や変更の際にユーザー名、もしくは逆になっていないかの検証が行われます。ここでのユーザー名は USER()およびCURRENT_USER()のユーザー名部分です(ホスト名は検証に利用されない)。またバイト列でのユーザー名との比較となります。
パスワード再利用ポリシー
以前使ったパスワードを再利用させない面倒くさいポリシーを設定できる機能がMySQL 8.0.3 RCで追加されました。また「速攻削除」とか言われちゃうのかな。。。とりあえずデフォルトではオフになっているので安心して下さい。
https://dev.mysql.com/doc/refman/8.0/en/password-management.html#password-reuse-policy
設定項目は下記の2つです。
password_history | 何世代のパスワードを利用不可とするか |
password_reuse_interval | 同じパスワードはどれだけ経たないと再利用できないか |
このパラメータはサーバー全体の設定値となります。MySQL 8.0の新機能 SET PERSIST 文 でも設定できます。
CREATE USER文やALTER USER文でユーザーごとに設定することもできます。
mysql> CREATE USER 'yoku0825'@'localhost' PASSWORD HISTORY 825; mysql> ALTER USER 'soudai1025'@'localhost' PASSWORD REUSE INTERVAL 1025 DAY;
いい感じの設定ができますね。
変更したパスワードは新たに追加されたpassword_historyテーブルに格納されていきます。
mysql> DESC password_history; +--------------------+--------------+------+-----+----------------------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------------+--------------+------+-----+----------------------+-------+ | Host | char(60) | NO | PRI | | | | User | char(32) | NO | PRI | | | | Password_timestamp | timestamp(6) | NO | PRI | CURRENT_TIMESTAMP(6) | | | Password | text | YES | | NULL | | +--------------------+--------------+------+-----+----------------------+-------+ 4 rows in set (0.00 sec)
例えばパスワードを変更し、確認してみると下記のような状態となります。(パスワードの文字列はダミーです。たぶん)
mysql> ALTER USER 'yoku0825'@'localhost' IDENTIFIED BY 'ConoHa'; mysql> ALTER USER 'yoku0825'@'localhost' IDENTIFIED BY 'Anzu'; mysql> SELECT * FROM password_history; +-----------+----------+----------------------------+-------------------------------------------+ | Host | User | Password_timestamp | Password | +-----------+----------+----------------------------+-------------------------------------------+ | localhost | yoku0825 | 2017-12-06 00:02:22.120225 | *01234567890123456789A1FB252ADCCED23DHOGE | | localhost | yoku0825 | 2017-12-06 00:01:45.514278 | *9876543210987654321006CDBDBBE5538249FUGA | +-----------+----------+----------------------------+-------------------------------------------+
ちなみにMySQL 5.7.9 GAで話題となり、MySQL 5.7.11でデフォルト値が360日から0 (= 無制限) に変更された default_password_lifetime はMySQL 8.0.3 RCの時点でのデフォルト値は0となっています。
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_password_lifetime
GAでどうなるかは誰も知りません。
MySQL Fabric? 知らない子ですねぇ とりあえず可用性関連の製品が単一障害点を持ってたり、開発エンジニアが単一障害点とか悪い冗談ですよね。