为 MariaDB root 用户启用密码和 unix_socket 身份验证?

问题描述 投票:0回答:5

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

默认情况下,root 用户由

unix_socket
身份验证插件进行身份验证。

我可以通过设置将认证方式切换为密码方式

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

这个效果很好。但是...

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

mysql authentication passwords mariadb unix-socket
5个回答
15
投票

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

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

13
投票

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 套接字并使用密码登录。


9
投票

是的 - 从 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 中的版本。


2
投票

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

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 等数据库管理工具一起使用,例如

[email protected]
,还意识到新的密码哈希插件
caching_sha2_password
与许多应用程序的兼容性较差,尤其是。如果他们没有使用 TLS/SSL、Unix 套接字或共享内存进行身份验证。


1
投票

从 10.4 开始,您只需运行:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;
因为
unix_socket
默认处于启用状态。然后使用 sudo 保护该命令。

编辑:正如@colinM所指出的,如果你使用这个方法,我也这样做,我也按照他指出的那样做,如果你要使用这个方法,请保护套接字文件权限。

© www.soinside.com 2019 - 2024. All rights reserved.