MySQL道普請便り

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

この記事を読むのに必要な時間:およそ 3 分

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 fukamachi@127.0.0.1 identified by 'fukamachi';
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER USER fukamachi@127.0.0.1 identified by 'fukamachi1';
Query OK, 0 rows affected (0.00 sec)

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

mysql> ALTER USER fukamachi@127.0.0.1 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 fukamachi@127.0.0.1;
Query OK, 0 rows affected (10.02 sec)

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

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

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

mysql>  ALTER USER fukamachi@127.0.0.1 identified by 'fukamachi';
ERROR 3638 (HY000): Cannot use these credentials for 'fukamachi@127.0.0.1' 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 fukamachi@127.0.0.1 identified by 'fukamachi';
Query OK, 0 rows affected (0.01 sec)

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

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

mysql> ALTER USER hidemifukamachi@127.0.0.1 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 |
+-----------------+-----------+------------------------+---------------------+`

まとめ

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

著者プロフィール

深町日出海(ふかまちひでみ)

GMOメディア株式会社のデータベースエンジニア。主にOracleとMySQLを担当。得意なプログラム言語はJava。MySQLの好きなところはTABLEやINDEXの識別子に64byteまで使えるところ。

Twitter:@lhfukamachi