2020年3月19日木曜日

MySQL 8.0のデュアルパスワードを使った記念メモ

TL;DR

  • デュアルパスワードの情報は mysql.user.User_attributes カラムにJSONで入ってくるのでその辺で確認できる
    • SHOW CREATE USER には入ってこないのでここで確認するしかない?
  • SELECTステートメントでデュアルパスワード持ってるアカウントだけを引っ張るなら mysql.user.user_attributesadditional_password って要素を持ってるかどうかで判定ができる
mysql80 7> SELECT user, host FROM mysql.user WHERE user_attributes->>'$.additional_password' IS NOT NULL;
+----------+------+
| user     | host |
+----------+------+
| yoku0825 | %    |
+----------+------+
1 row in set (0.00 sec)

「セカンダリーパスワード」とかそんな名前かと思ったら、「デュアルパスワード」が公式用語っぽいのも今回初めて気が付いた。
やり方そのものは日本語でも記事が存在するしドキュメントもある。
試しにやってみるだけなら、 IDENTIFIED WITH mysql_native_password BY '..' でmysql_native_passwordプラグインを使った方が出力が化けなくて良いかも ( print_identified_with_as_hexSELECT で直接のぞき込む時には使えないから)
mysql80 82> CREATE USER yoku0825 IDENTIFIED BY 'yoku0826';
Query OK, 0 rows affected (0.01 sec)

mysql80 82> SHOW CREATE USER yoku0825;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for yoku0825@%                                                                                                                                                                                                                                                                   |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER 'yoku0825'@'%' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$]f|)Pd<I#(i
                                                                                                ij[HzpqNoMwkaEO.dS2orkm5nQ/2Mgulxlh.8aumbjfYa8' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql80 82> ALTER USER yoku0825 IDENTIFIED BY 'yoku0827' RETAIN CURRENT PASSWORD;
Query OK, 0 rows affected (0.00 sec)

mysql80 82> SHOW CREATE USER yoku0825;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for yoku0825@%                                                                                                                                                                                                                                                                      |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER 'yoku0825'@'%' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$V=]bHk2\r~l8f\"\ZpB]DoKqTjmFtEz20yaFYDbvkXx0kOOCmGzuhCByA5lXPi5' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
SHOW CREATE USER には以前のパスワードっぽいものは見えない。デュアルパスワードになってるのかどうかも見えない。
mysql.user あたりを眺めていたら user_attributes というカラムに突っ込んでいるっぽかった(caching_sha2_passwordプラグインだと authentication_string カラムはやっぱり潰れちゃうねえ…)
mysql80 82> SELECT user, host, authentication_string, user_attributes FROM mysql.user WHERE user = 'yoku0825'\G
*************************** 1. row ***************************
                 user: yoku0825
                 host: %
~l8f"pB]DoKqTjmFtEz20yaFYDbvkXx0kOOCmGzuhCByA5lXPi5
      user_attributes: {"additional_password": "$A$005$]\u000ff|)Pd<\u0017I#(i\u0006 \t\u000bij[HzpqNoMwkaEO.dS2orkm5nQ/2Mgulxlh.8aumbjfYa8"}
1 row in set (0.00 sec)

mysql80 82> ALTER USER yoku0825 DISCARD OLD PASSWORD;
Query OK, 0 rows affected (0.02 sec)

mysql80 82> SELECT user, host, authentication_string, user_attributes FROM mysql.user WHERE user = 'yoku0825'\G
*************************** 1. row ***************************
                 user: yoku0825
                 host: %
~l8f"pB]DoKqTjmFtEz20yaFYDbvkXx0kOOCmGzuhCByA5lXPi5
      user_attributes: NULL
1 row in set (0.00 sec)
user_attributesの構造体は このへん で、更新してるのは このへん 、使ってるフラグを管理してるのは このへん なので、8.0.19現在ではデュアルパスワードと ログインの失敗回数制御partial_revokes で使っているっぽい。
mysql80 7> SELECT user, host, authentication_string, user_attributes FROM mysql.user WHERE user = 'yoku0825'\G
*************************** 1. row ***************************
                 user: yoku0825
                 host: %
authentication_string: $A$005$LMJP\MS%cmy/Gv NIMCTPSdqYBmL2txa9mWq7ki0jYncHsWW99iyXk8CyD
      user_attributes: {"Restrictions": [{"Database": "mysql", "Privileges": ["SELECT"]}], "Password_locking": {"failed_login_attempts": 4, "password_lock_time_days": -1}, "additional_password": "$A$005$>PuHNir\n\t&\b\u0004B/Kf\u000b\u000e\u0010\u000bYZEIELtEpe7xFBDXqiQhC6EFNSOy.DQy.11P5iFl4v4"}
1 row in set (0.00 sec)
SELECTステートメントでデュアルパスワード持ってるアカウントだけを引っ張るならこうかな。
mysql80 7> SELECT user, host FROM mysql.user WHERE user_attributes->>'$.additional_password' IS NOT NULL;
+----------+------+
| user     | host |
+----------+------+
| yoku0825 | %    |
+----------+------+
1 row in set (0.00 sec)

0 件のコメント :

コメントを投稿