我在Ubuntu 16.04上的MariaDB中有一个root用户。
默认情况下,root用户由unix_socket
认证插件进行认证。
我可以通过设置来切换认证方法为密码认证方法。
update mysql.user set plugin='' where user='root';
这个代码运行得很好。但是,是否有可能通过unix_socket(通过root shell)或通过密码(当它通过localhost:3306连接时)对根用户进行身份验证?
我在Ubuntu 16.04上的MariaDB中有一个root用户。
默认情况下,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 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
进行登录。
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中的版本信息。
CREATE OR ALTER ...
。但将语句更改为ALTER USER
minecraft IDENTIFIED VIA unix_socket OR mysql_native_password USING PASSWORD("s3cr3tpasswvrd");
就可以了。 - Abdullmysql -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
admin@127.0.0.1
,并且要意识到新的密码哈希插件caching_sha2_password
与许多应用程序不兼容,特别是如果它们没有使用TLS / SSL、Unix套接字或共享内存进行身份验证。GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;
因为默认启用了unix_socket
。然后请使用sudo保护该命令。mysql
命令并不能防止用户使用自己的mysql
客户端可执行文件。Unix套接字文件的权限也需要受到保护。 - ColinM
sudo mysql -u root
。你正在强制指定主机和密码,因此它将寻找匹配项。 - ekydfejjGRANT ALL PRIVILEGES
和IDENTIFIED BY
。您必须像接受的答案中那样使用两个命令。 - Tom Nguyen