关于mysql:为MariaDB根用户启用密码和unix_socket身份验证?

Enable password and unix_socket authentication for MariaDB root user?

我在Ubuntu 16.04上的MariaDB上具有root用户。

默认情况下,root用户通过unix_socket身份验证插件进行身份验证。

我可以通过设置将身份验证方法切换为密码方法

1
update mysql.user set plugin='' where user='root';

这很好。 但是...

是否可以通过unix_socket(通过root shell)或通过密码(通过localhost:3306连接)验证root用户?


一种可靠而直接的方法是创建另一个超级用户,并在您想通过密码连接时使用它。

1
2
3
CREATE USER admin@localhost IDENTIFIED BY 'password';
GRANT ALL ON *.* TO admin@localhost WITH GRANT OPTION;
-- etc

MariaDb / MySQL认为" localhost"与" 127.0.0.1"不同,因此您可以为TCP设置密码,而对于Unix套接字则没有密码,如下所示:

MariaDb:

1
2
3
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
INSTALL SONAME 'auth_socket';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION;

MySQL / Percona:

1
2
3
GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH auth_socket WITH GRANT OPTION;


Is there a possibility to authenticate the root user by unix_socket (by root shell) or by password (when it is connected by localhost:3306)?

在MySQL中auth_socket或在MariaDB中unix_socket的目的是禁用密码身份验证,而支持Unix套接字,后者仅允许经过验证的本地用户连接到服务器。

换句话说,同一用户/主机不能有多个身份验证插件。但是,就像其他人指出的那样,一种常见的解决方法是创建与不同的host地址(密码甚至可以相同)关联的其他用户(具有相同的用户名)。

如@ColinM所述,localhost通常默认使用套接字,而127.0.0.1本质上是非套接字的,因为它是IP地址,例如TCP协议。

这是MySQL 8.0.x的一个示例:

1
2
3
mysql -e"CREATE USER IF NOT EXISTS 'root'@'localhost' IDENTIFIED WITH auth_socket;"
mysql -e"CREATE USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY '@DB_PASSWORD_ROOT';"
mysql -e"CREATE USER 'root'@'::1' IDENTIFIED WITH mysql_native_password BY '@DB_PASSWORD_ROOT';"

为了确保auth_socket是持久的,请在my.cnf中添加行:

1
2
plugin-load-add = auth_socket.so
auth_socket = FORCE_PLUS_PERMANENT

请记住,现在建议创建一个单独的非root用户,以与phpMyAdmin或Adminer等数据库管理工具一起使用。 [email protected],并且还意识到新的密码哈希插件caching_sha2_password与许多应用程序(特别是)的兼容性较差。如果他们没有使用TLS / SSL,Unix套接字或共享内存进行身份验证。


从10.4开始,您可以简单地运行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;默认情况下,由于unix_socket处于打开状态。然后使用sudo保护该命令。