当客户端连接到 MySQL 服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user
表中选择帐户行。服务器对客户端进行身份验证,从帐户行确定哪个身份验证插件适用于客户端。服务器调用该插件对用户进行身份验证,插件向服务器返回一个状态,指示用户是否被允许连接。
此部署使用caching_sha2_password
和auth_socket
身份验证插件进行用户身份验证。
在 MySQL 8.0 中,
caching_sha2_password
是默认的身份验证插件
mysql_native_password
,而不是 MySQL 5.7 中的默认插件。
服务器端caching_sha2_password
插件内置于服务器中,不需要显式加载。因此,使用它不需要服务器端配置。
客户端插件内置于
libmysqlclient
库(MySQL 8.0.4 及更高版本)中,可用于链接到
libmysqlclient
. 有关兼容的客户端和连接器的列表,请参阅
caching_sha2_password-Compatible Clients and Connectors。
该caching_sha2_password
插件使用提供 256 位密码加密的 SHA-2 算法。在应用 SHA-256 转换之前,密码会加入随机数据。生成的散列值存储在
mysql.user
表中。使用盐有助于抵御对存储的密码哈希值的字典攻击。
该caching_sha2_password
插件需要安全连接(使用 TLS 凭证、Unix 套接字文件或共享内存)或支持使用 RSA 密钥对进行密码交换的未加密连接。但是,与安全连接相关的性能成本可以通过插件的缓存功能来降低。一旦哈希密码缓存在内存中,就可以使用基于 SHA256 的质询-响应机制在未加密的通道上执行身份验证,这意味着之前连接的用户可以更快地进行身份验证。
更改密码、重命名用户和FLUSH
PRIVILEGES
操作会使缓存的密码哈希值无效。当缓存的密码哈希值失效时,再次需要安全连接来交换密码。
稍后在此部署中创建的用户帐户使用
caching_sha2_password
身份验证。请参阅
第 13 章,创建用户帐户。TLS 和 RSA 密钥对连接方法在
第 14 章连接到服务器中进行了演示。
有关该
caching_sha2_password
插件的其他信息,请参阅
缓存 SHA-2 可插入身份验证。
本节介绍如何启用服务器端
auth_socket
身份验证插件,该插件对通过 Unix 套接字文件从本地主机连接到 MySQL 服务器的客户端进行身份验证。
auth_socket
身份验证非常适合必须严格限制访问权限的服务器管理用户帐户。
auth_socket
插件检查socket用户名是否与客户端程序指定给服务器的MySQL用户名相匹配
。如果名称不匹配,插件还会检查套接字用户名是否与authentication_string
表mysql.user
行列中指定的名称匹配。如果找到匹配项,插件将允许连接。
例如,假设为一个名为valerie
who的用户创建了一个 MySQL 帐户,auth_socket
插件将通过套接字文件对来自本地主机的连接进行身份验证:
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;
如果本地主机上登录名为 的用户
stefanie
调用带有通过套接字文件进行连接
的选项的mysql ,则服务器将用于对客户端进行身份验证。插件确定选项值 ( ) 与客户端用户名 ( ) 不同,并拒绝连接。如果名为的用户尝试相同的操作,插件会发现用户名和 MySQL 用户名都相同,
并允许连接。但是,即使连接是使用不同的协议(例如 TCP/IP)建立
的,插件也会拒绝连接
。--user=valerie
auth_socket
--user
valerie
stephanie
valerie
valerie
valerie
通过认证的auth_socket
用户在连接到服务器时不需要指定密码。但是,通过auth_socket
插件验证的用户被限制远程连接;它们只能通过 Unix 套接字文件从本地主机连接。
安装服务器端auth_socket
插件:
-
[mysqld]
在 MySQL 配置文件 ( ) 的选项组下添加这些选项/etc/my.cnf
:plugin-load-add=auth_socket.so auth_socket=FORCE_PLUS_PERMANENT
-
plugin-load-add=auth_socket.so
auth_socket.so
每次启动服务器时 加载插件库。 -
auth_socket=FORCE_PLUS_PERMANENT
防止服务器在没有
auth_socket
插件的情况下运行,如果插件未成功初始化,则服务器启动失败。
-
-
要验证插件安装,请重新启动服务器并检查
INFORMATION_SCHEMA.PLUGINS
表或使用以下SHOW PLUGINS
语句:$> systemctl restart mysqld
$> cd /usr/local/mysql $> bin/mysqladmin -u root -p version Enter password: (enter root password here)
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE '%socket%'; +-------------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +-------------------+---------------+ | auth_socket | ACTIVE | +-------------------+---------------+
-
(可选)修改 MySQL root 用户帐户以使用
auth_socket
插件进行身份验证:mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
-
要验证该
root@localhost
帐户是否正在使用该auth_socket
插件,请发出以下查询:mysql> SELECT user, plugin FROM mysql.user WHERE user IN ('root')\G *************************** 1. row *************************** user: root plugin: auth_socket
-
要验证
auth_socket
插件是否正常工作,请以操作系统 root 用户身份登录到 MySQL 服务器主机,然后以 MySQL root 用户身份在本地连接到 MySQL 服务器。您应该能够在不指定密码的情况下进行连接。$> cd /usr/local/mysql $> bin/mysql -u root
有关该auth_socket
插件的更多信息,请参阅Socket Peer-Credential Pluggable Authentication。