【MySQL】パスワードを変更すると認証できない?
問題
MySQLでパスワードのハッシュが短いのと長いのが混在している。
既存ユーザーのハッシュを短いのから長いのに変更したら、接続できなくなった。
なんで?
答え
ハッシュの長さを変える = 認証方式が変わる変更は、GRANT USAGE ~ IDENTIFIED BY ~
で上書きするだけだとダメらしい。
SET PASSWORD
を使うのが正攻法の様子。
MySQL5.7で発生。
SET PASSWORD 方式
・環境を確認
長いハッシュにしたいときに old_passwords がONのサーバは先に SET old_passwords = 0; する。
逆にoldパスワードに変更したいはold_passwords = 1; する。
mysql> show variables like 'old_%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| old_alter_table | OFF |
| old_passwords | OFF |
+-----------------+-------+
2 rows in set (0.02 sec)
mysql> SET PASSWORD FOR 'xxx'@'localhost' = PASSWORD('パスワード');
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'xxx'@'localhost';
+------------------------------------------------------------------------------------------------------------+
| Grants for xxx@localhost |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON . TO 'xxx'@'localhost' IDENTIFIED BY PASSWORD '*ネイティブハッシュパスワード' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
ダメな例 GRANT USAGE で上書きはダメ
mysql> show grants for 'xxx'@'localhost';
+-----------------------------------------------------------------------------------+
| Grants for xxx@localhost |
+-----------------------------------------------------------------------------------+
| GRANT USAGE ON . TO 'xxx'@'localhost' IDENTIFIED BY PASSWORD '古いハッシュ' |
+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> GRANT USAGE ON . TO 'xxx'@'localhost' IDENTIFIED BY 'パスワード';
Query OK, 0 rows affected (0.09 sec)
mysql> show grants for 'xxx'@'localhost';
+------------------------------------------------------------------------------------------------------------+
| Grants for xxx@localhost |
+------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON . TO 'xxx'@'localhost' IDENTIFIED BY PASSWORD '*ネイティブハッシュパスワード' |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
これだけで終わると、接続できない!
$ mysql -u xxx -p Enter password: ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES)
なお、GRANT USAGE ~ IDENTIFIED BY ~
してしまった場合は、直後は認証できない状態になるが、flushすると正常化する。
mysql> flush privileges;
コメント