我在 Ubuntu 16.04 上的 MariaDB 上有 root 用户。
默认情况下,root 用户由
unix_socket
身份验证插件进行身份验证。
我可以通过设置将认证方式切换为密码方式
update mysql.user set plugin='' where user='root';
这个效果很好。但是...
是否可以通过unix_socket(通过root shell)或密码(当通过localhost:3306连接时)来验证root用户?
一种可靠且直接的方法是创建另一个超级用户,并在您想通过密码连接时使用它。
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 套接字设置无密码,如下所示:
玛丽亚Db:
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-syntax
*即使您由于某种原因被困在旧系统上,您也可能仍然能够运行此版本。 MariaDB 为 Ubuntu 14.04(2024 年 4 月停产)、CentOS 和 RHEL 6(2020 年 11 月停产)、Debian 7(2018 年 5 月停产)、Fedora 28(2019 年 5 月停产)等发行版提供了此版本(或更新版本)的官方版本 ) 和 Windows 7(2020 年 1 月停产);不过对于其中一些(例如 Fedora < 32),您可能需要手动修改 URL 中的版本。
是否可以通过unix_socket(通过root shell)或密码(当通过localhost:3306连接时)来验证root用户?
MySQL 中的
auth_socket
或 MariaDB 中的 unix_socket
的目的是禁用密码身份验证,转而使用 Unix 套接字,该套接字仅允许经过验证的本地用户连接到服务器。
换句话说,同一用户/主机不能有多个身份验证插件。然而,就像其他人指出的那样,常见的解决方法是创建与不同
host
地址关联的其他用户(具有相同的用户名)(密码甚至可以相同)。
正如@ColinM提到的,
localhost
通常默认使用套接字,而127.0.0.1
本质上是非套接字,因为它是一个IP地址,例如TCP 协议。
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 等数据库管理工具一起使用,例如
[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 保护该命令。
编辑:正如@colinM所指出的,如果你使用这个方法,我也这样做,我也按照他指出的那样做,如果你要使用这个方法,请保护套接字文件权限。