Jumpserver堡垒机配置MySQL SSL加密连接完整指南 1. 项目概述为什么MySQL SSL连接在堡垒机中至关重要在运维和数据库管理领域数据在传输过程中的安全其重要性不亚于数据在存储时的安全。想象一下你通过Jumpserver这个统一的“安全网关”去管理成百上千台服务器上的MySQL数据库所有的SQL查询、账号密码、敏感数据都在网络里裸奔这无异于在互联网上“广播”你的核心业务数据。我见过太多团队只关注数据库本身的权限控制和防火墙却完全忽略了连接链路这一环直到某次安全审计被揪出来才追悔莫及。SSL/TLS加密连接就是为这条数据传输通道加上一个坚固的“保险箱”。它确保从Jumpserver到MySQL服务器之间的所有通信包括最敏感的身份认证信息都被高强度加密即使数据包被截获攻击者看到的也只是一堆乱码。而Jumpserver作为堡垒机其核心价值正是集中管控与审计。将SSL配置整合进Jumpserver的MySQL纳管流程意味着你不仅实现了单点登录和操作录像更从链路层面筑牢了安全防线实现了从“入口”到“数据库”的全链路安全管控。本指南旨在为你提供一份从原理到实操从证书生成到Jumpserver配置再到最终验证的完整闭环方案。无论你是正在为等保合规做准备还是单纯想提升数据库访问的安全性这篇内容都能让你避开我踩过的坑一步到位地构建起安全的MySQL访问体系。2. 核心原理与架构设计理解SSL在Jumpserver-MySQL链路中的角色在开始动手之前我们必须厘清几个关键概念知道每一个组件在安全链路中扮演什么角色这样才能在出问题时快速定位。2.1 SSL/TLS加密连接的核心组件一个标准的MySQL SSL连接涉及三个核心文件CA证书证书颁发机构根证书。它是信任的源头用来验证服务器证书是否可信。在Jumpserver连接MySQL的场景中通常由我们自建私有CA或使用机构颁发的CA证书。服务器证书安装在MySQL服务器端包含服务器的公钥和身份信息如域名、IP。客户端Jumpserver用它来验证“我正在连接的真的是我想要的服务器吗”客户端证书安装在客户端Jumpserver端用于双向认证。MySQL服务器可以用它来验证“连接过来的真的是我授权的Jumpserver吗”。这是比单向认证更高级的安全模式。工作流程简化版当Jumpserver尝试通过SSL连接MySQL时首先会进行“握手”。MySQL服务器出示它的“服务器证书”。Jumpserver用事先配置好的“CA证书”去校验这个服务器证书是否可信是否由它信任的CA签发。校验通过后双方会基于证书中的公钥协商出一个临时的“会话密钥”后续所有数据传输都用这个密钥加密。如果启用了客户端证书验证MySQL服务器还会要求Jumpserver出示它的“客户端证书”进行校验。2.2 Jumpserver在SSL连接中的定位Jumpserver在这里扮演的是客户端的角色。它本身不直接提供MySQL服务而是作为访问代理。因此SSL的配置是双向的MySQL服务器端需要启用SSL支持并配置好服务器证书和私钥。Jumpserver资产端在纳管MySQL资产时需要提供CA证书用于验证服务器以及可选的客户端证书和私钥用于被服务器验证。很多人的误区是只在MySQL服务器上开了SSL却在Jumpserver里连接时依然使用非加密方式这样连接虽然能通但实际传输并未加密。Jumpserver的Web终端或数据库客户端如DBeaver在建立连接时会使用你提供的证书信息去与MySQL协商加密通道。2.3 方案选型自签名证书 vs 公共CA证书对于内网环境使用自签名证书是最高效、成本最低的方案。自签名证书自己充当CA自己给自己签发证书。优点是免费、快速、完全可控。缺点是浏览器或默认不信任自签CA的客户端会报警告需要在Jumpserver端手动导入并信任自签CA证书。公共CA证书从Let‘s Encrypt等机构获取。优点是通用性强被广泛信任。缺点是需要域名、有有效期需要续期对于纯内网IP地址的数据库支持不友好。我的建议是对于企业内部运维场景强烈推荐使用自签名证书。你完全掌控整个证书生命周期无需依赖外部服务也更符合安全隔离的原则。本指南后续也将以自签名证书为例进行展开。3. 实操准备生成自签名SSL证书套件这是整个流程的基石证书生成错了后面一切白搭。我会详细到每一个参数的含义。3.1 环境与工具准备你需要在一台可以操作MySQL服务器的Linux机器上执行以下步骤。我们将使用OpenSSL工具包它通常已预装。# 检查OpenSSL版本 openssl version # 创建一个专用的目录存放所有证书文件避免混乱 mkdir -p /etc/mysql/ssl cd /etc/mysql/ssl这个目录的权限要严格控制建议设置为root:root和700因为里面存放了私钥。3.2 创建私有CA证书颁发机构第一步创建我们自己的根CA。# 1. 生成CA的私钥非常敏感 openssl genrsa -aes256 -out ca-key.pem 4096系统会提示你为CA私钥设置一个密码。请务必使用强密码并妥善保存。-aes256表示用AES-256算法加密私钥文件增加一道密码防护。# 2. 生成CA的自签名根证书 openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem执行后会交互式询问你一些信息用于构建证书的主题标识Subject。对于内网CA很多信息可以自定义。Country Name国家如CN。State or Province Name省/州。Locality Name城市。Organization Name组织如MyCompany。Organizational Unit Name部门如IT Security。Common Name这是关键这里填写CA的可识别名称例如MyCompany Internal MySQL CA。Email Address邮箱。-days 3650让CA证书10年后才过期减少维护频率。现在你有了ca-key.pem加密的CA私钥和ca.pemCA根证书。3.3 为MySQL服务器生成证书现在用刚才的CA为你的MySQL服务器签发证书。# 1. 生成服务器私钥无需密码加密因为MySQL服务启动时需要自动读取 openssl genrsa -out server-key.pem 4096 # 2. 生成证书签名请求 openssl req -new -key server-key.pem -sha256 -out server.csr同样需要填写信息特别注意Common Name。这里应该填写MySQL服务器能被客户端访问到的主机名或IP地址。如果Jumpserver通过域名mysql.internal.com访问就填这个如果通过IP192.168.1.100访问就填IP。填错会导致证书验证失败。其他信息可以和CA保持一致或不同。# 3. 使用CA签发服务器证书 openssl x509 -req -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 365 -sha256这里需要输入之前设置的CA私钥密码。-days 365设置服务器证书有效期为1年到期前需要续签。现在你有了server-key.pem和server-cert.pem。3.4 为Jumpserver客户端生成证书可选但推荐为了实现双向认证提升安全性我们为Jumpserver这个“客户端”也创建证书。# 1. 生成客户端私钥 openssl genrsa -out client-key.pem 4096 # 2. 生成客户端证书签名请求 openssl req -new -key client-key.pem -sha256 -out client.csrCommon Name可以填写jumpserver-client或任何能标识此客户端的名称。# 3. 使用CA签发客户端证书 openssl x509 -req -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 365 -sha2563.5 证书文件整理与权限设置操作完成后/etc/mysql/ssl目录下应有以下文件ca.pemCA根证书。需要分发给所有客户端Jumpserver。ca-key.pemCA私钥。绝密仅用于签发新证书妥善保管不要分发。server-cert.pemMySQL服务器证书。server-key.pemMySQL服务器私钥。server.csr服务器证书请求文件可删除。client-cert.pem客户端证书。client-key.pem客户端私钥。client.csr客户端证书请求文件可删除。关键权限设置# MySQL服务通常以mysql用户运行需要能读取证书文件 chown mysql:mysql /etc/mysql/ssl/server-*.pem chmod 600 /etc/mysql/ssl/server-*.pem # 私钥必须600 chmod 644 /etc/mysql/ssl/server-cert.pem ca.pem # 证书可读 # Jumpserver需要的客户端证书文件根据你存放的位置设置相应权限 chmod 600 client-key.pem chmod 644 client-cert.pem ca.pem权限设置不当是导致MySQL服务启动失败或SSL握手失败的常见原因。4. 配置MySQL服务器启用并强制SSL连接证书准备好了现在告诉MySQL如何使用它们。4.1 修改MySQL配置文件编辑MySQL的配置文件通常是/etc/mysql/my.cnf或/etc/my.cnf也可能在/etc/mysql/mysql.conf.d/mysqld.cnf。找到[mysqld]段落添加或修改以下配置[mysqld] # 启用SSL/TLS支持 sslON # 指定服务器证书和私钥的路径 ssl-cert/etc/mysql/ssl/server-cert.pem ssl-key/etc/mysql/ssl/server-key.pem # 指定CA证书路径用于验证客户端证书如果启用双向认证 ssl-ca/etc/mysql/ssl/ca.pem # 可选但强烈建议要求所有远程连接必须使用安全传输 # 加上这行非SSL连接将被拒绝。先注释掉等测试成功后再开启。 # require_secure_transportON # 可选绑定地址确保MySQL监听正确的网络接口 bind-address0.0.0.0 # 或你的服务器IP4.2 重启MySQL服务并验证SSL状态# 根据你的系统重启MySQL例如 systemctl restart mysqld # 或 systemctl restart mysql # 登录MySQL mysql -u root -p # 在MySQL命令行中查看SSL相关变量 SHOW VARIABLES LIKE %ssl%;你应该看到have_ssl的值为YES并且ssl_certssl_key等路径正确。-- 创建一个用于测试SSL连接的用户并强制其必须使用SSL CREATE USER jumpserver_user% IDENTIFIED BY YourStrongPassword123!; GRANT ALL PRIVILEGES ON *.* TO jumpserver_user% REQUIRE SSL; FLUSH PRIVILEGES; -- 检查用户的SSL要求 SELECT user, host, ssl_type FROM mysql.user WHERE userjumpserver_user;ssl_type应该是ANY如果用了REQUIRE SSL或X509如果用了REQUIRE X509。4.3 本地测试SSL连接在MySQL服务器本地使用新用户测试SSL连接是否工作。# 不使用SSL连接应该失败如果配置了require_secure_transport mysql -u jumpserver_user -p --host127.0.0.1 --ssl-modeDISABLED # 使用SSL连接应该成功 mysql -u jumpserver_user -p --host127.0.0.1 --ssl-modeREQUIRED # 在连接成功后可以执行以下命令查看当前连接状态 \s # 或者 STATUS;在输出信息中寻找SSL:这一行如果显示Cipher in use is TLS_AES_256_GCM_SHA384之类的信息恭喜你SSL连接已成功建立。5. 在Jumpserver中配置MySQL资产以使用SSL这是将SSL链路与堡垒机管控结合的关键一步。5.1 准备证书文件并上传Jumpserver需要ca.pem以及可选的client-cert.pem和client-key.pem。由于Jumpserver Web界面通常直接粘贴证书内容我们需要获取PEM文件的文本。# 在存放证书的机器上查看证书内容 cat /etc/mysql/ssl/ca.pem cat /etc/mysql/ssl/client-cert.pem cat /etc/mysql/ssl/client-key.pem你会看到以-----BEGIN CERTIFICATE-----开头-----END CERTIFICATE-----结尾的文本块。复制它们稍后用到。5.2 在Jumpserver中创建或编辑MySQL资产登录Jumpserver控制台进入“资产管理” - “数据库” - “创建”或选择现有资产“更新”。填写资产基本信息名称、地址IP/域名、端口默认3306。关键步骤 - 启用SSL找到“安全”或“高级选项”区域不同版本位置可能略有不同。勾选“使用SSL/TLS”或类似选项。CA证书将ca.pem文件的全部内容包括BEGIN和END行粘贴到对应文本框。这是必须的用于验证MySQL服务器的证书。客户端证书将client-cert.pem的内容粘贴到这里。如果你在MySQL用户创建时使用了REQUIRE X509则此项必填。如果只是REQUIRE SSL此项可选但填写后启用双向认证更安全。客户端密钥将client-key.pem的内容粘贴到这里。同上与客户端证书配对使用。SSL模式通常选择REQUIRED或VERIFY_CA。REQUIRED表示强制使用SSL但不验证CA自签名证书可用。VERIFY_CA表示强制使用SSL并验证CA证书更安全推荐使用。保存资产。5.3 创建数据库账户并关联资产进入“资产管理” - “数据库账户” - “创建”。填写账户信息名称如mysql-ssl-account。用户名填写你在MySQL中创建的、要求SSL的用户名如jumpserver_user。密码填写该用户的密码。关联资产选择你刚刚配置好的MySQL资产。重要确保“特权用户”选项根据实际情况选择。如果你用于纳管的账户有GRANT权限可以选“是”用于Jumpserver自动改密等功能。保存账户。5.4 授权与连接测试资产授权进入“权限管理” - “资产授权”创建一个新的授权规则将刚才的MySQL资产和数据库账户授权给需要访问的用户或用户组。Web连接测试被授权用户登录Jumpserver Web界面。在“我的资产”或“数据库”中找到该MySQL资产点击“连接”。选择“Web CLI”或“Web GUI”如果支持。如果一切配置正确连接应成功建立。你可以在Web CLI中再次输入\s命令确认连接是否使用了SSL。6. 深度安全验证与故障排查实录配置完了不代表万事大吉我们必须进行严格的验证并准备好应对可能出现的各种问题。6.1 多维度连接验证方法方法一在Jumpserver Web终端内验证连接成功后在MySQL提示符下执行\s -- 或者 STATUS;查看输出中的SSL行。这是最直接的证据。方法二使用MySQL客户端命令测试在Jumpserver服务器上或一个可以访问Jumpserver API的测试环境模拟Jumpserver的连接方式# 使用从Jumpserver配置中提取的参数进行测试 mysql --hostmysql_ip --port3306 --userjumpserver_user --password --ssl-ca/path/to/ca.pem --ssl-cert/path/to/client-cert.pem --ssl-key/path/to/client-key.pem --ssl-modeVERIFY_CA如果此命令能成功连接而去掉SSL参数则失败说明SSL配置正确。方法三网络抓包分析终极验证在MySQL服务器上使用tcpdump抓取3306端口的流量。sudo tcpdump -i any port 3306 -w mysql_traffic.pcap然后在Jumpserver上发起一次数据库查询操作。停止抓包后用Wireshark打开mysql_traffic.pcap文件。如果你能看到明文的SELECT、INSERT等SQL语句说明SSL未生效。如果看到的全是TLSv1.2/1.3的Application Data乱码包恭喜SSL加密成功。6.2 常见故障排查表故障现象可能原因排查步骤与解决方案Jumpserver连接MySQL超时或拒绝1. 网络不通或防火墙阻断。2. MySQL未监听正确IP或端口。3.bind-address配置错误。1. 从Jumpserver服务器ping和telnet mysql_ip 3306。2. 在MySQL服务器执行netstat -tlnp | grep 3306确认监听状态。3. 检查MySQL配置文件的bind-address确保不是127.0.0.1。错误Access denied for user ... (using password: YES)1. 用户名或密码错误。2. 用户主机限制userhost。3. 用户未授予SSL连接权限。1. 在MySQL中用root登录检查用户jumpserver_user是否存在密码是否正确host是否包含Jumpserver的IP或%。2. 确认用户权限SHOW GRANTS FOR jumpserver_user%;确认包含REQUIRE SSL。错误Connections using insecure transport are prohibitedMySQL服务器配置了require_secure_transportON但客户端未使用SSL连接。1. 确认Jumpserver资产配置中已勾选“使用SSL/TLS”。2. 检查SSL证书内容是否正确粘贴特别是开头结尾的标记和格式。3. 暂时在MySQL配置中注释掉require_secure_transport测试基础连通性。错误SSL connection error: SSL_CTX_set_default_verify_paths failed或证书相关错误1. CA证书格式错误或内容损坏。2. 证书文件路径权限问题MySQL服务无法读取。3. 证书的Common Name与连接的主机名/IP不匹配。1. 使用openssl x509 -in ca.pem -text -noout检查证书内容是否完整。2. 检查/etc/mysql/ssl/下文件的所有者和权限见3.5节。3.重点检查服务器证书的Common Name或Subject Alternative Name是否包含了Jumpserver连接时使用的主机名或IP地址。可以用openssl x509 -in server-cert.pem -text -noout | grep -A 1 Subject Alternative Name查看。Web CLI连接成功但\s显示SSL未加密Jumpserver Web终端与Jumpserver服务之间的连接可能未加密但Jumpserver服务到MySQL的链路是加密的。Web终端显示的是其自身会话状态。这是正常现象。Jumpserver作为代理它到MySQL的链路是SSL加密的。要验证这一点需要在Jumpserver服务器上抓包方法三或者通过Jumpserver的“会话录像”功能查看建立连接时的日志通常会记录“使用SSL连接”的信息。启用SSL后连接速度明显变慢SSL握手和加解密需要消耗CPU资源。1. 这是正常性能损耗。对于高性能要求场景确保服务器CPU足够。2. 可以考虑使用更高效的加密套件在MySQL配置中通过ssl-cipher参数指定如TLS_AES_256_GCM_SHA384。3. 确认不是网络问题。6.3 我的实操心得与避坑指南证书Common Name是万恶之源80%的SSL验证失败都源于此。务必确保服务器证书的CN或SAN包含客户端实际连接时使用的地址。如果Jumpserver用IP连接证书里就要有IP用域名连接证书里就要有域名。可以用openssl s_client -connect mysql_ip:3306 -starttls mysql命令测试看证书验证错误信息。权限权限权限Linux的权限模型非常严格。确保mysql用户能读server-cert.pem和ca.pem能读且仅自己能读server-key.pem600。Jumpserver进程用户可能是jumpserver或root也要能读取你存放客户端证书的文件。先测试后强制不要一开始就在MySQL配置里加上require_secure_transportON。先配置好SSL用--ssl-modeREQUIRED能连上后再开启这个强制选项。否则一旦配置出错你会把自己关在门外。Jumpserver的证书粘贴框很“娇气”粘贴证书内容时确保是完整的PEM格式包括-----BEGIN XXX-----和-----END XXX-----这两行并且中间没有多余的空格、换行符错误。最稳妥的方式是使用cat命令输出后直接从终端复制。证书有效期管理自签名证书虽然方便但别忘了它们会过期。服务器证书我们设了1年客户端证书也是。建议在日历中设置提醒在到期前1个月进行续签和更换。续签流程通常是用原来的CA和私钥为原服务器生成新的CSR或复用旧CSR然后签发新证书替换文件重启MySQL和检查Jumpserver配置。关于双向认证如果启用了客户端证书在Jumpserver中配置了客户端证书和密钥那么MySQL用户授权最好使用REQUIRE X509而不仅仅是REQUIRE SSL。这样MySQL服务器会验证客户端证书的有效性和签发者安全性更高。命令如GRANT ... TO user% REQUIRE X509;。7. 高级配置与自动化考量对于生产环境我们还需要考虑更多。7.1 使用Subject Alternative Name现代TLS更推荐使用Subject Alternative Name来指定多个可识别名称。在生成服务器证书请求时可以创建一个配置文件server.cnf[req] distinguished_name req_distinguished_name req_extensions v3_req prompt no [req_distinguished_name] C CN ST Zhejiang L Hangzhou O MyCompany OU DBA CN mysql.internal.com # 主域名 [v3_req] keyUsage keyEncipherment, dataEncipherment, digitalSignature extendedKeyUsage serverAuth subjectAltName alt_names # 关键在这里 [alt_names] DNS.1 mysql.internal.com DNS.2 mysql IP.1 192.168.1.100 IP.2 10.0.0.100然后使用这个配置文件生成CSRopenssl req -new -key server-key.pem -out server.csr -config server.cnf这样生成的证书既能通过域名也能通过IP验证适应性更强。7.2 与Jumpserver的资产同步与改密如果你使用了Jumpserver的“改密计划”功能确保用于纳管的数据库账户在Jumpserver中标记为“特权用户”的SSL连接配置是正确的否则自动改密任务会因无法连接而失败。测试方法就是用一个普通的MySQL客户端使用该特权账户和相同的SSL参数去手动连接一次。7.3 监控与告警证书过期监控使用Zabbix、Prometheus等监控系统监控server-cert.pem和client-cert.pem的过期时间。可以通过openssl x509 -in file.pem -enddate -noout获取过期日期并编写脚本定期检查。SSL连接数监控在MySQL中执行SHOW STATUS LIKE Ssl%;可以查看SSL相关的状态如Ssl_accepts成功的SSL连接数。监控这个指标可以了解SSL的使用情况。Jumpserver审计日志定期审查Jumpserver中数据库会话的审计日志确保所有连接都通过了预期的授权规则并且没有异常的非SSL连接尝试如果配置了强制SSL。配置Jumpserver与MySQL的SSL加密连接初看步骤繁多但拆解开来就是“生成证书 - 配置MySQL - 配置Jumpserver - 验证”这样一个清晰的过程。这套配置一旦完成就为你的数据库访问构建了一道透明的、强制的安全屏障。它带来的不仅是合规性上的满足更是实打实的安全提升。尤其是在多云、混合云架构下当数据库与堡垒机不在同一个信任域时SSL几乎是必须的选择。花上半天时间按照这份指南彻底搞定它在未来的某次安全巡检或攻防演练中你会感谢现在这个未雨绸缪的自己。