MySQL 8.0 安全部署指南  /  第 11 章启用身份验证

第 11 章启用身份验证

当客户端连接到 MySQL 服务器时,服务器使用客户端提供的用户名和客户端主机从mysql.user表中选择帐户行。服务器对客户端进行身份验证,从帐户行确定哪个身份验证插件适用于客户端。服务器调用该插件对用户进行身份验证,插件向服务器返回一个状态,指示用户是否被允许连接。

此部署使用caching_sha2_passwordauth_socket身份验证插件进行用户身份验证。

缓存 SHA-2 身份验证

在 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_stringmysql.user行列中指定的名称匹配。如果找到匹配项,插件将允许连接。

例如,假设为一个名为valeriewho的用户创建了一个 MySQL 帐户,auth_socket插件将通过套接字文件对来自本地主机的连接进行身份验证:

CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;

如果本地主机上登录名为 的用户 stefanie调用带有通过套接字文件进行连接 的选项的mysql ,则服务器将用于对客户端进行身份验证。插件确定选项值 ( ) 与客户端用户名 ( ) 不同,并拒绝连接。如果名为的用户尝试相同的操作,插件会发现用户名和 MySQL 用户名都相同, 并允许连接。但是,即使连接是使用不同的协议(例如 TCP/IP)建立 的,插件也会拒绝连接 。--user=valerieauth_socket--uservaleriestephanievalerievalerievalerie

通过认证的auth_socket用户在连接到服务器时不需要指定密码。但是,通过auth_socket插件验证的用户被限制远程连接;它们只能通过 Unix 套接字文件从本地主机连接。

安装服务器端auth_socket 插件:

  1. [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插件的情况下运行,如果插件未成功初始化,则服务器启动失败。

  2. 要验证插件安装,请重新启动服务器并检查 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        |
    +-------------------+---------------+
  3. (可选)修改 MySQL root 用户帐户以使用 auth_socket插件进行身份验证:

    mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
  4. 要验证该root@localhost帐户是否正在使用该auth_socket插件,请发出以下查询:

    mysql> SELECT user, plugin FROM mysql.user WHERE user IN ('root')\G
    *************************** 1. row ***************************
      user: root
    plugin: auth_socket
  5. 要验证auth_socket插件是否正常工作,请以操作系统 root 用户身份登录到 MySQL 服务器主机,然后以 MySQL root 用户身份在本地连接到 MySQL 服务器。您应该能够在不指定密码的情况下进行连接。

    $> cd /usr/local/mysql 
    $> bin/mysql -u root

有关该auth_socket 插件的更多信息,请参阅Socket Peer-Credential Pluggable Authentication