当客户端连接到 MySQL 服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user
表中选择帐户行。服务器对客户端进行身份验证,从帐户行确定哪个身份验证插件适用于客户端。服务器调用该插件对用户进行身份验证,插件向服务器返回一个状态,指示用户是否被允许连接。
默认情况下,MySQL 使用内置的
mysql_native_password
身份验证插件,它使用本机密码哈希方法执行身份验证。为了提高安全性,此部署使用
sha256_password
和
auth_socket
身份验证插件进行用户身份验证。
当用户帐户配置为使用
sha256_password
插件进行身份验证时,服务器会使用
sha256_password
插件使用 SHA-256 密码散列法对用户密码进行加密。这种加密比 MySQL 本机身份验证可用的加密更安全。密码哈希存储在插件和
系统表
的authentication_string
列中
。mysql.user
服务器端sha256_password
插件内置于服务器中,不需要显式加载。因此,无需服务器端配置即可使用该sha256_password
插件。
要将sha256_password
插件用于新用户帐户,您可以
sha256_password
在创建新用户帐户时指定插件,或者可以
sha256_password
使用配置选项将插件配置为默认身份验证插件
default_authentication_plugin
。稍后在此部署中,将
sha256_password
在创建用户帐户时指定插件。请参阅
第 13 章,创建用户帐户。
有关该
sha256_password
插件的更多信息,请参阅
SHA-256 可插入身份验证。sha256_password
有关该插件
优缺点的讨论
,请参阅MySQL 服务器博客:使用 sha256_password 插件保护 MySQL 密码。
本节介绍如何启用服务器端
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。