Hatena::ブログ(Diary)

rkajiyamaの日記 このページをアンテナに追加

2017-12-05

もしかして気づかれていないかも知れないMySQLのパスワード関連の機能

| もしかして気づかれていないかも知れない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? 知らない子ですねぇ とりあえず可用性関連の製品が単一障害点を持ってたり、開発エンジニアが単一障害点とか悪い冗談ですよね。