文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  缓存 SHA-2 可插拔身份验证

8.4.1.2 缓存 SHA-2 可插拔身份验证

MySQL 提供了两种身份验证插件,它们为用户帐户密码实施 SHA-256 散列

  • caching_sha2_password: 实施 SHA-256 身份验证(类似于 sha256_password),但使用服务器端缓存以提高性能,并且具有可扩展性的附加功能。

  • sha256_password (已弃用): 实施基本的 SHA-256 身份验证。此插件已弃用且可能会被移除,请勿使用此身份验证插件。

本节介绍缓存 SHA-2 身份验证插件。有关原始基本(非缓存)已弃用插件的信息,请参见 第 8.4.1.3 节,“SHA-256 可插拔身份验证”

重要

在 MySQL 8.4 中,caching_sha2_password 是默认的身份验证插件,而不是 mysql_native_password(已弃用)。有关此更改对服务器操作以及服务器与客户端和连接器兼容性的影响的信息,请参见 caching_sha2_password 作为首选身份验证插件

重要

若要使用 caching_sha2_password 插件进行身份验证的帐户连接到服务器,您必须使用安全连接或不支持 RSA 密钥对进行密码交换的未加密连接,如本节后面所述。无论哪种方式,caching_sha2_password 插件都使用 MySQL 的加密功能。请参见 第 8.3 节,“使用加密连接”

注意

在名称 sha256_password 中,sha256 指的是插件用于加密的 256 位摘要长度。在名称 caching_sha2_password 中,sha2 更一般地指的是 SHA-2 类加密算法,其中 256 位加密是其中一个实例。后一种名称选择为将来可能的摘要长度扩展预留了空间,而无需更改插件名称。

与已弃用的 sha256_password 插件相比,caching_sha2_password 插件具有以下优点

  • 在服务器端,内存缓存使以前连接的用户在再次连接时能够更快地重新进行身份验证。

  • 无论 MySQL 链接到哪个 SSL 库,RSA 基于密码交换都可用。

  • 支持使用 Unix 套接字文件和共享内存协议的客户端连接。

下表显示了服务器端和客户端的插件名称。

表 8.16 SHA-2 身份验证的插件和库名称

插件或文件 插件或文件名
服务器端插件 caching_sha2_password
客户端插件 caching_sha2_password
库文件 无(插件内置)

以下各节提供了特定于缓存 SHA-2 可插拔身份验证的安装和使用信息

有关 MySQL 中可插拔身份验证的一般信息,请参见 第 8.2.17 节,“可插拔身份验证”

安装 SHA-2 可插拔身份验证

caching_sha2_password 插件存在于服务器端和客户端形式

  • 服务器端插件内置于服务器中,无需显式加载,也不能通过卸载它来禁用。

  • 客户端插件内置于 libmysqlclient 客户端库中,可用于链接到 libmysqlclient 的任何程序。

服务器端插件使用 sha2_cache_cleaner 审计插件作为助手来执行密码缓存管理。 sha2_cache_cleanercaching_sha2_password 一样,是内置的,无需安装。

使用 SHA-2 可插拔身份验证

要设置使用 caching_sha2_password 插件进行 SHA-256 密码散列的帐户,请使用以下语句,其中 password 是所需的帐户密码

CREATE USER 'sha2user'@'localhost'
IDENTIFIED WITH caching_sha2_password BY 'password';

服务器将 caching_sha2_password 插件分配给帐户并使用它使用 SHA-256 加密密码,并将这些值存储在 mysql.user 系统表的 pluginauthentication_string 列中。

前面的说明不假定 caching_sha2_password 是默认身份验证插件。如果 caching_sha2_password 是默认身份验证插件,则可以使用更简单的 CREATE USER 语法

CREATE USER 'sha2user'@'localhost' IDENTIFIED BY 'password';

默认插件由 authentication_policy 系统变量的值确定;默认使用 caching_sha2_password

要使用其他插件,必须使用 IDENTIFIED WITH 指定它。例如,要指定已弃用的 mysql_native_password 插件,请使用以下语句

CREATE USER 'nativeuser'@'localhost'
IDENTIFIED WITH mysql_native_password BY 'password';

caching_sha2_password 支持通过安全传输连接。如果您遵循本节后面给出的 RSA 配置过程,它还支持使用 RSA 通过未加密连接加密的密码交换。RSA 支持具有以下特点

对于使用 caching_sha2_password 插件的客户端,密码在连接到服务器时永远不会以明文形式显示。密码传输的方式取决于是否使用安全连接或 RSA 加密

  • 如果连接是安全的,则不需要 RSA 密钥对,也不使用它。这适用于使用 TLS 加密的 TCP 连接,以及 Unix 套接字文件和共享内存连接。密码以明文形式发送,但由于连接是安全的,因此无法被窃听。

  • 如果连接不安全,则使用 RSA 密钥对。这适用于不使用 TLS 加密的 TCP 连接和命名管道连接。RSA 仅用于客户端和服务器之间的密码交换,以防止密码窃听。当服务器接收到加密的密码时,它会解密它。混淆在加密中使用,以防止重复攻击。

要启用在客户端连接过程中使用 RSA 密钥对进行密码交换,请使用以下过程

  1. 使用 第 8.3.3 节,“创建 SSL 和 RSA 证书和密钥” 中的说明创建 RSA 私钥和公钥对文件。

  2. 如果私钥和公钥文件位于数据目录中,并且名为 private_key.pempublic_key.pemcaching_sha2_password_private_key_pathcaching_sha2_password_public_key_path 系统变量的默认值),服务器会在启动时自动使用它们。

    否则,要显式命名密钥文件,请在服务器选项文件中将系统变量设置为密钥文件名。如果文件位于服务器数据目录中,则不必指定它们的完整路径名

    [mysqld]
    caching_sha2_password_private_key_path=myprivkey.pem
    caching_sha2_password_public_key_path=mypubkey.pem

    如果密钥文件不在数据目录中,或者要在系统变量值中明确其位置,请使用完整路径名

    [mysqld]
    caching_sha2_password_private_key_path=/usr/local/mysql/myprivkey.pem
    caching_sha2_password_public_key_path=/usr/local/mysql/mypubkey.pem
  3. 如果要更改密码生成期间 caching_sha2_password 使用的散列轮数,请设置 caching_sha2_password_digest_rounds 系统变量。例如

    [mysqld]
    caching_sha2_password_digest_rounds=10000
  4. 重新启动服务器,然后连接到它并检查 Caching_sha2_password_rsa_public_key 状态变量值。实际显示的值与这里显示的值不同,但应非空

    mysql> SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key'\G
    *************************** 1. row ***************************
    Variable_name: Caching_sha2_password_rsa_public_key
            Value: -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDO9nRUDd+KvSZgY7cNBZMNpwX6
    MvE1PbJFXO7u18nJ9lwc99Du/E7lw6CVXw7VKrXPeHbVQUzGyUNkf45Nz/ckaaJa
    aLgJOBCIDmNVnyU54OT/1lcs2xiyfaDMe8fCJ64ZwTnKbY2gkt1IMjUAB5Ogd5kJ
    g8aV7EtKwyhHb0c30QIDAQAB
    -----END PUBLIC KEY-----

    如果该值为空,则服务器在密钥文件中发现了一些问题。检查错误日志以获取诊断信息。

在服务器已配置了 RSA 密钥文件后,使用 caching_sha2_password 插件进行身份验证的帐户可以选择使用这些密钥文件连接到服务器。如前所述,此类帐户可以使用安全连接(在这种情况下不使用 RSA)或执行使用 RSA 进行密码交换的未加密连接。假设使用的是未加密连接。例如

$> mysql --ssl-mode=DISABLED -u sha2user -p
Enter password: password

对于 sha2user 进行的此连接尝试,服务器确定 caching_sha2_password 是适当的身份验证插件并调用它(因为这是在 CREATE USER 时指定的插件)。该插件发现连接未加密,因此需要使用 RSA 加密来传输密码。但是,服务器不会将公钥发送到客户端,并且客户端没有提供任何公钥,因此它无法加密密码,连接失败

ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password'
reported error: Authentication requires secure connection.

要向服务器请求 RSA 公钥,请指定 --get-server-public-key 选项

$> mysql --ssl-mode=DISABLED -u sha2user -p --get-server-public-key
Enter password: password

在这种情况下,服务器会将 RSA 公钥发送到客户端,客户端使用它加密密码并将结果返回到服务器。该插件使用服务器端的 RSA 私钥解密密码,并根据密码是否正确来接受或拒绝连接。

或者,如果客户端有一个文件包含服务器所需的 RSA 公钥的本地副本,则它可以使用 --server-public-key-path 选项指定该文件

$> mysql --ssl-mode=DISABLED -u sha2user -p --server-public-key-path=file_name
Enter password: password

在这种情况下,客户端使用公钥加密密码并将结果返回到服务器。该插件使用服务器端的 RSA 私钥解密密码,并根据密码是否正确来接受或拒绝连接。

--server-public-key-path 选项命名的文件中的公钥值应与服务器端文件中的密钥值相同,该文件由 caching_sha2_password_public_key_path 系统变量命名。如果密钥文件包含有效的公钥值,但该值不正确,则会发生拒绝访问错误。如果密钥文件不包含有效的公钥,则客户端程序无法使用它。

客户端用户可以通过两种方式获取 RSA 公钥

  • 数据库管理员可以提供公钥文件的副本。

  • 可以通过其他方式连接到服务器的客户端用户可以使用 SHOW STATUS LIKE 'Caching_sha2_password_rsa_public_key' 语句并将返回的密钥值保存在文件中。

SHA-2 可插拔身份验证的缓存操作

在服务器端,caching_sha2_password 插件使用内存中缓存来更快地验证以前连接过的客户端。条目包含帐户名称/密码散列对。缓存的工作原理如下

  1. 当客户端连接时,caching_sha2_password 检查客户端和密码是否与某个缓存条目匹配。如果是,则身份验证成功。

  2. 如果没有匹配的缓存条目,插件尝试根据 mysql.user 系统表中的凭据验证客户端。如果成功,caching_sha2_password 将客户端的条目添加到散列中。否则,身份验证失败,连接被拒绝。

这样,当客户端第一次连接时,会发生针对 mysql.user 系统表的身份验证。当客户端随后连接时,会发生针对缓存的更快的身份验证。

除添加条目以外的密码缓存操作由 sha2_cache_cleaner 审核插件处理,该插件代表 caching_sha2_password 执行这些操作

  • 它会清除任何重命名或删除的帐户的缓存条目,或任何凭据或身份验证插件更改的帐户的缓存条目。

  • 当执行FLUSH PRIVILEGES语句时,它会清空缓存。

  • 它在服务器关闭时清空缓存。(这意味着缓存不会在服务器重启后持续存在。)

缓存清除操作会影响后续客户端连接的身份验证要求。对于每个用户帐户,在执行以下任何操作后,用户的第一个客户端连接必须使用安全连接(使用 TLS 凭据通过 TCP 建立,使用 Unix 套接字文件或共享内存)或基于 RSA 密钥对的密码交换

FLUSH PRIVILEGES会清除整个缓存,并影响所有使用caching_sha2_password插件的帐户。其他操作会清除特定的缓存条目,仅影响参与操作的帐户。

用户成功验证后,帐户将被放入缓存,后续连接不需要安全连接或 RSA 密钥对,直到发生影响该帐户的另一个缓存清除事件。(当可以使用缓存时,服务器会使用挑战-响应机制,该机制不会使用明文密码传输,也不需要安全连接。)