Observer的2881有传输加密吗

【 使用环境 】测试环境
【 OB】
【 使用版本 】 4.3.5-tls
【问题描述】只部署Observer,2881 支持传输加密吗?

在仅部署Observer的环境下,端口 2881 支持传输加密

背景说明

OceanBase 数据库的 Observer 组件默认通过 2881 端口 提供 SQL 服务(即 MySQL 兼容协议),客户端(如 obclient、MySQL 客户端驱动等)通过此端口连接数据库。该通信链路基于 MySQL 协议,而 OceanBase 支持在此协议上启用 SSL/TLS 加密传输,以保障数据在网络中的安全性。

关键特性与机制

  1. 支持的加密协议
  • OceanBase 在 TCP 层之上扩展支持 SSL/TLS 协议,依赖 OpenSSL 或第三方 SSL 库实现加密功能。
  • 支持多种认证模式:
    • SSL 单向认证:客户端验证服务器证书。
    • X509 双向认证:服务器和客户端互相验证证书。
    • 可组合策略:限定加密算法、CA 发行方或证书主题。
  1. 2881 端口加密能力
  • 2881 端口承载的是 MySQL 协议通信,属于“驱动层 ⇄ OBServer”之间的连接。
  • 此类连接支持 SSL/TLS 加密,且开启后对新建连接即时生效,无需重启 OBServer
  1. 如何启用加密? 启用步骤主要包括证书配置和系统参数设置:
-- 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';
  1. 验证加密是否生效 使用 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 加密。

来源:OBServer 传输加密 → 开启方式

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 字段,若不匹配则拒绝连接。

来源:ob_ssl_invited_common_names

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.pemserver-cert.pemserver-key.pem
  • 不影响已有连接:修改 ssl_client_authentication 后,仅对新连接生效。
  • 生产环境建议
    • 使用独立 CA 签发证书。
    • 结合 REQUIRE X509 + ob_ssl_invited_common_names 实现最小权限原则。
    • 定期轮换证书。
1 个赞

如何让默认 root 用户也只能证书登录呢?目前空密码是可以直接登录的

https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000003976927
传输加密配置参数这篇文档

要实现在仅部署 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;

:white_check_mark: 二、配置 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':限定加密套件(较少使用)。

:books: 参考语法:CREATE USER - REQUIRE 子句

:white_check_mark: 三、效果说明

配置完成后:

登录方式 是否允许 原因
无证书 + 密码登录 :x: 拒绝 用户被设置为 REQUIRE X509
无证书 + 空密码登录 :x: 拒绝 即使密码为空,也必须满足证书要求
有证书 + 任意密码(或空) :white_check_mark: 允许 X509 模式下忽略密码,仅验证证书

:warning: 注意:X509 认证模式下,密码不再作为主要认证依据,只要证书合法即可通过认证。因此建议结合 ISSUERSUBJECT 限制,防止非法客户端冒用。

:white_check_mark: 四、验证方法

使用 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!’;

:paperclip: 总结

要实现 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;

:white_check_mark: 此后所有连接必须携带有效客户端证书,否则将被拒绝,包括空密码直连。

官方参考:CREATE USER 语法
相关配置项:ssl_client_authentication

感谢 已经解决了