root

时间:2017-01-25 07:44:42

标签: mysql authentication mariadb

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

默认情况下,root用户通过unix_socket身份验证插件进行身份验证。

我可以通过设置

将身份验证方法切换为密码方法
update mysql.user set plugin='' where user='root';

这很好用。但是......

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

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

MySQL认为'localhost'与'127.0.0.1'不同,因此您可以为TCP设置密码,而对于Unix套接字则不设置密码,

GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'xxx' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION;

答案 3 :(得分:1)

是否可以通过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套接字或共享内存进行身份验证。

答案 4 :(得分:0)

从10.4开始,您可以简单地运行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;由于unix_socket在默认情况下处于启用状态。然后使用sudo保护该命令。

答案 5 :(得分:-1)

或者干脆 mysql -u user -pYouPassword -e <<< printf 'INSERT INTO 'tablename' ('id', 'day', 'time', 'rank') VALUES (NULL, "'${id}'", "' ${day}'", "'${time}'", NULL);' DB_NAME