この記事は Qiita Tech Festa 2026 の投稿記事です。
はじめに
先日、Qiita Tech Festa の PostgreSQL カテゴリで以下の記事を見ました。
Claude Codeを使ってPostgreSQLにパスワードポリシーを追加する拡張機能を作った話
PostgreSQL には標準で passwordcheck という拡張機能がありますが、ポリシーがハードコードされているため、この記事では postgresql.conf から動的に設定を変えられる拡張機能(C言語)を Claude Code を使って自作されていました。
この記事を読んで、「 MySQLの場合はどうやってパスワードポリシーを設定するのか? 」と思ったので改めて調べてみることにしました。
本記事は、MySQLの最新LTSバージョン(8.4)環境で、同じ要件(8文字以上、大文字・小文字・数字・記号必須)のパスワードポリシーを強制の確認をした記録です。
MySQL の対応方法: validate_password コンポーネント
MySQLで同様のセキュリティ要件を適用したい場合は、 validate_password というコンポーネント を活用することで柔軟な設定が可能です。
実は、先述の PostgreSQL 記事で実装されていた「8文字以上、大文字・小文字・数字・記号必須」というポリシーは、 MySQLの validate_password のデフォルト設定(ポリシーレベル:MEDIUM)と同じ要件 なのです。
今回はこのコンポーネントを有効化し、動的(SQL)および永続的(設定ファイル)にポリシーを設定する方法を試します。
確認環境
- Docker
- DockerHub MySQL 8.4イメージ
環境準備
まずは手元で試せるように、DockerでMySQL 8.4(2026年6月時点最新LTS)コンテナを起動します。
# 任意のパスワードを環境変数に設定します
export MYSQL_ROOT_PASSWORD='<任意の強いパスワード>'
docker run --name mysql-policy-test \
-e MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} \
-d mysql:8.4
起動したら、コンテナ内のMySQLにログインします。
docker exec -it mysql-policy-test mysql -u root -p
(パスワードは先ほど環境変数に設定したものを入力します)
validate_password コンポーネントの有効化
MySQL 8.4では標準でこの機能は有効化されていないため、まずはSQLで有効化します。
INSTALL COMPONENT 'file://component_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 |
+-------------------------------------------------+--------+
ポリシーが MEDIUM の場合は以下がデフォルトで設定されています。
| 属性 | 値 |
|---|---|
長さ(length) |
8 文字以上 |
大文字小文字(mixed_case_count) |
1 文字以上 |
数字(number_count) |
1 文字以上 |
記号(special_char_count) |
1 文字以上 |
前回パスワードの再利用不可率(changed_characters_percentage) |
0 % ※全文字利用可能 |
使用禁止辞書ファイルパス(validate_password.dictionary_file) |
なし |
validate_password コンポーネントの詳細 (公式ドキュメント)
詳細な仕様や設定項目については、以下の MySQL 公式ドキュメントをご参照ください。
アプローチA:SQL (SET GLOBAL) を使った動的な設定
稼働中のシステムに対して、再起動なしでポリシーを変更したい場合は SET GLOBAL を使用します。以下の例では最低文字数を12文字以上に変更してみます。
SET GLOBAL validate_password.length = 12;
アプローチB:設定ファイル (my.cnf) を使った永続的な設定
コンテナ再起動後も設定を維持したい場合は、設定ファイルを使用します。
一度 INSTALL COMPONENT を実行すれば、MySQLは内部の mysql.component テーブルにその状態を記憶するため、以降は my.cnf に設定値だけを記述しておけばOKです。
Docker環境の場合、ホスト側に my.cnf を用意し、コンテナ起動時にマウントするのが一般的です。
まず、手元のディレクトリに以下のファイルを作成します。
[mysqld]
validate_password.policy=MEDIUM
validate_password.length=8
validate_password.mixed_case_count=1
validate_password.number_count=1
validate_password.special_char_count=1
ハンズオンの環境(一時的なDockerコンテナ)でこれを試す場合、コンテナを作り直してマウントしようとすると INSTALL COMPONENT の実行状態(データ領域)も消えています。今回は手軽に試すため、稼働中のコンテナにファイルをコピーして再起動する手順で進めます。
# ホスト側で作成した my.cnf を稼働中のコンテナの設定ディレクトリにコピー
docker cp my.cnf mysql-policy-test:/etc/mysql/conf.d/
# コンテナを再起動して設定を適用
docker restart mysql-policy-test
※ ローカルのテスト環境を(Docker Composeなど)で構築する場合は、データベースのデータ領域(/var/lib/mysql)をVolumeとして永続化しておき、稼働後に一度だけSQLで INSTALL COMPONENT を実行する運用になります。
実証:ポリシー対象外のパスワードを設定しようとしたらどうなるのか?
それでは、実際にいくつかのパスワードを試して、ルールが正しく強制されているか確認します
※ validate_password.length は 8 の状態を前提にします
NG例:短すぎるパスワード(7文字)
CREATE USER 'alice'@'%' IDENTIFIED BY 'Abc!123';
実行結果:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
NG例:大文字を含まないパスワード
CREATE USER 'alice'@'%' IDENTIFIED BY 'abcd!1234';
実行結果:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
OK例:全条件をクリア(8文字以上、大文字・小文字・数字・記号あり)
CREATE USER 'bob'@'%' IDENTIFIED BY 'Str0ng!Pass';
実行結果:
Query OK, 0 rows affected (0.01 sec)
見事にポリシーが適用されました!
補足:RDS & Cloud SQLでの対応状況
本記事では手元のDocker環境で検証しましたが、サービス提供環境でよく使われるマネージドデータベースでの対応状況は以下のようになっています。クラウド環境を利用する場合は、これらマネージドサービスごとの仕様に合わせて設定を行ってください。
AWS RDS for MySQL の場合
RDSでも validate_password 機能は利用可能です。
ただし、設定ファイル(my.cnf)を直接編集することはできないため、AWSコンソールの「DBパラメータグループ」から validate_password.length などのパラメータを設定して適用する形になります。
詳細は公式ドキュメント(RDS for MySQL に対するパスワードの検証 - AWS)をご参照ください。
Google Cloud SQL(MySQL) の場合
Google Cloud SQL(MySQL) で validate_password はサポート外
Cloud SQLでは代わりにGoogle Cloud独自機能の「 パスワードポリシー機能 」が使われています。Google Cloudコンソールの「ユーザー」画面や gcloud コマンドから、GUIベースで最小文字数や複雑性を設定できるようになっています。
詳細は公式ドキュメント(Cloud SQL の組み込みデータベース認証 - Google Cloud)のパスワードポリシーの項目をご参照ください。
おわりに
PostgreSQL の記事をきっかけに、「MySQLならどうなる?」という視点で最新LTS環境の validate_password コンポーネントを試してみました。
同種のミドルウェアでも同じセキュリティ要件を満たすために異なるアプローチが取られていることが分かり、セキュリティ対応時の運用対応範囲の差分など製品選定時に考えることがあるのだなと改めて思いました。