お名前.com VPS(KVM)に新サイトを展開していて、MySQLで作ったユーザがログインできない状態が発生した。
MySQLはデフォルトリポジトリから導入して、設定ファイルは特別な記述をせず展開。
CREATE USER文でユーザを作って、パスワードも設定。
これでできあがったユーザでログインしようとすると失敗する。 Host値を書き換えてみたりするがダメ。
何だろうな-、と思って、mysql.userテーブルを眺めてみると、既存ユーザのpasswordは16桁で、新しいユーザは41桁だった。
16桁って言うのはMySQL4.1以前のハッシュ値で、4.1からは標準が41桁になっている(先頭に、旧ハッシュと新ハッシュを識別するための*記号が付与されていて、実際は40桁)
mysql cliでSELECT PASSWORD(‘hoge’);してみると、41桁が帰ってくる。 でも、41桁ハッシュのアカウントは全てアクセス不能で16桁の物だけアクセスできる。
試しにmy.cnfのmysqldセクションで、old_passwords=0を明示的に指定してrestartしてみると、41桁ハッシュのアカウントでログイン可能&16桁ハッシュのアカウントでもログイン可能となった。
試しにold_passwords=1を明示的に指定すると・・・41桁ハッシュでも16桁ハッシュでもログイン可能であった。
・・・あれ?
old_passwordsを明示的に指定してやらない場合、16桁ハッシュのアカウントしか認証できず、0でも1でも指定してやればどちらでも認証できる。 と言う、変な結果(不定値の条件バグだね)
じゃあ、old_passwords値は無視されているのかというとそんなこともなく、
・0の場合はPASSWORD関数が生成するハッシュが41桁になる
・1の場合はPASSWORD関数が生成するハッシュが16桁になる
と言う動きをしていた。
作成したユーザで認証できない場合、設定ファイルのold_passwords値をチェックしてみると良いと言うメモ。
(1158)