1. 導入
データベースのセキュリティを維持する上で、ユーザーに「定期的なパスワード変更」を義務付けることは一般的です。しかし、ユーザーが利便性を優先して「過去に使用したパスワード」を繰り返し設定してしまうことは、セキュリティ上の大きなリスクとなります。本記事では、MySQLの標準機能であるパスワード履歴管理を活用し、パスワードの再利用をシステム的に防止する方法を解説します。これにより、アカウント乗っ取りや不正アクセスのリスクを大幅に低減できます。
2. 基礎知識
MySQLには、パスワードの安全性を高めるための「パスワード管理ポリシー」機能が備わっています。大きく分けて、以下の2つのアプローチで再利用を制限できます。
・PASSWORD HISTORY: 直近何回分のパスワードを記憶し、再利用を禁止するかを指定します。
・PASSWORD REUSE INTERVAL: 直近何日間で使用したパスワードの再利用を禁止するかを指定します。
これらは、ユーザー作成時(CREATE USER)または既存ユーザーの変更時(ALTER USER)に設定可能です。
3. 実装/解決策
実務においては、セキュリティ要件に合わせてこれらを組み合わせて運用します。例えば、「直近3回分」または「過去90日間」のパスワード利用を禁止する設定が一般的です。以下に具体的な構文を示します。
・既存ユーザーへの適用:
ALTER USER ‘user’@’localhost’ PASSWORD HISTORY 3;
ALTER USER ‘user’@’localhost’ PASSWORD REUSE INTERVAL 90 DAY;
4. サンプルプログラム
以下のSQLコードは、ユーザー作成から再利用制限の動作確認までを行う一連の流れです。開発環境等で動作を確認してみてください。
-- 1. 過去3回分のパスワード再利用を禁止するユーザーを作成 CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'Password_001' PASSWORD HISTORY 3; -- 2. パスワードを順に変更(これらは履歴に保存される) ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'Password_002'; ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'Password_003'; -- 3. 現在のパスワードと同じ 'Password_003' に変更しようとする(エラーになるはず) -- エラー: Cannot use these credentials ... contradict the password history policy ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'Password_003'; -- 4. 過去に遡って、直近3回以内のパスワード 'Password_002' に変更しようとする(エラーになる) ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'Password_002'; -- 5. 全く新しいパスワードなら変更可能 ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'Password_999';
5. 応用・注意点
・グローバル設定との併用:
個別のユーザー設定ではなく、サーバー全体でデフォルト値を適用したい場合は、MySQLのコンフィグファイル(my.cnf / my.ini)で設定を行います。
(例: password_history=3)
運用が複雑化しないよう、特別な要件がない限りはグローバル設定での統一をお勧めします。
・運用上の注意:
あまりに厳格な制限(履歴回数が多すぎる、または期間が長すぎる)を課すと、ユーザーがパスワードを忘れてしまい、結果としてパスワードリセットの依頼が運用担当者に殺到する原因となります。組織のセキュリティポリシーと、ユーザーの利便性のバランスを考慮した設定値(目安として履歴3〜5回程度)を選択してください。
・エラーハンドリング:
アプリケーション側からSQLを実行してパスワード変更を行う場合、このポリシーによるエラー(エラーコード: 3638等)が発生する可能性があります。フロントエンドで「過去に使用したパスワードは使えません」といった分かりやすいメッセージを表示する実装を併せて検討してください。

コメント