MySQL道普請便り

第228回MySQLのvalidate_passwordコンポーネントでパスワードセキュリティを強化しよう

MySQL 5.6で導入された「validate_passwordプラグイン」は、MySQL 8.0以降で「validate_passwordコンポーネント」として再実装されました。今回は、この「validate_passwordコンポーネント」について説明します。なお、今回検証しているMySQLのバージョンは8.4です。

validate_passwordコンポーネント

validate_passwordコンポーネントは、MySQLのユーザーアカウントのパスワードを検証し、セキュリティポリシーに合致したものだけが設定されるようにするための機能です。このコンポーネントを利用することで、弱いパスワードの使用を防ぎ、データベースのセキュリティを高めることができます。

デフォルトではインストールされていないため、利用する際にはコンポーネントのインストールが必要です。設定後は、3段階のポリシーに基づいてパスワードの検証が行われます。ただし、検証が行われるのはパスワードを平文で設定する場合のみです。ハッシュ値を使ってパスワードを設定する場合には、この検証は適用されません。

インストール方法

validate_passwordコンポーネントをインストールするには、INSTALL COMPONENT 構文でfile://component_validate_passwordを指定します。インストールが完了すると、mysql.componentテーブルで確認することができます。

mysql>  INSTALL COMPONENT 'file://component_validate_password';

mysql> > SELECT * FROM mysql.component ORDER BY 1 DESC LIMIT 1;
+--------------+--------------------+------------------------------------+
| component_id | component_group_id | component_urn                      |
+--------------+--------------------+------------------------------------+
|           16 |                 16 | file://component_validate_password |
+--------------+--------------------+------------------------------------+
1 row in set (0.03 sec)

コンポーネントが不要になった場合は、UNINSTALL COMPONENT 'file://component_validate_password';を実行することで削除することができます。

関連する変数

コンポーネントのインストールが完了すると、SHOW VARIABLES構文を使用してvalidate_passwordに関連する変数を確認することができます。ここでは、関連する変数について確認していきましょう。

> SHOW VARIABLES LIKE 'validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 0      |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+
8 rows in set (0.02 sec)
policy
この変数は、LOW/MEDIUM/STRONGの3段階のポリシーを設定するための変数です。各設定の内容は以下の通りです。
  • LOW:少なくとも8文字以上の長さのパスワードが要求されます。
  • MEDIUM:LOWの条件に加え、1つの数字、1つの小文字、1つの大文字、1つの特殊文字を含むことが要求されます。
  • STRONG:MEDIUMの条件に加え、4文字以上の部分文字列が辞書ファイル内の単語と一致してはならないという条件が加わります。
デフォルトではMEDIUMが設定されています。
check_user_name
ユーザー名と同じパスワードを設定できなくします(いわゆる「Joe Account」の禁止⁠⁠。
changed_characters_percentage
変更前のパスワードと比較して、変更後の文字列の変更割合を0~100%で設定します。ただし、この機能はALTER USER ~ REPLACE コマンドでパスワードを変更する場合にのみ有効です。この変数はバージョン8.0.34から追加されています。
length
設定されるパスワードの最小文字数を指定します。
mixed_case_count
ポリシーがMEDIUM以上の場合、パスワードに含める必要がある小文字と大文字の最小回数を指定します。
number_count
ポリシーがMEDIUM以上の場合、パスワードに含める必要がある数字の最小回数を指定します。
special_char_count
ポリシーがMEDIUM以上の場合、パスワードに含める必要がある特殊文字の最小回数を指定します。
dictionary_file
ポリシーがSTRONGの場合、パスワードの一部が辞書内の単語と一致しないようにするために使用する辞書ファイルを指定します。

検証

では、実際に強度の弱いパスワードを設定しようとした場合に発生するエラーを確認していきましょう。設定は以下の通りです。

> SHOW VARIABLES LIKE 'validate_password%';
+-------------------------------------------------+--------+
| Variable_name                                   | Value  |
+-------------------------------------------------+--------+
| validate_password.changed_characters_percentage | 50     |
| validate_password.check_user_name               | ON     |
| validate_password.dictionary_file               |        |
| validate_password.length                        | 8      |
| validate_password.mixed_case_count              | 1      |
| validate_password.number_count                  | 1      |
| validate_password.policy                        | MEDIUM |
| validate_password.special_char_count            | 1      |
+-------------------------------------------------+--------+
lengthに満たないパスワードを設定しようとした場合
mysql> ALTER USER 'fukamachi'@'localhost' IDENTIFIED BY 'TestP1$';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
すべて小文字の場合
mysql> ALTER USER 'fukamachi'@'localhost' IDENTIFIED BY 'testpass';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
パスワードを1文字だけ変更しようとした場合
mysql> ALTER USER fukamachi@localhost IDENTIFIED BY 'Fukamachi%124' REPLACE 'Fukamachi%123';
ERROR 4165 (HY000): The new password must have at least '6' characters that are different from the old password. It has only '1' character(s) different. For this comparison, uppercase letters and lowercase letters are considered to be equal.
policyを満たすパスワードを設定した場合
mysql> ALTER USER 'fukamachi'@'localhost' IDENTIFIED BY 'TestP1$$';
Query OK, 0 rows affected (0.01 sec)

validate_password コンポーネントにより、ポリシーを満たさない弱いパスワードは設定できないことが確認できました。

VALIDATE_PASSWORD_STRENGTH()関数

validate_passwordコンポーネントをインストールすると、VALIDATE_PASSWORD_STRENGTH()関数が利用できるようになります。この関数は、引数にパスワードとして設定予定の文字列を渡すことで、そのパスワードの強度を検証し、0から100の間で評価した戻り値を返します。この値により、どのポリシーを満たしているかを確認することができます。

戻り値 意味
0 文字列の長さが4文字以内の場合
25 validate_password.lengthを満たしていない
50 LOWを満たす
75 MEDIUMを満たす
100 STRONGを満たす
mysql> SELECT VALIDATE_PASSWORD_STRENGTH("Test1234"),VALIDATE_PASSWORD_STRENGTH("Fukamachi$123");
+----------------------------------------+---------------------------------------------+
| VALIDATE_PASSWORD_STRENGTH("Test1234") | VALIDATE_PASSWORD_STRENGTH("Fukamachi$123") |
+----------------------------------------+---------------------------------------------+
|                                     50 |                                         100 |
+----------------------------------------+---------------------------------------------+
1 row in set (0.00 sec)

まとめ

今回は、validate_password コンポーネントについて簡単に紹介しました。これまでに存在したvalidate_passwordプラグインは現在では非推奨となっており、引き続き同様の機能を利用するためには、validate_passwordコンポーネントへの移行が必要です。移行方法については公式ドキュメントに詳しく記載されているので、そちらをご確認ください。

validate_passwordコンポーネントは、適切に設定し活用することで、データベースの安全性を大幅に向上させることができます。この記事で紹介した設定手順を参考に、ぜひご自身の環境で試してみてください。

おすすめ記事

記事・ニュース一覧