浅谈新的 MySQL 身份验证插件

2023年 8月 15日 37.7k 0

前言

从 MySQL 8.0.4 开始,MySQL 默认身份验证插件从 mysql_native_password  改为 caching_sha2_password 。相应地,libmysqlclient 现在也使用 caching_sha2_password 作为默认的身份验证机制。

在这之前 MySQL 5.6/5.7 使用的默认密码插件是 mysql_native_passwordmysql_native_password无需在网络中发送实际密码,不需要加密的连接。验证速度特别快,但是不安全。因为,mysql_native_password 使用的是于 SHA1 算法,但 NIST(美国国家标准与技术研究院)已建议停止使用 SHA1 算法,因为 SHA1 和其他哈希算法(例如 MD5)已被证明非常容易破解。

其实从 MySQL 5.6 开始就引入了更安全的认证机制:ha256_password 认证插件。它使用一个加盐密码(salted password)进行多轮 SHA256 哈希(数千轮哈希,暴力破解更难),以确保哈希值转换更安全。但是,建立安全连接和多轮 hash 转换很耗费时间。虽然安全性更强,但是性能不够理想。

MySQL 试图结合俩者的优点。于是在 MySQL-8.0.3  引入了一个新的身份验证插件 caching_sha2_password ,作为sha256_password的代替方案,在sha256_password 的基础上进行了改进补上了短板,既解决安全性问题又解决性能问题。

因此建议弃用 sha256_password;MySQL 也预计在未来版本中将其删除。使用 sha256_password 进行身份验证的 MySQL 帐户建议迁移为使用 caching_sha2_password

因为默认身份验证机制的更改,大家在使用 MySQL 8.0 时候出现了很多连接问题。网上的大部分教程都是教人改回mysql_native_password验证方式  mysql_native_password。但是笔者认为,MySQL 的这个更改是为了更好的安全性考虑。如果有 MySQL 服务要放在公网,建议还是尽量使用 caching_sha2_password

分析运行效率

mysql_native_password

mysql_native_password 作为 MySQL 5.6/5.7 的默认密码插件 。其优点是它支持 challenge-response 机制,这是非常快的验证机制,无需在网络中发送实际密码,并且不需要加密的连接。

客户端连接MySQL实例时,首先需要从服务器端获得一个20字节的随机数。

此外,mysql_native_password使用了新的SHA1哈希算法进行认证校验。对于用户的原始密码,通过SHA1(SHA1(password))两次哈希计算保存在表mysql.user的列authentication_string中。

通过上述这样的处理,MySQL数据库本身已然非常安全。然而,随着时间的推移,目前存在以下两种潜在风险:

  • SHA1哈希算法也已经变得比较容易破解;
  • 相同的密码拥有相同的哈希值

SHA1、MD5等之前的哈希算法都已然不再安全,美国国家标准与技术研究院(NIST) 已建议停止使用SHA1哈希算法。

更为安全的SHA256、SHA512哈希算法也已推出。作为数据存储最终承载者,应更新为更为安全的哈希算法认证机制。

另一方面,虽然用户密码通过哈希计算后保存,然而并没有加盐(salt),导致相同的密码具有相同值。这又可能是账户密码存在的潜在风险。

caching_sha2_password

在cache_sha2_password密码认证机制下,其改进如下所示:

  • 保存在列authentication_string中的哈希值为加盐后的值,即使两个不同用户的密码相同,保存在计算机中的哈希值也不同;
  • 哈希算法升级为了更为安全SHA256算法;
  • 哈希算法的round次数从原来的两次,提升为了5000次,round次数越多,每次计算哈希值的代价越大,破解难度也就越大;
  • 用TLS的加密或RSA密钥传输方式从客户端将密码传送到服务端

通讯过程解析

  1. 对于大多数连接尝试,当密码的哈希值有缓存在内存中时,它的验证是基于 SHA256 的challenge-response机制(与 mysql_native_password 中基于 SHA1 的challenge-response机制相比更快),下图演示了在有哈希缓存时的验证流程。

  1. 当没有这种缓存时,caching_sha2_password 需要使用安全连接进行密码交换。考虑到用户更改和 FLUSH PRIVILEGES 操作频率比较低,所以在大多数情况下,使用的都是基于challenge-response的身份验证,不用建立安全连接。这省去了建立安全连接需要耗费的资源。下图总结了完整的验证流程。

需要注意的地方

默认身份验证插件的更改意味着:

在 MySQL 8.0.4 之后创建的所有新用户将默认使用 caching_sha2_password 作为身份验证插件。

mysql> SELECT USER,PLUGIN FROM mysql.`user` ;
+------------------+-----------------------+
| USER | PLUGIN |
+------------------+-----------------------+
| root | caching_sha2_password |
| mysql.infoschema | caching_sha2_password |
| mysql.session | caching_sha2_password |
| mysql.sys | caching_sha2_password |
+------------------+-----------------------+
6 rows in set (0.06 sec)

libmysqlclient 默认使用 caching_sha2_password,可以通过手动修改切换到其他的身份验证插件。

对于使用 caching_sha2_password 插件的客户端,连接到服务器时,密码不会暴露为明文。密码传输是如何进行的取决于是否使用安全连接或 RSA 对密码加密:

  • 如果连接是安全的,可以不使用 RSA 密钥。适用于使用 TLS 加密的 TCP 连接,以及 Unix 套接字文件和共享内存连接。密码以明文格式发送,但不能被窃听,因为连接是安全的。
  • 如果连接不是安全的,可以使用 RSA 密钥对。适用于未使用 TLS 加密的 TCP 连接和 named-pipe 连接。RSA 仅用于客户端和服务器之间的密码交换,防止密码被截取。当服务器接收到使用公钥加密的密码后,它使用私钥解密。一个随机字符串用在加密中,防止重放攻击(repeat attacks)。

在 MySQL 8.0.3 以上版本中。默认自动完成  RSA 密钥对进行密码交换。

关于主从复制

如果复制通道是安全的(在内网环境),也就不需要使用 RSA 公钥来交换密码

复制本身是支持加密的连接。在 MySQL 8.0.4,复制也进行了 RSA 密钥对的支持。

  • CHANGE MASTER 现在支持了两个参数来启用基于 caching_sha2_password RSA 密钥来交换密码 指定 RSA 公钥路径 - MASTER_PUBLIC_KEY_PATH ="key_file_path" #从服务端获取 RSA 公钥 - GET_MASTER_PUBLIC_KEY = {0 | 1}
  • Group Replication 现在支持了两个参数来启用基于 caching_sha2_password RSA 密钥来交换密码 #指定 RSA 公钥路径 ––group-replication-recovery-public-key-path #从服务端获取 RSA 公钥 ––group-replication-recovery-get-public-key

数据库升级

数据库升级到 MySQL 8.0.4 会怎样?

在升级之前创建的用户,身份认证插件不会更改。在升级之后创建的用户默认使用 aching_sha2_password身份验证插件。除非使用 --default-authentication-plugin 手动指定认证插件插件。因为不会更改升级前,已有用户的认证插件。因此,使用升级后依然可以用旧版本的客户端连接这些用户。

相应地,libmysqlclient 支持 mysql_options() C API函数的 MYSQL_DEFAULT_AUTH 选项。(对于 MySQL 包中可用的基于 libmysqlclient 的客户端工具,可以用 ––default-auth 命令行选项达到相同的目的。)

建议使用 cache_sha2_password 因为它更安全。并且升级 libmysqlclient 到 MySQL 8.0.4 或更高版本,以便支持新的身份验证插件。

参考:

MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password

[得物技术浅谈MySQL 8.0:新的身份验证插件](https://segmentfault.com/a/1190000040733952)

MySQL 8.0密码认证机制升级,不知道可能导致业务不可用!!!

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论