SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 採用情報 ...
技術者募集中

【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;

関連するメモ

コメント