我在Ubuntu 16.04上的MariaDB上有一个root用户。
默认情况下,根用户由unix_socket
身份验证插件进行身份验证。
我可以通过设置将身份验证方法切换为密码方法
update mysql.user set plugin='' where user='root';
这很好用。但是
是否有可能通过unix_socket(通过root shell)或密码(当通过localhost:3306连接时)对根用户进行身份验证?
一种可靠而直接的方法是创建另一个超级用户,并在您想要通过密码连接时使用它。
CREATE USER admin@localhost IDENTIFIED BY 'password';
GRANT ALL ON *.* TO admin@localhost WITH GRANT OPTION;
-- etc
MariaDb/MySQL认为"localhost"(unix套接字)与"127.0.0.1"(tcp套接字)不同,因此您可以为tcp设置密码,而为unix套接字设置密码,如下所示:
MariaDb:
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
INSTALL SONAME 'auth_socket';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION;
MySQL/Percona:
CREATE USER 'admin'@'127.0.0.1' IDENTIFIED BY 'xxx';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'127.0.0.1' WITH GRANT OPTION;
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
CREATE USER 'admin'@'localhost' IDENTIFIED WITH auth_socket;
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
然后,您可以使用mysql -u admin
登录到本地主机,而无需通过unix套接字输入密码,也可以通过使用mysql -h 127.0.0.1 -u admin -p
输入密码的tcp套接字输入密码。
是——从MariaDB 10.4(2019年6月发布*)开始,您可以将OR
关键字与IDENTIFIED VIA
一起使用,以允许多种身份验证方法中的任何一种:
ALTER USER `minecraft`
IDENTIFIED VIA unix_socket
OR mysql_native_password USING PASSWORD("Type me over TCP, or from other accts");
https://mariadb.com/kb/en/pluggable-authentication-overview/#extended-sql语法
*尽管操作系统供应商可能在绘图方面进展缓慢,甚至拒绝完全提供更新,MariaDB提供了一个官方存储库,至少为这个版本的提供服务,适用于Ubuntu 14.04、CentOS&RHEL 6、Debian 7和Fedora 28(以及每种版本的最新版本),但对于其中一些版本(例如Fedora<32),您可能需要手动修改URL中的版本。
是否有可能通过unix_socket(通过root shell)或密码(通过localhost:3306连接时)对根用户进行身份验证?
MySQL中auth_socket
或MariaDB中unix_socket
的目的是禁用密码身份验证,而Unix套接字只允许经过验证的本地用户连接到服务器。
换句话说,同一个用户/主机不能有多个身份验证插件。然而,正如其他人所指出的,一个常见的解决方法是创建与不同host
地址相关联的其他用户(使用相同的用户名)(密码甚至可以相同)。
正如@ColinM所提到的,localhost
通常默认使用套接字,而127.0.0.1
本质上是非套接字的,因为它是一个IP地址,例如TCP协议。
以下是MySQL 8.0.x的一个示例:
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
:中添加行
plugin-load-add = auth_socket.so
auth_socket = FORCE_PLUS_PERMANENT
请记住,现在建议创建一个单独的非root用户,用于phpMyAdmin或Adminer等数据库管理工具,例如admin@127.0.0.1
,并认识到新的密码哈希插件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保护这个命令。
编辑:正如@colinM所指出的,如果你使用这个方法,我也会这样做,如果你要使用这个方法的话,我会保护套接字文件的权限。