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

    技术2022-07-10  140

    前阶段团队小伙伴将MGR的版本从5.7升级到了8.0。在升级后,发现业务无法连接MySQL数据库的问题。

    相信不少同学也遇到类似问题,有些可通过升级MySQL Connector驱动问题得以解决。然而,对于在线业务,升级MySQL Connector驱动是非常麻烦的事情。

    这个问题的本质原因是:MySQL 8.0修改了默认的密码认证机制,将之前的mysql_native_password机制,升级到新的caching_sha2_password

    因此,若想业务平滑升级到MySQL 8.0的话,显示的配置参数default_authentication_plugin,将其设置为8.0版本之前的mysql_native_password。

    # /etc/my.cnf[mysqld]default_authentication_plugin = mysql_native_password

    这是一个很简单的问题,但是背后却有着深远的原因。因为MySQL 8.0在不断加固数据库的安全性,而密码认证机制其中重要的一环。

    今天让姜老师带同学们回顾MySQL的密码认证机制发展史。

    old_mysql_password

    在MySQL 5.6版本前,MySQL的密码认证机制为old_mysql_password。

    在表mysql.user中的列password保存有密码hash后的数值。但是由于使用的hash算法已被破解。非常不建议在线上的MySQL实例中使用old_mysql_password密码认证机制。

    mysql_native_password

    mysql_native_password是MySQL 5.6、5.7默认的密码认证机制。对比原来的old_mysql_password认证机制,当用户连接MySQL实例时,通过challenge-reponse的密码校验机制进行认证。

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

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

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

    SHA1哈希算法也已经变得比较容易破解;

    相同的密码拥有相同的哈希值

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

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

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

    对源码感兴趣的同学可以翻阅核心函数:native_password_authenticate、my_make_scrambled_password

    caching_sha2_password

    为了解决mysql_native_passowrd密码认证机制存在的风险,MySQL 8.0中推出了更为为安全的caching_sha_password密码认证机制,并将其设置为了默认密码认证配置。

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

    保存在列authentication_string中的哈希值为加盐后的值,即使两个不同用户的密码相同,保存在计算机中的哈希值也不同;

    哈希算法升级为了更为安全SHA256算法;

    哈希算法的round次数从原来的两次,提升为了5000次,round次数越多,每次计算哈希值的代价越大,破解难度也就越大;

    用TLS的加密或RSA密钥传输方式从客户端将密码传送到服务端

    为了实现加盐机制,列authentication_string需保存保存盐值,因此authentication_string值的长度变为了70个字节:

    在上图中可以看到,用户david@192.168.10.1和david@192.168.20.1都使用了caching_sha2_password密码认证机制,长度变为了70。

    此外,虽然用户david@192.168.10.1和david@192.168.20.1的密码相同,但是authentication_string中的值并不同。

    新caching_sha2_password认证机制下,authentication_string中的字节,例如上图中的字符串$A$005$FtBTF(9X)Q|TN}=hChH92.xj3pjPKjMbeLp0/6idYsfBnYQbtV0VCRvpY9,其中分别保存如下内容:

    内容

    字节数

    说明

    哈希算法

    2字节

    目前仅为$A,表示SHA256算法

    哈希round次数

    4字节

    目前仅为$005,表示5*1000=5000次

    盐值(salt)

    21字节

    用于解决相同密码相同哈希值问题

    哈希值

    43字节

     

    在caching_sha2_password密码认证中,分为COMPELETE和FAST两种方式。

    COMPELET方式会进行一次完整的认证,客户端将密码通过TLS或RSA密钥对的方式传送到服务器端,服务器通过哈希SHA256算法计算得到哈希值,判断是否用户认证通过。

    [root@mysql.sock][(none)]> show variables like 'caching%';+----------------------------------------------+-----------------+| Variable_name | Value |+----------------------------------------------+-----------------+| caching_sha2_password_auto_generate_rsa_keys | ON || caching_sha2_password_private_key_path | private_key.pem || caching_sha2_password_public_key_path | public_key.pem |+----------------------------------------------+-----------------+3 rows in set (0.00 sec)

    同时,将用户和对应的哈希计算值保存到缓存中,用于下次快速认证,避免哈希计算,提升性能。

    FAST方式是指当用户登录时,会首先检查密码认证缓存中是否有用户对应的哈希值,若有则认证,否则进行一次COMPELETE认证。

    当执行FLUSH PRIVILEGES、ALTER USER、SET PASSWORD、RENAME USER等操作时,会清空对应的缓存值。

    对源码感兴趣的同学可以翻阅核心函数:caching_sha2_password_authenticate

    MySQL 8.0安全增强

    MySQL 8.0版本对于安全做了很多层的加固,除了本文介绍的caching_sha2_password密码认证机制外,还有InnoDB表空间加密,InnoDB redo/undo加密、二进制日志加密等。无一不是在宣告MySQL正在逐步进入核心金融领域。这些特性,都是为了能更好符合金融等核心业务保要求。

    MySQL 8.0的种子已然种下,来日满山遍野待花开

    IMG群目前有少林群、武当群、峨眉群、华山群、M悦会(高端VIP群)。仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群

    -----------------------

    公众号:破产码农(ID:manongBR)

    B站:Jiang老师

    微博:破产码农

    知乎:破产码农

    长按下图二维码关注,将感受到一个有趣的灵魂,每篇文章都会有新惊喜。

     

    Processed: 0.017, SQL: 9