为 MariaDB 根用户启用密码和 unix_socket 身份验证?
Posted
技术标签:
【中文标题】为 MariaDB 根用户启用密码和 unix_socket 身份验证?【英文标题】:Enable password and unix_socket authentication for MariaDB root user? 【发布时间】:2017-06-10 07:16:48 【问题描述】:我在 Ubuntu 16.04 上的 MariaDB 上有一个 root 用户。
默认情况下,root 用户由unix_socket
身份验证插件进行身份验证。
我可以通过设置将认证方式切换为密码方式
update mysql.user set plugin='' where user='root';
这很好用。但是……
是否有可能通过 unix_socket(通过 root shell)或密码(当它通过 localhost:3306 连接时)验证 root 用户?
【问题讨论】:
【参考方案1】:一种可靠且直接的方法是创建另一个超级用户并在您想通过密码连接时使用它。
CREATE USER admin@localhost IDENTIFIED BY 'password';
GRANT ALL ON *.* TO admin@localhost WITH GRANT OPTION;
-- etc
【讨论】:
【参考方案2】:MariaDb/MySQL 认为 'localhost' 与 '127.0.0.1' 不同,因此您可以为 TCP 设置密码,而为 Unix 套接字设置密码,如下所示:
MariaDb:
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:
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;
【讨论】:
您没有说明应该如何登录。使用 mysql --user=root --host=127.0.0.1 -p 不起作用,因为基于 root@localhost 套接字的屏蔽了另一个。 @user1708042sudo mysql -u root
。您正在强制使用主机和密码,因此它会寻找匹配项。【参考方案3】:
是的 — 从 MariaDB 10.4(2019 年 6 月发布*)开始,you can use the OR
keyword with IDENTIFIED VIA
允许多种身份验证方法中的任何一种:
CREATE OR ALTER USER `minecraft`
IDENTIFIED VIA unix_socket
OR mysql_native_password USING PASSWORD("s3cr3tpasswvrd");
https://mariadb.com/kb/en/pluggable-authentication-overview/#extended-sql-syntax
*尽管操作系统供应商可能反应迟缓,甚至完全拒绝提供更新,但 MariaDB 提供an official repository 为早于 Ubuntu 14.04 的发行版提供至少此版本、CentOS & RHEL 6、Debian 7 和 Fedora 28(以及每个版本的最新版本),但对于其中一些 (e.g. Fedora < 32),您可能需要手动修改 URL 中的版本。
【讨论】:
我们的 MariaDB 10.6 不喜欢CREATE OR ALTER ...
。但是将语句更改为ALTER USER
minecraft` IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD("s3cr3tpasswvrd");` 有效。【参考方案4】:
是否有可能通过 unix_socket(通过 root shell)或密码(当它通过 localhost:3306 连接时)验证 root 用户?
MySQL 中的auth_socket
或 MariaDB 中的unix_socket
的目的是禁用密码验证以支持 Unix 套接字,它只允许经过验证的本地用户连接到服务器。
换句话说,您不能为同一个用户/主机拥有多个身份验证插件。然而,正如其他人指出的那样,一种常见的解决方法是创建与不同host
地址相关联的其他用户(使用相同的用户名)(密码甚至可以相同)。
正如@ColinM 提到的,localhost
通常默认使用套接字,而 127.0.0.1
本质上是非套接字,因为它是一个 IP 地址,例如TCP 协议。
Here's an example 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
持续存在add lines:
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 套接字或共享内存进行身份验证。
【讨论】:
【参考方案5】:从 10.4 开始,您可以简单地运行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;
因为unix_socket
默认处于打开状态。然后用 sudo 保护该命令。
【讨论】:
【参考方案6】:或者简单地说 mysql -u user -pYouPassword -e
【讨论】:
以上是关于为 MariaDB 根用户启用密码和 unix_socket 身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
mariadb怎么设置密码,度娘的方法都没有效果,请大神看看问题出在哪,要用啥命令行语句才能设置