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

13

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

默认情况下,root用户由unix_socket认证插件进行认证。

我可以通过设置来切换认证方法为密码认证方法。

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

这个代码运行得很好。但是,是否有可能通过unix_socket(通过root shell)或通过密码(当它通过localhost:3306连接时)对根用户进行身份验证?

5个回答

14

一种可靠且简单的方法是创建另一个超级用户,并在需要使用密码连接时使用它。

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

13

MariaDb/MySQL认为'localhost'(unix socket)和'127.0.0.1'(tcp socket)是不同的,因此您可以为TCP设置密码,而对于Unix sockets则不设置密码,如下所示:

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套接字无需密码登录,或者通过带有密码的TCP套接字使用mysql -h 127.0.0.1 -u admin -p进行登录。


1
你没有说明应该如何登录。使用mysql --user=root --host=127.0.0.1 -p是不起作用的,因为root@localhost基于套接字掩盖了其他内容。 - user1708042
@user1708042 sudo mysql -u root。你正在强制指定主机和密码,因此它将寻找匹配项。 - ekydfejj
自MySQL 8.0版本开始,您不能在同一条命令中同时使用GRANT ALL PRIVILEGESIDENTIFIED BY。您必须像接受的答案中那样使用两个命令。 - Tom Nguyen
感谢 @TomNguyen 的评论,答案已相应更新。 - ColinM

7
是的 - 从MariaDB 10.4开始(发布于2019年6月*),您可以使用IDENTIFIED VIA关键字与OR关键字一起使用,以允许多种认证方法:(链接)
ALTER USER `minecraft` 
    IDENTIFIED VIA unix_socket 
    OR mysql_native_password USING PASSWORD("Type me over TCP, or from other accts");

这里


虽然操作系统供应商可能反应缓慢或甚至拒绝提供更新,但MariaDB为旧版本的Ubuntu 14.04、CentOS和RHEL 6、Debian 7以及Fedora 28(以及每个版本的最新版本)提供官方仓库,至少服务器会提供此版本,但对于一些操作系统(例如Fedora <32),您可能需要手动修改URL中的版本信息。


2
我们的MariaDB 10.6不喜欢CREATE OR ALTER ...。但将语句更改为ALTER USER minecraft IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD("s3cr3tpasswvrd");就可以了。 - Abdull
1
@Abdull 感谢您的评论,看起来他们实际上从未实现过那个语法。我更新了答案以反映这一点。 - JamesTheAwesomeDude

2
有没有可能通过unix_socket(通过root shell)或通过密码(当它通过localhost:3306连接时)对根用户进行身份验证?
MySQL中的auth_socket或MariaDB中的unix_socket的目的是禁用密码身份验证,而是使用Unix套接字,这只允许经过验证的本地用户连接到服务器。
换句话说,您不能为相同的用户/主机使用多个身份验证插件。但是,正如其他人指出的那样,一个常见的解决方法是创建与不同主机地址相关联的附加用户(具有相同的用户名)(密码甚至可以相同)。
如@ColinM所提到的,localhost通常默认使用套接字,而127.0.0.1本质上不是套接字,因为它是一个IP地址,例如TCP协议。
这是MySQL 8.0.x的一个示例:Here's an example
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 持久化,您需要将 add lines 添加到您的 my.cnf 文件中。
plugin-load-add = auth_socket.so
auth_socket = FORCE_PLUS_PERMANENT

请记住,现在建议创建一个单独的非根用户用于数据库管理工具,例如phpMyAdmin或Adminer,例如admin@127.0.0.1,并且要意识到新的密码哈希插件caching_sha2_password与许多应用程序不兼容,特别是如果它们没有使用TLS / SSL、Unix套接字或共享内存进行身份验证。

附加官方文档:https://dev.mysql.com/doc/mysql-secure-deployment-guide/8.0/en/secure-deployment-configure-authentication.html - Abdull

1
截至10.4版本,您只需运行以下命令即可: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION; 因为默认启用了unix_socket。然后请使用sudo保护该命令。
编辑:如@colinM所指出的,如果您使用此方法(我也使用此方法),请保护套接字文件权限。

1
使用sudo保护mysql命令并不能防止用户使用自己的mysql客户端可执行文件。Unix套接字文件的权限也需要受到保护。 - ColinM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接