TL;DR
mysql-community-serverをインストールした時に
rootのパスワードどうする? パスワードなしでUNIX socketベースの認証をするなら空っぽにしておいて
と聞かれませんでしたか?- これを空っぽにしておくと、
root@localhost
が auth_socketプラグインを使うようになってパスワードを一切合切受け付けなくなる
- これを空っぽにしておくと、
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu Configuring mysql-community-server tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x Please provide a strong password that will be set for the root account of your MySQL database. Leave it blank to enable x
x password less login using UNIX socket based authentication. x
x x
x Enter root password: x
x x
x _________________________________________________________________________________________________________________________ x
x x
x <Ok> x
x x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
書きたいことは全部書いてしまった気がするけれど、↑のプロンプトでパスワードを入力しないとauth_socketプラグインを使うように root@localhost
が作られるので、「パスワードを変更しても変更後のパスワードでログインできない」ように見えたりする。
現実には、auth_socketプラグインは「クライアントから渡されたパスワードは見ないしサーバー側でもパスワードハッシュを保管していない、 getsockopt でSO_PEERCREDオプションを使うだけ」なので、 ALTER USER
や SET PASSWORD
をどれだけ叩き込んでもそれらは認証には一切使われない。
mysql> SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';
+------+-----------+-------------+-----------------------+
| user | host | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket | |
+------+-----------+-------------+-----------------------+
1 row in set (0.01 sec)
mysql> ALTER USER USER() IDENTIFIED BY 'MySQL8.0';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';
+------+-----------+-------------+-----------------------+
| user | host | plugin | authentication_string |
+------+-----------+-------------+-----------------------+
| root | localhost | auth_socket | |
+------+-----------+-------------+-----------------------+
1 row in set (0.00 sec)
切り捨てるならワーニングくらい出してくれても良いと思うんだけども。。
飽くまで OS上のrootユーザーであるか
だけしか判定しないので、 sudo mysql
するしかなく、一般ユーザーから mysql -uroot -p
ではダメ。そしてOSのrootアカウントならパスワードは見ないのでどんなデタラメなパスワードを打ち込んでも通る。
$ sudo mysql -uroot -phogehogefugafuga -e "SELECT CURRENT_USER()"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
$ sudo mysql -uroot -ppiyopiyo -e "SELECT CURRENT_USER()" ### さっきと違うパスワードでも文句は言われずログインできる
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------+
| CURRENT_USER() |
+----------------+
| root@localhost |
+----------------+
よく見ずにEnterを叩いたことを反省しながら、 ALTER USER root@localhost IDENTIFIED WITH caching_sha2_password BY 'MySQL 8.0'
とかやると、フツーの(?)パスワードを使った認証に切り替えることができる(mysql_native_passwordでもいい
mysql> SELECT user, host, plugin, authentication_string FROM mysql.user WHERE user = 'root';
+------+-----------+-----------------------+------------------------------------------------------------------------+
| user | host | plugin | authentication_string |
+------+-----------+-----------------------+------------------------------------------------------------------------+
| root | localhost | caching_sha2_password | $A$005$s8U/pウ・・邏エ靉オ・籌ネ踵ヌツモネ・ヨキクレョヤ・カ・ヌⅳーク ・
ォュュュュュュォュュュュュュュュュュュォュュュュュュュュュュュュュュュュュュュュュュュォュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュュォ
ア ・鴃 ・ィーョーー 罠
( ´-`).oO(authentication_stringがバイナリだから化けた… print_identified_with_as_hex
は SHOW CREATE USER
の時にしか効かないんだよなぁ…
ところでこれ、Ansibleとか使うとこの対話部分はどう扱われるんでしょうね…?
0 件のコメント :
コメントを投稿