技术分享 | 快速掌握 MySQL 8.0 认证插件的使用

本文深入探讨MySQL 8.0中caching_sha2_password认证插件的工作原理及其对RSA密钥对的依赖。揭示了在主从复制场景下,因未配置加密连接而导致io线程异常的问题,并提供了详细的解决方案,包括如何生成和使用RSA密钥对,确保数据库访问的安全。

作者:郭斌斌

引言

MySQL 8.0.15 版本主从复制时,io 线程一直处于 connecting 状态, 由于复制用户使用的认证插件是 caching_sha2_password,而想要通过 caching_sha2_password 认证的用户访问数据库,只有两个途径:

  1. 使用加密连接
  2. 使用支持 RSA 密钥对,进行密码交换的非加密连接
    之前 change master to 时,未进行配置 master_ssl=1(等效于客户端 --ssl-mode=REQUIRED 的配置),导致从库通过复制用户连接主库时使用的非加密连接,同时又没有进行 RSA 密钥配置,导致 io 线程运行异常。为此整理一些关于 MySQL 8.0 认证插件 caching_sha2_password 的一些限制以及 RSA 的相关内容。

一、认证插件 caching_sha2_password

1.1 作用:
用于实现 SHA-256 认证

1.2 工作机制:
1)caching_sha2_password 会将用户名和用户密码哈希对作为缓存条目进行缓存,当用户进行访问时,会跟缓存条目进行匹配,如果匹配则认证成功。
2)如果插件没有匹配到相应的缓存条目,首先会根据 mysql.user 系统表进行校验,如果校验通过会生成相应的缓存条目,下次相同用户进行访问时可以直接命中缓存条目,提升二次认证效率。如果校验失败,则认证失败、访问拒绝。

1.3 优势(相对于 sha256_password):
1)caching_sha2_password 认证插件在 MySQL 服务端进行缓存认证条目,对于之前认证过的用户,可以提升二次认证的速度。
2)不管与 MySQL 链接的 SSL 库如何,都可以使用基于 RSA 的密码交换
3)提供了对使用 Unix 套接字文件和共享内存协议的客户端连接的支持

1.4 缓存管理:
1)当删除用户、修改用户名、修改用户密码、修改认证方式会清理相对应的缓存条目
2)Flush Privileges 会清除所有的缓存条目
3)数据库关闭时会清除所有缓存条目

1.5 限制:
通过 caching_sha2_password 认证的用户访问数据库,只能通过加密的安全连接或者使用支持 RSA 密钥对进行密码交换的非加密连接进行访问。

二、caching_sha2_password 插件使用 RSA 秘钥对

2.1秘钥对生成方式:
1)自动生成
参数 caching_sha2_password_auto_generate_rsa_keys 默认是开启,数据库在启动时自动生成相对应的公钥和私钥。
2)手动生成
通过 mysql_ssl_rsa_setup 指定目录生成 SSL 相关的私钥和证书以及 RSA 相关的公钥和私钥。

2.2 查看 RSA 公钥值的方式:
通过状态变量 Caching_sha2_password_rsa_public_key 可以查看 caching_sha2_password 身份验证插件使用的 RSA 公钥值。

2.3 使用 RSA 键值对的注意事项:
1)拥有 MySQL 服务器上 RSA 公钥的客户端,可以在连接过程中与服务器进行基于 RSA 密钥对的密码交换
2)对于通过使用 caching_sha2_password 和基于 RSA 密钥对的密码交换进行身份验证的帐户,默认情况下,MySQL 服务端不会将 RSA 公钥发送给客户端,获取 RSA 公钥的方式有以下两种:
A. 客户端从服务端拷贝相应的 RSA 公钥,
B. 客户端发起访问时,请求获取 RSA 公钥。
在 RSA 公钥文件可靠性能够保证的前提下,拷贝 RSA 公钥跟请求获取 RSA 公钥相比,由于减少了 c/s 之间的通信,相对而言更安全。如果在网络安全前提下,后者相对来说会更方便。

2.4 命令行客户端通过 RSA 秘钥对进行访问:
1)通过拷贝方式获取RSA公钥,在通过命令行客户端进行访问时,需要在命令行指定 --server-public-key-path 选项来进行访问
2)通过请求获取RSA公钥的方式,在通过命令行客户端进行访问时,需要在命令行中指定 --get-server-public-key 选项来进行访问。
选项 --server-public-key-path 优于 --get-server-public-key

### MySQL 8.0 中 `sys` 数据库的功能与用途 #### 背景介绍 随着 MySQL 的发展,尤其是版本升级至 8.0 后,其功能逐渐增强并更加贴近企业级需求。为了更好地支持开发者和管理员对数据库运行状态的监控,MySQL 提供了一个名为 `sys` 的数据库。该数据库本质上是一个基于 `information_schema` 和 `performance_schema` 构建的一组视图集合[^1]。 #### 功能概述 `sys` 数据库的主要作用是简化复杂的查询操作,提供更直观的数据展示方式以便于分析系统的性能瓶颈以及资源利用情况。它通过预定义好的视图、存储过程等功能模块来帮助用户快速获取所需的信息而无需深入理解底层架构细节: - **性能优化**:通过对 SQL 查询执行计划及响应时间等方面的统计分析找出低效语句; - **资源管理**:查看当前连接数、线程池使用状况等信息辅助规划硬件资源配置; - **安全审计**:记录访问日志便于追踪潜在威胁行为; 这些高级别的汇总报表使得即使是初学者也能轻松掌握整个实例的工作负载概况。 #### 配置方法 默认情况下,在安装完成之后会自动创建好此组件但可能处于未激活状态。可以通过修改配置文件或者动态设置变量两种途径启用它们: ##### 修改 my.cnf 文件 编辑 `/etc/my.cnf` 或者其他位置的具体路径下的全局选项文件加入如下内容: ```ini [mysqld] plugin-load-add=sys.so ``` 重启服务使更改生效即可加载插件。 ##### 使用SQL命令在线调整参数值 登录到目标主机上的客户端工具后输入下面这段脚本就可以立即开启对应特性而不必重新启动进程: ```sql SET GLOBAL sys.statement_truncate_len = 64; SET SESSION sql_mode='STRICT_ALL_TABLES'; CALL sys.ps_setup_reload_status(); ``` 以上两步任选其一就能成功部署完毕所需的环境准备好了以后便能够自由调用了。 #### 实际应用案例分享 假设我们需要定位某个特定时间段内的最耗时的操作,则可以直接借助内置函数完成这一任务: ```sql SELECT * FROM sys.x$statements_with_runtimes_in_95th_percentile LIMIT 10 ; ``` 上述例子展示了如何提取出那些位于第95百分位以上的长时间运行事务列表从而为进一步诊断提供了方向指引。 ### 结论 综上所述,`sys` 数据库作为现代版次中的重要组成部分之一极大地提升了日常运维效率同时也降低了技术门槛让更多的人群受益匪浅。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值