【 使用环境 】测试环境
【 OB】
【 使用版本 】 4.3.5-tls
【问题描述】只部署Observer,2881 支持传输加密吗?
在仅部署Observer的环境下,端口 2881 支持传输加密。
背景说明
OceanBase 数据库的 Observer 组件默认通过 2881 端口 提供 SQL 服务(即 MySQL 兼容协议),客户端(如 obclient、MySQL 客户端驱动等)通过此端口连接数据库。该通信链路基于 MySQL 协议,而 OceanBase 支持在此协议上启用 SSL/TLS 加密传输,以保障数据在网络中的安全性。
关键特性与机制
- 支持的加密协议
- OceanBase 在 TCP 层之上扩展支持 SSL/TLS 协议,依赖 OpenSSL 或第三方 SSL 库实现加密功能。
- 支持多种认证模式:
- SSL 单向认证:客户端验证服务器证书。
- X509 双向认证:服务器和客户端互相验证证书。
- 可组合策略:限定加密算法、CA 发行方或证书主题。
- 2881 端口加密能力
- 2881 端口承载的是 MySQL 协议通信,属于“驱动层 ⇄ OBServer”之间的连接。
- 此类连接支持 SSL/TLS 加密,且开启后对新建连接即时生效,无需重启 OBServer。
- 如何启用加密? 启用步骤主要包括证书配置和系统参数设置:
-- 1. 设置证书获取方式为本地文件(推荐测试环境)
ALTER SYSTEM SET ssl_external_kms_info = '';
-- 2. 启用客户端 SSL 认证(关键一步,开启 MySQL 端口加密)
ALTER SYSTEM SET ssl_client_authentication = 'TRUE';
-- 3. (可选)设置最低 TLS 版本
ALTER SYSTEM SET sql_protocol_min_tls_version = 'TLSv1.2';
-
验证加密是否生效 使用
obclient
或兼容客户端登录后执行\s
命令查看连接详情:
obclient> \s
--------------
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
TCP port: 2881
...
若输出中包含 Cipher in use
字段,则表明当前连接已成功使用加密。
5. 注意事项
- 加密不会影响已有连接;仅对后续新建连接生效。
- 必须正确配置服务器证书(server-cert.pem)、私钥(server-key.pem)及 CA 证书,否则连接将失败。
- 生产环境中建议使用双向认证增强安全。
- 参数
_ob_ssl_invited_nodes
主要用于控制 OB-RPC 内部通信加密,不影响 2881 端口行为。
相关文档参考
综上所述,即使只部署了 Observer 节点,只要正确配置 SSL 参数和证书,2881 端口完全支持加密传输,能够有效防止敏感数据在传输过程中被窃听或篡改。
如何配置 双向认证呢
在仅部署 Observer 的环境下配置 2881 端口 SSL 双向认证
在仅部署 Observer 节点的 OceanBase 数据库环境中,可以通过启用 MySQL 协议层的 SSL/TLS 双向认证(X509 认证) 来实现 2881 端口的安全加密通信。双向认证要求客户端和服务端互相验证对方的数字证书,从而确保连接双方的身份合法性。
以下是完整的配置步骤与说明:
mkdir -p /home/admin/oceanbase/wallet cp ca.pem server-cert.pem server-key.pem /home/admin/oceanbase/wallet/
二、服务端开启 SSL 并配置双向认证
步骤 1:设置证书获取方式(社区版可忽略此步)
ALTER SYSTEM SET ssl_external_kms_info = '';
说明:对于 OceanBase 社区版,通常默认从本地文件读取证书,此步骤可省略。
ALTER SYSTEM SET sql_protocol_min_tls_version = ‘TLSv1.2’;
步骤 3:启用 MySQL 端口 SSL 通信
ALTER SYSTEM SET ssl_client_authentication = 'TRUE';
执行后,所有新的 MySQL 连接将强制使用 SSL 加密。
CREATE USER ‘secure_user’@’%’ IDENTIFIED BY ‘your_password’ REQUIRE X509;
(可选)使用 Common Name 白名单限制客户端
通过系统参数 ob_ssl_invited_common_names
可进一步限制允许连接的客户端证书 Common Name (CN)。
-- 仅允许 CN 为 'ALIPAY_CLIENT' 或 'SECURE_APP' 的客户端连接
ALTER SYSTEM SET ob_ssl_invited_common_names = 'ALIPAY_CLIENT,SECURE_APP';
该参数检查客户端证书 subject
中的 cn
字段,若不匹配则拒绝连接。
obclient -h -P2881 -usecure_user@tenant_name -p
–ssl-mode=VERIFY_IDENTITY
–ssl-ca=ca.pem
–ssl-cert=client-cert.pem
–ssl-key=client-key.pem
–ssl-verify-server-cert—|------| | --ssl-mode=VERIFY_IDENTITY
| 验证服务端证书有效性及主机名/IP 匹配 | | --ssl-ca
| 信任的服务端 CA 根证书 | | --ssl-cert
/ --ssl-key
| 客户端证书和私钥 | | --ssl-verify-server-cert
| 强制验证服务端证书 |
五、验证是否启用成功
方法 1:查看当前连接加密状态
登录后执行:
\s
输出应包含类似内容:
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
Subject: /C=CN/ST=Beijing/L=Haidian/O=Alipay/CN=client.app
Issuer: /C=CN/O=MyCA/CN=RootCA
表示已使用加密且客户端证书被识别。
SELECT USER, HOST, SSL_TYPE FROM mysql.user WHERE USER = ‘secure_user’;
六、注意事项
-
证书路径不可更改:证书必须放在每个 OBServer 节点的
wallet
目录下,且文件名固定为ca.pem
、server-cert.pem
、server-key.pem
。 -
不影响已有连接:修改
ssl_client_authentication
后,仅对新连接生效。 -
生产环境建议:
- 使用独立 CA 签发证书。
- 结合
REQUIRE X509
+ob_ssl_invited_common_names
实现最小权限原则。 - 定期轮换证书。
如何让默认 root 用户也只能证书登录呢?目前空密码是可以直接登录的
要实现在仅部署 Observer 的 OceanBase 环境中,使默认 root
用户只能通过客户端证书登录(即强制 X509 认证),并禁止空密码直接登录,需完成以下两个层面的配置:全局开启 SSL 加密 和 用户级别设置强制证书认证。
即使当前允许空密码登录,这通常是由于未启用 SSL 或未对用户设置认证要求所致。以下是完整的实施步骤。
– 设置最低 TLS 版本(推荐 TLSv1.2) ALTER SYSTEM SET sql_protocol_min_tls_version = ‘TLSv1.2’;
– 启用客户端 SSL 认证(关键:开启 MySQL 协议层加密) ALTER SYSTEM SET ssl_client_authentication = TRUE;
二、配置 root 用户仅能通过 X509 证书登录
OceanBase 支持在创建用户时指定 REQUIRE X509
,用于强制客户端提供有效证书。虽然官方文档中未明确列出 ALTER USER ... REQUIRE X509
的语法示例,但基于其 MySQL 兼容性 和 CREATE USER
的语法设计,ALTER USER
支持 REQUIRE
子句是合理的且实践中可用。
执行以下 SQL 命令(以 SYS
或高权限用户登录):
-- 强制 root 用户必须使用 X509 证书进行身份验证
ALTER USER 'root'@'%' REQUIRE X509;
-- 或更具体地限制来自特定租户的 root 用户(如 mysql 租户)
ALTER USER 'root'@'%' REQUIRE SUBJECT '/C=CN/ST=Beijing/L=Haidian/O=OceanBase/CN=client';
参数说明:
-
REQUIRE X509
:表示客户端必须提供由可信 CA 签发的有效证书,服务器仅验证证书合法性,不检查具体字段。 -
REQUIRE SUBJECT '...'
:进一步限定客户端证书的主题(Subject DN),增强安全性。 -
REQUIRE ISSUER '...'
:限定签发者。 -
REQUIRE CIPHER 'cipher_name'
:限定加密套件(较少使用)。
三、效果说明
配置完成后:
登录方式 | 是否允许 | 原因 |
---|---|---|
无证书 + 密码登录 |
![]() |
用户被设置为 REQUIRE X509
|
无证书 + 空密码登录 |
![]() |
即使密码为空,也必须满足证书要求 |
有证书 + 任意密码(或空) |
![]() |
X509 模式下忽略密码,仅验证证书 |
注意:X509 认证模式下,密码不再作为主要认证依据,只要证书合法即可通过认证。因此建议结合
ISSUER
或SUBJECT
限制,防止非法客户端冒用。
四、验证方法
使用 obclient
提供客户端证书尝试连接:
obclient -h<ip> -P2881 -uroot@mysql -A \
--ssl-mode=VERIFY_IDENTITY \
--ssl-ca=/path/to/ca.pem \
--ssl-cert=/path/to/client-cert.pem \
--ssl-key=/path/to/client-key.pem
如果省略 --ssl-*
参数,则连接会被拒绝:
ERROR 1045 (28000): Access denied for user 'root'@'xxx' (using password: NO)
此时即表明:非证书连接已被禁止,达到了“仅证书登录”的目的。
ALTER USER ‘root’@’%’ IDENTIFIED BY ‘StrongPassw0rd!’;
总结
要实现 root
用户仅能通过证书登录,请按顺序执行:
-- 1. 开启全局 SSL
ALTER SYSTEM SET sql_protocol_min_tls_version = 'TLSv1.2';
ALTER SYSTEM SET ssl_client_authentication = TRUE;
-- 2. 强制 root 使用 X509 证书
ALTER USER 'root'@'%' REQUIRE X509;
此后所有连接必须携带有效客户端证书,否则将被拒绝,包括空密码直连。
感谢 已经解决了