MySQL道普請便り

第149回MySQLのパスワード再利用ポリシー

MySQLは、バージョン8になってパスワード管理周りにもいくつか機能が追加されています。第90回 デュアルパスワード機能でパスワードを便利に変更する:MySQL道普請便りで紹介した機能もその1つです。今回はMySQL 8.0.3で追加されたパスワード再利用ポリシー機能について説明します。

なお、今回利用するMySQLはバージョン8.0.23、OSはCentOS 7を利用しています。また、default_authentication_plugin = mysql_native_passwordで検証していきます。

パスワード再利用ポリシーとは

パスワード再利用ポリシーでは、以前使用したパスワードをどのように扱うかを決めます。

これまでのMySQLでは、一度使用したアカウントのパスワードは特に制限なく再利用することが可能で、昔からある秘伝のパスワードを使いまわしていた方もいたかもしれません。パスワード再利用ポリシーを設定することで、ユーザーごとのパスワードの変更回数、経過時間によっては同じパスワードは設定できないようにすることが可能となりました。

ただし、デフォルトではこの機能は無効になっているため、データベース管理者が意図して設定しないと制限は入りません。

パスワード再利用ポリシーに関するシステム変数

パスワード再利用ポリシーに関係するシステム変数には、password_historyとpassword_reuse_intervalの2つがあります。

password_history
以前使用したパスワードを再利用するためのパスワードの変更の回数を定義します。たとえば3を設定した場合、パスワード変更前過去3回に使用したパスワードは設定できません。デフォルトは0で、0の場合は特にこの制限を受けません。
password_reuse_interval
以前使用したパスワードを再利用するための経過日数を定義します。たとえばこの変数が7だった場合、同じパスワードは7日間を経過しないと再利用することができません。この変数のデフォルトは0で、0の場合この機能による制限は受けません。

どちらのシステム変数もグローバルスコープなため、機能を利用するためにはmy.cnfに記述して再起動をするか、SET GLOBALやSET PERSIST等で設定する必要があります。

パスワード再利用ポリシーの確認

では実際に設定をして挙動を確認してみましょう。password_history = 2を設定し、ユーザーを作成してパスワードを変更してみます。

mysql> show variables like 'password_history';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| password_history | 2     |
+------------------+-------+
1 row in set (0.01 sec)

mysql> CREATE USER [email protected] identified by 'fukamachi';
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER USER [email protected] identified by 'fukamachi1';
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER USER [email protected] identified by 'fukamachi';
ERROR 3638 (HY000): Cannot use these credentials for '[email protected]' because they contradict the password history policy

mysql> ALTER USER [email protected] identified by 'fukamachi2';
Query OK, 0 rows affected (0.00 sec)

1度目のパスワード変更は成功しましたが、2度目のパスワード変更はパスワード再利用ポリシーにより失敗しました。3度目は1度目、2度目とは違うパスワードのため成功しています。このように、過去に利用したパスワードを保持し、再度利用できないようになっています。

過去利用したパスワードは、mysql.password_historyテーブルにハッシュ化した状態で保持されています。

mysql> SELECT * FROM mysql.password_history;
+-----------+-----------+----------------------------+-------------------------------------------+
| Host      | User      | Password_timestamp         | Password                                  |
+-----------+-----------+----------------------------+-------------------------------------------+
| 127.0.0.1 | fukamachi | 2021-06-15 20:08:38.114929 | *E3067DD12CA4F1198945F72A7A52671CFC7F0E0E |
| 127.0.0.1 | fukamachi | 2021-06-15 20:08:00.799362 | *2B50AA916A466CAC017C572C0205956FAAA36E06 |
| 127.0.0.1 | fukamachi | 2021-06-15 20:06:53.220987 | *91A495E3466B14CDBE3F92EB41CB2F1C70D5008E |
+-----------+-----------+----------------------------+-------------------------------------------+

password_historyテーブル

過去に利用したハッシュ化されたパスワードはpassword_historyに保持されているという話でしたが、ユーザーがDROPされるとpassword_historyも一緒に削除されます。

mysql> DROP USER [email protected];
Query OK, 0 rows affected (10.02 sec)

mysql> SELECT * FROM mysql.password_history;
Empty set (0.00 sec)

ユーザーを削除して先ほどのテーブルを確認すると、たしかに削除されていることが確認できます。つまり、変更ではなくユーザーの作り直しには有効ではなさそうです。

また、password_historyは権限さえあれば直接削除することも可能です。もちろん、削除した場合はパスワード再利用ポリシーに制限されないので、注意が必要です。

mysql>  ALTER USER [email protected] identified by 'fukamachi';
ERROR 3638 (HY000): Cannot use these credentials for '[email protected]' because they contradict the password history policy

mysql> DELETE FROM mysql.password_history WHERE User='fukamachi' AND Host='127.0.0.1';
Query OK, 1 row affected (0.00 sec)

mysql> ALTER USER [email protected] identified by 'fukamachi';
Query OK, 0 rows affected (0.01 sec)

アカウント個別にパスワード再利用ポリシーを設定する

システム変数で設定した場合、以降すべての変更に対して同じ設定が適用されますが、CREATE USER、ALTER USERと組み合わせることで、アカウント個別に設定することが可能です。

mysql> ALTER USER [email protected] PASSWORD HISTORY 5 PASSWORD REUSE INTERVAL 365 DAY;
Query OK, 0 rows affected (0.01 sec)

各ユーザーの設定は、mysql.userのpassword_reuse_historyとpassword_reuse_timeで確認することができます。もし、個別に設定している場合は、こちらのテーブルから参照する必要があります。

mysql> SELECT user, host, password_reuse_history, password_reuse_time FROM mysql.user WHERE user = 'hidemifukamachi';
+-----------------+-----------+------------------------+---------------------+
| user            | host      | password_reuse_history | password_reuse_time |
+-----------------+-----------+------------------------+---------------------+
| hidemifukamachi | 127.0.0.1 |                      5 |                 365 |
+-----------------+-----------+------------------------+---------------------+`

まとめ

今回はパスワード再利用ポリシーについて説明しました。同じパスワードを使い回す危険を防ぐにはよい機能です。必要があれば、適切に設定して利用してみてください。

おすすめ記事

記事・ニュース一覧