GA

2020/09/24

Debian / UbuntuあたりでMySQLのrootのパスワードが変更できないように見える件

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 USERSET 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_hexSHOW CREATE USER の時にしか効かないんだよなぁ…


ところでこれ、Ansibleとか使うとこの対話部分はどう扱われるんでしょうね…?


ちなみに

0 件のコメント :

コメントを投稿