为 MariaDB root 用户启用密码和 unix_socket 身份验证?
Enable password and unix_socket authentication for MariaDB root user?
我在 Ubuntu 16.04.
上有一个 MariaDB 的 root 用户
默认情况下,root 用户由 unix_socket
身份验证插件进行身份验证。
我可以通过设置
将认证方式切换为密码方式
update mysql.user set plugin='' where user='root';
这很好用。但是...
是否可以通过 unix_socket(通过 root shell)或密码(当通过 localhost:3306 连接时)验证 root 用户?
一种可靠而直接的方法是创建另一个 super-user 并在您想通过密码连接时使用它。
CREATE USER admin@localhost IDENTIFIED BY 'password';
GRANT ALL ON *.* TO admin@localhost WITH GRANT OPTION;
-- etc
MariaDb/MySQL 认为 'localhost'(unix 套接字)不同于 '127.0.0.1'(tcp 套接字),因此您可以为 TCP 设置密码,为 Unix 套接字设置 none像这样:
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 套接字或使用 mysql -h 127.0.0.1 -u admin -p
.
使用密码通过 tcp 套接字登录本地主机而无需密码
Is there a possibility to authenticate the root user by unix_socket (by root shell) or by password (when it is connected by localhost:3306)?
MySQL 中的 auth_socket
或 MariaDB 中的 unix_socket
的目的是禁用密码验证以支持 Unix 套接字,它只允许经过验证的本地用户连接到服务器。
换句话说,同一个 user/host 不能有多个身份验证插件。然而,就像其他人指出的那样,一个常见的解决方法是创建与不同 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
请记住,现在建议创建一个单独的非根用户以与数据库管理工具(例如 phpMyAdmin 或 Adminer)一起使用,例如admin@127.0.0.1
并且还意识到新的密码哈希插件 caching_sha2_password
与许多应用程序的兼容性较差,尤其是。如果他们没有使用 TLS/SSL、Unix 套接字或共享内存进行身份验证。
从 10.4 开始,您可以简单地 运行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;
因为 unix_socket
默认处于启用状态。然后用 sudo 保护那个命令。
编辑:如@colinM 所述,如果您使用此方法,我也会按照他的说明进行操作,如果您要使用此方法,请保护套接字文件权限。
或者干脆
mysql -u 用户 -pYouPassword -e <<< printf '插入 'tablename' ('id', 'day', 'time', 'rank') 值(NULL, "'${id}'", "'${day}'", "'${time}'", NULL);' DB_NAME
是 — 从 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
*尽管 OS 供应商可能更新缓慢,甚至完全拒绝提供更新,但 MariaDB 提供 an official repository serving at least this version to distributions as old as Ubuntu 14.04, CentOS & RHEL 6, Debian 7, and Fedora 28 (as well as up to current releases of each), though for some of these (e.g. Fedora < 32) 您可能需要手动修改版本URL.
我在 Ubuntu 16.04.
上有一个 MariaDB 的 root 用户默认情况下,root 用户由 unix_socket
身份验证插件进行身份验证。
我可以通过设置
将认证方式切换为密码方式update mysql.user set plugin='' where user='root';
这很好用。但是...
是否可以通过 unix_socket(通过 root shell)或密码(当通过 localhost:3306 连接时)验证 root 用户?
一种可靠而直接的方法是创建另一个 super-user 并在您想通过密码连接时使用它。
CREATE USER admin@localhost IDENTIFIED BY 'password';
GRANT ALL ON *.* TO admin@localhost WITH GRANT OPTION;
-- etc
MariaDb/MySQL 认为 'localhost'(unix 套接字)不同于 '127.0.0.1'(tcp 套接字),因此您可以为 TCP 设置密码,为 Unix 套接字设置 none像这样:
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 套接字或使用 mysql -h 127.0.0.1 -u admin -p
.
Is there a possibility to authenticate the root user by unix_socket (by root shell) or by password (when it is connected by localhost:3306)?
MySQL 中的 auth_socket
或 MariaDB 中的 unix_socket
的目的是禁用密码验证以支持 Unix 套接字,它只允许经过验证的本地用户连接到服务器。
换句话说,同一个 user/host 不能有多个身份验证插件。然而,就像其他人指出的那样,一个常见的解决方法是创建与不同 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
请记住,现在建议创建一个单独的非根用户以与数据库管理工具(例如 phpMyAdmin 或 Adminer)一起使用,例如admin@127.0.0.1
并且还意识到新的密码哈希插件 caching_sha2_password
与许多应用程序的兼容性较差,尤其是。如果他们没有使用 TLS/SSL、Unix 套接字或共享内存进行身份验证。
从 10.4 开始,您可以简单地 运行:GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED WITH unix_socket WITH GRANT OPTION;
因为 unix_socket
默认处于启用状态。然后用 sudo 保护那个命令。
编辑:如@colinM 所述,如果您使用此方法,我也会按照他的说明进行操作,如果您要使用此方法,请保护套接字文件权限。
或者干脆 mysql -u 用户 -pYouPassword -e <<< printf '插入 'tablename' ('id', 'day', 'time', 'rank') 值(NULL, "'${id}'", "'${day}'", "'${time}'", NULL);' DB_NAME
是 — 从 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
*尽管 OS 供应商可能更新缓慢,甚至完全拒绝提供更新,但 MariaDB 提供 an official repository serving at least this version to distributions as old as Ubuntu 14.04, CentOS & RHEL 6, Debian 7, and Fedora 28 (as well as up to current releases of each), though for some of these (e.g. Fedora < 32) 您可能需要手动修改版本URL.