GA

2018/10/24

MySQL 8.0.13とそれ以降で「パスワード変更の際に今のパスワードを入力させる」オプション

TL;DR

  • ドキュメントの password_require_current だけ読むとちょっと足りなくて、実際にはこんな判定
if (mysqlスキーマへのUPDATE権限 || CREATE USER権限)
  return パスワード確認不要;
else
{
  if (global.password_require_currentがON || そのアカウントが mysql.user.Password_require_current = 'Y' になっている)
    return パスワード確認必要;
  else
    return パスワード確認不要;
}
  • パスワード確認必要な場合、パスワードを変えるようなステートメントの最後に REPLACE '元のパスワード' をつける
    • 対話的に聞かれるわけではない
    • REPLACE をつけないと MySQL error code MY-013226 (ER_MISSING_CURRENT_PASSWORD): Current password needs to be specified in the REPLACE clause in order to change it. と言われる
  • これをよく読むと実はちゃんと書いてある

最初、ずっと root@localhost でやってて全然反映されないな…と思ってたら、 特定の権限がある場合はこれ効かないのであった。一般ユーザーのみ。
mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user     | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | %    | NULL                     |
+----------+------+--------------------------+
1 row in set (0.00 sec)
mysql.user.Password_require_currentの取りうる値はNULL(NULLは値じゃない…けど取り敢えず許して),Y,N` 。
Y は「REPLACE句がないとエラー」、 N は「REPLACE句はあってもなくても良い」(ただし、REPLACE句を書いた上で元のパスワードを間違えるとエラー)、 NULL は「 global.password_require_current の値に従う」。
ユーザー作成時の暗黙のデフォルトは NULL
Y, N, NULL に対応する ALTER USER ステートメントはこんな感じで、こっちの句を見るとそれぞれ要求する、あってもなくてもいい、システム設定に従う、みたいな感じがして良い。
mysql80 28> ALTER USER yoku0825 PASSWORD REQUIRE CURRENT; -- 'Y'にする
Query OK, 0 rows affected (0.04 sec)

mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user     | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | %    | Y                        |
+----------+------+--------------------------+
1 row in set (0.00 sec)

mysql80 28> ALTER USER yoku0825 PASSWORD REQUIRE CURRENT OPTIONAL; -- 'N'にする
Query OK, 0 rows affected (0.03 sec)

mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user     | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | %    | N                        |
+----------+------+--------------------------+
1 row in set (0.00 sec)

mysql80 28> ALTER USER yoku0825 PASSWORD REQUIRE CURRENT DEFAULT; -- NULLにする
Query OK, 0 rows affected (0.07 sec)

mysql80 28> SELECT user, host, password_require_current FROM mysql.user WHERE user = 'yoku0825';
+----------+------+--------------------------+
| user     | host | password_require_current |
+----------+------+--------------------------+
| yoku0825 | %    | NULL                     |
+----------+------+--------------------------+
1 row in set (0.00 sec)
最初のサンプルっぽいところで パスワード確認必要 になる組み合わせで、REPLACE句を指定しないでパスワードを触ろうとするとこうなる。
mysql80 31> SET PASSWORD = 'yoku0825';
ERROR 13226 (HY000): Current password needs to be specified in the REPLACE clause in order to change it.

mysql80 31> SET PASSWORD = 'yoku0825' REPLACE 'old_password';
Query OK, 0 rows affected (0.03 sec)
ただし、権限があるアカウントでも パスワード確認不要 の組み合わせでも、もとのパスワードを間違えるとこうなる。
mysql80 31> SET PASSWORD = 'yoku0826' REPLACE 'wrong_password';
ERROR 13225 (HY000): Incorrect current password. Specify the correct password which has to be replaced.

0 件のコメント :

コメントを投稿