タイトル: ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
SEOタイトル: MySQL ERROR 1819 パスワードポリシー の原因と対処
| この記事の要点 |
|
エラー全文
mysql> ALTER USER 'app'@'localhost' IDENTIFIED BY 'password';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
MySQL に同梱されている validate_password (8.0+ は component_validate_password) プラグインが、指定したパスワードを「要件不足」と判断したときに出ます。CREATE USER / ALTER USER / SET PASSWORD すべてで発生します。
現在のポリシーを確認する
SHOW VARIABLES LIKE 'validate_password%';
-- MySQL 8.0 以降はピリオド付き
SHOW VARIABLES LIKE 'validate_password.%';
-- 主要項目の意味
-- validate_password.policy : 厳しさ LOW/MEDIUM/STRONG (0/1/2)
-- validate_password.length : 最低長 (デフォルト 8)
-- validate_password.mixed_case_count : 大小英字の最低数 (MEDIUM 以上で 1)
-- validate_password.number_count : 数字の最低数 (MEDIUM 以上で 1)
-- validate_password.special_char_count : 特殊文字の最低数 (MEDIUM 以上で 1)
-- validate_password.dictionary_file : 辞書ファイル (STRONG で利用)
ポリシーレベル
| レベル | 値 | 要件 |
|---|---|---|
| LOW | 0 | 長さ のみ (デフォルト 8 文字) |
| MEDIUM (default) | 1 | 長さ + 大小英字 + 数字 + 特殊文字 |
| STRONG | 2 | MEDIUM + 辞書ファイルにある単語を含まない |
対処1: ポリシーを緩和
開発環境などで短いパスワードを使いたい場合:
-- MySQL 8.0+
SET GLOBAL validate_password.policy = LOW;
SET GLOBAL validate_password.length = 4;
-- MySQL 5.7
SET GLOBAL validate_password_policy = LOW;
SET GLOBAL validate_password_length = 4;
-- 設定後にパスワード変更
ALTER USER 'app'@'localhost' IDENTIFIED BY 'abcd';
-- 永続化したい場合は my.cnf に
-- [mysqld]
-- validate_password.policy = LOW
-- validate_password.length = 4
本番では絶対に使わないでください。
対処2: 強いパスワードに変更
MEDIUM のままでも以下のような値なら通ります:
通る例
Pa$$w0rd2024 (大小 + 数字 + 記号 + 12 文字)
Aa1!Aa1!Aa1! (繰り返しでも判定は通る)
Tar0_Suzuki! (英字 + 数字 + 記号)
通らない例
password (短い + 大文字無 + 数字無 + 記号無)
abcdefgh (大文字無 + 数字無 + 記号無)
P@ssword (数字無)
Pa$$word (数字無)
パスワード強度は SQL でも事前に評価できます:
-- 0=弱, 25, 50, 75, 100 のいずれかが返る
SELECT VALIDATE_PASSWORD_STRENGTH('Pa$$w0rd2024');
-- 100 (= 強)
SELECT VALIDATE_PASSWORD_STRENGTH('password');
-- 25 (= 弱)
対処3: 検証プラグインを無効化
どうしても外したい場合 (社内 DB / 検証環境のみ):
-- MySQL 8.0+ (Component 方式)
UNINSTALL COMPONENT 'file://component_validate_password';
-- MySQL 5.7 (Plugin 方式)
UNINSTALL PLUGIN validate_password;
-- 再有効化
INSTALL COMPONENT 'file://component_validate_password';
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
パスワード変更コマンド一覧
-- 8.0+ 推奨構文
ALTER USER 'user'@'localhost' IDENTIFIED BY 'Pa$$w0rd2024';
-- 5.7 でも動く
SET PASSWORD FOR 'user'@'localhost' = 'Pa$$w0rd2024';
-- 自分自身のパスワード
ALTER USER USER() IDENTIFIED BY 'Pa$$w0rd2024';
-- 認証プラグイン指定 (8.0+ デフォルトは caching_sha2_password)
ALTER USER 'user'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'Pa$$w0rd2024';
初回 root パスワード設定でハマるパターン
MySQL を新規インストールした直後の root には一時パスワードが設定されており、最初のログイン時に変更を求められます。このとき validate_password が有効なので、弱い PW を入れるとエラーになります。
# 一時パスワードを取得
sudo grep 'temporary password' /var/log/mysqld.log
# A temporary password is generated for root@localhost: xxxxx
# ログイン後、まず強いパスワードに変更
mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Pa$$w0rd2024';
# その後でポリシーを必要に応じて緩和
mysql> SET GLOBAL validate_password.policy = LOW;
関連エラー
| エラー番号 | 意味 |
|---|---|
| ERROR 1819 (HY000) | 本記事 — パスワード強度不足 |
| ERROR 1820 (HY000) | パスワード変更必須 (期限切れ) |
| ERROR 1133 (42000) | そのユーザー名・ホストが存在しない |
| ERROR 1396 (HY000) | CREATE USER 失敗 (既存ユーザー) |
FAQ
Q: my.cnf に書いて再起動しても反映されない
A: MySQL 8.0 はピリオド形式 validate_password.policy、5.7 はアンダースコア validate_password_policy。バージョンによって書き方が違います。
Q: GRANT 文の中でパスワード設定したい
A: 8.0 では非推奨。CREATE USER ... IDENTIFIED BY ... でユーザー作成 → GRANT ... ON ... TO 'user'@'host' の 2 段階に分けます。
Q: 緩和したのにエラーが続く
A: SET GLOBAL は新規セッションから有効。現在のセッションで再ログインするか、SET SESSION も併用してください。