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
を設定し、ユーザーを作成してパスワードを変更してみます。
1度目のパスワード変更は成功しましたが、2度目のパスワード変更はパスワード再利用ポリシーにより失敗しました。3度目は1度目、2度目とは違うパスワードのため成功しています。このように、過去に利用したパスワードを保持し、再度利用できないようになっています。
過去利用したパスワードは、mysql.password_historyテーブルにハッシュ化した状態で保持されています。
password_historyテーブル
過去に利用したハッシュ化されたパスワードはpassword_historyに保持されているという話でしたが、ユーザーがDROPされるとpassword_historyも一緒に削除されます。
ユーザーを削除して先ほどのテーブルを確認すると、たしかに削除されていることが確認できます。つまり、変更ではなくユーザーの作り直しには有効ではなさそうです。
また、password_historyは権限さえあれば直接削除することも可能です。もちろん、削除した場合はパスワード再利用ポリシーに制限されないので、注意が必要です。
アカウント個別にパスワード再利用ポリシーを設定する
システム変数で設定した場合、以降すべての変更に対して同じ設定が適用されますが、CREATE USER、ALTER USERと組み合わせることで、アカウント個別に設定することが可能です。
各ユーザーの設定は、mysql.userのpassword_reuse_historyとpassword_reuse_timeで確認することができます。もし、個別に設定している場合は、こちらのテーブルから参照する必要があります。
まとめ
今回はパスワード再利用ポリシーについて説明しました。同じパスワードを使い回す危険を防ぐにはよい機能です。必要があれば、適切に設定して利用してみてください。