ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ProxySQL caching_sha2_password RSA 公钥认证:非 TLS 前端的完整认证方案

ProxySQL caching_sha2_password RSA 公钥认证:非 TLS 前端的完整认证方案 后端数据库负载均衡【免费下载链接】proxysqlHigh-performance proxy for MySQL and PostgreSQL项目地址https://gitcode.com/gh_mirrors/pr/proxysql点击查看免费下载引言ProxySQL 3.1 和 4.0 新增了对 MySQLcaching_sha2_password插件的完整支持在非 TLS 前端连接下客户端可以请求 ProxySQL 的 RSA 公钥或使用本地预置的可信公钥副本对密码进行 RSA-OAEP 加密后回传从而完成全量认证。本文围绕 doc/caching_sha2_password_rsa.md 展开深入讲解该特性的三个核心变量、密钥文件的格式与权限约束、重载与集群行为、客户端两种 RSA 模式并结合 include/MySQL_Caching_Sha2_RSA.h、lib/MySQL_Caching_Sha2_RSA.cpp、lib/MySQL_Thread.cpp 等源码说明其底层实现原理。读完本文你将掌握如何配置、验证、轮换 ProxySQL 的 RSA 密钥对并能安全地让caching_sha2_password客户端在非 TLS 场景下完成认证。重要安全提示TLS 仍是官方推荐的配置。通过非认证连接请求公钥只能防止被动窃听者获知密码无法验证 ProxySQL 服务器身份且易受主动网络攻击者的公钥替换攻击。若需要服务器身份与传输完整性保障请务必使用 TLS。该特性在 ProxySQL 3.0 中不可用需 3.1 或 4.0。1. 特性概述与适用场景MySQL 8.0 默认的认证插件caching_sha2_password在完整认证full authentication阶段要求传输明文密码。官方客户端在非 TLS 连接下不允许直接发送明文密码而是通过 RSA 公钥加密密码后传输。ProxySQL 3.1/4.0 的实现让该流程在代理层自洽完成客户端使用caching_sha2_password插件发起连接ProxySQL 发送握手包进入认证切换auth switch流程若需要完整认证ProxySQL 发出0x04perform full authentication挑战客户端选择以下任一方式发送0x02请求 ProxySQL 的 RSA 公钥再加密密码回传--get-server-public-key模式直接使用本地预置的公钥文件加密密码回传--server-public-key-path模式ProxySQL 用对应密钥快照解密 RSA 密文完成认证。整个过程在 lib/MySQL_Protocol.cpp 中实现capture_caching_sha2_rsa_snapshot()lib/MySQL_Protocol.cpp在认证开始时获取密钥快照PPHR_decrypt_caching_sha2_rsa_response()lib/MySQL_Protocol.cpp负责校验密文长度、调用 RSA 解密、恢复密码明文客户端发送0x02请求公钥时则由PPHR_1()lib/MySQL_Protocol.cpp响应公钥 PEM 内容。2. 配置变量三个 MySQL 变量构成一个配置单元见下表。ProxySQL 在将配置发布到前端会话之前会整体校验或生成完整的密钥对如果重载失败三个变量的运行时值以及先前已加载的密钥快照均保持不变。VariableDefaultDescriptionmysql-caching_sha2_password_auto_generate_rsa_keystrue当两个配置文件都不存在时自动生成一对 2048 位 RSA 密钥。mysql-caching_sha2_password_private_key_pathproxysql-caching-sha2-private-key.pem私钥路径。相对路径解析到 ProxySQL 数据目录datadir之下。mysql-caching_sha2_password_public_key_pathproxysql-caching-sha2-public-key.pem公钥路径。相对路径解析到 ProxySQL 数据目录datadir之下。默认值定义于 lib/MySQL_Thread.cpp三个变量在 MySQL 变量表中注册为同一个分组lib/MySQL_Thread.cpp。修改后需执行LOAD MYSQL VARIABLES TO RUNTIME;2.1 相对路径约束与防符号链接处理从源码 lib/MySQL_Caching_Sha2_RSA.cpp 可以看到路径解析的安全策略相对路径必须位于 ProxySQL 数据目录之下解析时拒绝空组件、.与..组件valid_relative_component见 lib/MySQL_Caching_Sha2_RSA.cpp每个父目录都以不跟随符号链接的方式打开通过openat()与O_NOFOLLOW逐层打开目录见resolve_key_path避免符号链接逃逸绝对路径也被允许当密钥托管在运维人员控制的其他目录时可以使用此时直接打开父目录不拒绝符号链接。这保证了即使 ProxySQL 以较低权限运行配置的密钥文件也不会被符号链接劫持到任意位置。2.2 三变量分组校验与回滚commit()lib/MySQL_Thread.cpp将三个变量打包为MySQL_Caching_Sha2_RSA_Config调用reload()lib/MySQL_Caching_Sha2_RSA.cpp若校验失败记录Rejected caching_sha2_password RSA key configuration错误并将三个变量整体标记为rejected_variables见 lib/MySQL_Thread.cpp——即要么全部接受要么全部回滚若私钥与公钥路径仅配置了其中一个reload()直接拒绝并提示 both RSA private and public key paths must be configured togetherlib/MySQL_Caching_Sha2_RSA.cpp。3. 密钥格式与权限要求3.1 格式校验ProxySQL 对密钥文件的格式有严格限制私钥必须是未加密的 PKCS#8 PEM RSA 私钥PEM 头为BEGIN PRIVATE KEY。传统的 PKCS#1BEGIN RSA PRIVATE KEY与加密私钥一律被拒绝公钥必须是 PEM 格式的 SubjectPublicKeyInfoSPKI公钥BEGIN PUBLIC KEY两个文件必须包含结构上有效且匹配的 RSA 密钥对长度至少 2048 位。从源码实现可见这些约束并非文档声明而已load_private_key()使用has_single_pem_envelope()检查 PEM 信封唯一性用PEM_read_bio_PKCS8_PRIV_KEY_INFO()解码 PKCS#8并通过reject_password_callbacklib/MySQL_Caching_Sha2_RSA.cpp拒绝任何需要口令的解密回调从机制上保证不支持加密私钥lib/MySQL_Caching_Sha2_RSA.cppvalidate_rsa_key()检查EVP_PKEY_base_id必须为 RSA、位数不低于MINIMUM_RSA_KEY_BITS 2048并对私钥执行EVP_PKEY_private_check与EVP_PKEY_pairwise_check、对公钥执行EVP_PKEY_public_check结构性校验lib/MySQL_Caching_Sha2_RSA.cppload_key_pair()会分别导出私钥与公钥的 PEM 并逐一比对确保二者是匹配的一对lib/MySQL_Caching_Sha2_RSA.cpp。此外私钥文件读取有1 MiB 大小上限MAXIMUM_PEM_FILE_SIZE见 lib/MySQL_Caching_Sha2_RSA.cpp避免异常大文件导致内存耗尽。3.2 文件权限私钥文件必须是普通文件regular file且不得授予任何组group或其他人other权限见validate_open_filelib/MySQL_Caching_Sha2_RSA.cpp自动生成的文件权限模式为私钥0600公钥0644由于 ProxySQL 运行时没有口令输入通道不支持加密私钥。如果密钥文件权限过宽或格式不合法加载会被拒绝。3.3 密钥自动生成与发布自动生成仅在两个路径都不存在时发生lib/MySQL_Caching_Sha2_RSA.cpp若恰好只有一个文件存在ProxySQL 报告配置错误不会覆盖或替换任一文件only one RSA key file exists; refusing to generate or overwrite a partial pair生成采用临时文件 不覆盖发布no-overwrite publication机制create_temporary_key_file使用O_CREAT | O_EXCL发布使用linkat见 lib/MySQL_Caching_Sha2_RSA.cpp配合基于flock的生成锁确保并发运行的多个 ProxySQL 进程不会发布混合的密钥对generate_pairlib/MySQL_Caching_Sha2_RSA.cpp。3.4 初始加载失败的降级行为如果在初始运行时加载时编译默认的密钥对不可用、且无法安全重新生成ProxySQL 会记录一个显式的TLS-only 状态自动生成关闭、两个路径均为空见 lib/MySQL_Thread.cpp 的disabled_configTLS 认证仍然可用RSA 公钥认证保持禁用直到加载到有效密钥对为止。4. 重载与集群行为4.1 密钥快照的不可变性每次认证交换都从完整认证挑战0x04到 RSA 解密全程持有同一个不可变的密钥快照无论客户端是请求公钥还是使用已固定的副本。这意味着并发执行LOAD MYSQL VARIABLES TO RUNTIME进行密钥轮换不会破坏正在进行中的认证交换快照由acquire()以shared_ptrconst MySQL_Caching_Sha2_RSA_Key_Snapshot形式获取lib/MySQL_Caching_Sha2_RSA.h解密时整个交换期间引用计数持有该快照即使后续 reload 发布了新快照也互不影响。4.2 密钥轮换的客户端协调使用固定公钥pinned public key的客户端在 ProxySQL 密钥对轮换时必须同步更新需要协调发布新公钥、客户端配置变更与 ProxySQL 运行时重载三者的时机。使用与 ProxySQL 所选密钥快照不匹配的密钥的客户端无法完成认证。ProxySQL 不提供宽限期——新连接不能同时使用新旧两把私钥。因此建议的轮换流程是先发布新公钥并更新客户端最后再执行 ProxySQL 的运行时重载。4.3 集群同步语义集群同步LOAD MYSQL VARIABLES TO RUNTIME跨节点传播传输的是变量值本身而不是私钥内容每个 ProxySQL 节点都必须能读取其配置的本地密钥对或在启用自动生成时生成自己的密钥对切勿将私钥内容存入 ProxySQL 配置数据库。从架构上看这是为了避免私钥在集群配置通道中扩散同时保证每个节点都能独立服务本地认证。5. 客户端两种 RSA 模式客户端必须使用caching_sha2_password插件并且只有在明确需要时才关闭 TLS。Oracle MySQL CLI 支持两种 RSA 模式。5.1 模式一请求 ProxySQL 的公钥--get-server-public-keymysql --default-authcaching_sha2_password \ --ssl-modeDISABLED --get-server-public-key \ --host127.0.0.1 --port6033 --userapp --password认证流程ProxySQL 发送完整认证挑战0x04客户端发送0x02请求公钥ProxySQL 返回公钥通过generate_auth_more_data携带 PEM见 lib/MySQL_Protocol.cpp客户端使用该公钥加密密码回传 RSA 密文ProxySQL 用发出挑战时保留的同一密钥快照解密PPHR_decrypt_caching_sha2_rsa_response见 lib/MySQL_Protocol.cpp。安全边界此模式防止被动观察者获知密码但不认证 ProxySQL 本身。主动攻击者可以替换另一个公钥。若服务器身份重要请优先使用 TLS 或固定密钥模式。5.2 模式二使用预置的公钥--server-public-key-pathmysql --default-authcaching_sha2_password \ --ssl-modeDISABLED \ --server-public-key-path/etc/proxysql/proxysql-caching-sha2-public-key.pem \ --host127.0.0.1 --port6033 --userapp --password认证流程ProxySQL 发送0x04挑战客户端不发送0x02直接使用本地公钥文件加密密码并回传 RSA 密文ProxySQL 用发出挑战时保留的密钥快照解密。安全边界请通过可信渠道分发公钥文件并保护其完整性。此模式能验证端点确实持有对应私钥并避免未经认证的带内密钥替换。RSA 只保护密码交换本身后续的查询、结果及其他会话流量仍然是未加密、未认证的。当整个连接都需要机密性与完整性时请使用 TLS。5.3 两种模式的源码验证测试用例 test/tap/tests/reg_test_5988-caching_sha2_rsa-t.cpp 同时覆盖了两种模式通过--get-server-public-key认证成功见该文件 L104、L330-L335通过--server-public-key-path认证成功并验证错误密码返回1045L345还验证了禁用 RSA 后返回caching_sha2_password TLS-or-key 1045 hint的提示消息L267以及分组 RSA 配置拒绝时三个变量整体回滚的行为L282-L320。此外test/repro/reg_test_5985_admin_caching_sha2_full_auth.bash 验证了 ADMIN 接口:6032上针对caching_sha2哈希凭据的完整认证完成路径其证明方法依赖于stats_mysql_global.Client_Connections_sha2cached计数——成功登录而该计数仍为 0说明认证来自完整的 full auth 而非缓存。6. 失败行为与错误处理ProxySQL 实现了 MySQL 协议定义的 RSA OAEP 交换包括协议规定的SHA-1 OAEP与MGF1 摘要见 lib/MySQL_Caching_Sha2_RSA.cppEVP_PKEY_CTX_set_rsa_oaep_md(... EVP_sha1())与EVP_PKEY_CTX_set_rsa_mgf1_md(... EVP_sha1())源码注释明确指出这是 MySQLcaching_sha2_password所要求的 OAEP SHA-1密码与 scramble 的XOR 步骤lib/MySQL_Caching_Sha2_RSA.cppplaintext[index] ^ scramble[index % scramble_length]解密后验证明文是单一 NUL 结尾字符串lib/MySQL_Caching_Sha2_RSA.cpp。以下所有情况均返回标准的1045/28000访问被拒绝响应格式错误的密文EVP_PKEY_decrypt失败格式错误的明文非单一 NUL 结尾字符串密码不正确认证校验失败。此外lib/MySQL_Caching_Sha2_RSA.cpp 的decrypt_password()使用ScopedStringCleanser/ScopedBufferCleanserOPENSSL_cleanse在解密后立即擦除内存中的明文密码与中间缓冲降低密码在内存中长期驻留的风险。当没有可用的有效 RSA 密钥对时返回相同的1045/28000错误码与 SQLSTATE但错误消息会明确指出 RSA 密钥交换不可用并建议使用 TLS 或配置密钥对应MySQLFrontendAuthError::CACHING_SHA2_RSA_UNAVAILABLE见 lib/MySQL_Protocol.cpp。7. 推荐的安全实践小结场景推荐方案需要服务器身份认证与传输完整性使用 TLS始终是官方推荐配置仅需保护密码免于被动窃听且不要求服务器身份--get-server-public-key模式需要验证端点持有对应私钥、规避带内公钥替换--server-public-key-path固定公钥模式 可信分发通道密钥轮换先发布新公钥 → 更新客户端 → 再执行 ProxySQL 运行时重载无宽限期集群多节点各节点独立持有/生成本地密钥对绝不把私钥写入配置数据库私钥文件未加密 PKCS#8 PEM、≥2048 位、权限0600存放于 datadir 下或受控绝对路径该特性通过 include/MySQL_Caching_Sha2_RSA.h 的MySQL_Caching_Sha2_RSA类提供原子快照发布与解密通过 lib/MySQL_Thread.cpp 的commit()完成三变量整体校验与回滚具体流程可参阅 doc/caching_sha2_password_rsa.md 原文及对应回归测试 test/tap/tests/reg_test_5988-caching_sha2_rsa-t.cpp。赞分享后端数据库负载均衡【免费下载链接】proxysqlHigh-performance proxy for MySQL and PostgreSQL项目地址https://gitcode.com/gh_mirrors/pr/proxysql点击查看免费下载相关推荐WebSSH公钥认证完全指南支持DSA、RSA、ECDSA、Ed25519密钥WebSSH公钥认证完全指南支持DSA、RSA、ECDSA、Ed25519密钥 WebSSH是基于Web的SSH客户端提供了便捷的远程服务器管理体验。本指南后端运维网络安全Go-MySQL认证机制支持mysql_native_password、caching_sha2_passwordGo MySQL认证机制支持mysql_native_password、caching_sha2_password 在当今的数据驱动时代MySQL数据库的安数据库后端CANN/driver ECC时间戳查询dcmi\_get\_multi\_ecc\_time\_infoa nameZH CN_TOPIC_0000002485455470 /a 函数原型驱动开发人工智能CANN上一篇PaddleSpeech 声纹识别说话人验证实战用 ECAPA-TDNN 提取说话人嵌入并计算相似度下一篇lilos异步RTOS未来路线图物联网边缘计算的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表