Skip to content

OceanBase 传输加密

TLS/SSL 证书准备

1. 证书类型选择

OceanBase 支持两种证书类型:

  • 自签名证书:适合测试环境,不推荐在生产环境使用
  • CA 签发证书:适合生产环境,由可信 CA 机构签发

2. 证书生成方式

2.1 使用 OpenSSL 生成自签名证书

bash
# 创建证书目录
mkdir -p /home/oceanbase/ssl
cd /home/oceanbase/ssl

# 生成 CA 私钥
openssl genrsa -out ca.key 4096

# 生成 CA 证书
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -subj "/CN=OceanBase CA"

# 生成服务器私钥
openssl genrsa -out server.key 2048

# 生成服务器 CSR
openssl req -new -key server.key -out server.csr -subj "/CN=observer" -addext "subjectAltName = DNS:observer,IP:127.0.0.1,IP:xxx.xxx.xxx.xxx"

# 使用 CA 签署服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256 -extensions v3_ext

# 生成客户端私钥
openssl genrsa -out client.key 2048

# 生成客户端 CSR
openssl req -new -key client.key -out client.csr -subj "/CN=client"

# 使用 CA 签署客户端证书
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650 -sha256

2.2 使用 OCP 生成证书

  1. 登录 OCP 控制台
  2. 在左侧导航栏中选择 "系统管理" > "证书管理"
  3. 点击 "创建证书"
  4. 选择证书类型(自签名或 CA 签发)
  5. 配置证书参数(有效期、密钥长度、Subject 等)
  6. 点击 "生成",下载证书文件

3. 证书文件说明

证书文件用途位置
ca.crtCA 证书,用于验证服务器和客户端证书所有节点
server.crt服务器证书,用于服务器身份认证OceanBase 节点和 OBProxy 节点
server.key服务器私钥,用于加密通信OceanBase 节点和 OBProxy 节点
client.crt客户端证书,用于客户端身份认证客户端
client.key客户端私钥,用于加密通信客户端

4. 证书权限设置

bash
# 设置证书文件权限
chmod 600 /home/oceanbase/ssl/*.key
chmod 644 /home/oceanbase/ssl/*.crt
chmod 644 /home/oceanbase/ssl/*.csr

# 设置证书目录权限
chmod 755 /home/oceanbase/ssl

# 更改证书文件所有者
chown -R oceanbase:oceanbase /home/oceanbase/ssl

配置客户端与 OBProxy 之间的加密

1. OBProxy 配置

编辑 OBProxy 配置文件 obproxy.conf

yaml
# 启用 TLS/SSL
enable_ssl = true

# SSL 证书文件路径
ssl_cert_path = /home/obproxy/ssl/server.crt
ssl_key_path = /home/obproxy/ssl/server.key
ssl_ca_path = /home/obproxy/ssl/ca.crt

# SSL 协议版本
ssl_min_protocol_version = TLSv1.2
ssl_max_protocol_version = TLSv1.3

# SSL 加密套件
ssl_ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256"

# 启用客户端证书验证
ssl_verify_client = optional

2. 客户端配置

2.1 MySQL 客户端配置

bash
# 使用 SSL 连接 OBProxy
mysql -h127.0.0.1 -P2883 -uroot@sys#obcluster -p'root@123' \
  --ssl-ca=/home/client/ssl/ca.crt \
  --ssl-cert=/home/client/ssl/client.crt \
  --ssl-key=/home/client/ssl/client.key \
  --ssl-mode=VERIFY_IDENTITY \
  -A oceanbase

2.2 JDBC 客户端配置

java
// JDBC URL 配置
String url = "jdbc:mysql://obproxy:2883/oceanbase?useSSL=true&requireSSL=true&verifyServerCertificate=true&sslCA=/home/client/ssl/ca.crt&sslCert=/home/client/ssl/client.crt&sslKey=/home/client/ssl/client.key";

// 创建连接
Connection conn = DriverManager.getConnection(url, username, password);

3. 验证加密连接

sql
-- 查看连接是否使用 SSL
SHOW STATUS LIKE 'Ssl_cipher';

-- 查看 SSL 连接详细信息
SHOW SESSION STATUS LIKE 'Ssl%';

配置 OBProxy 与 OceanBase 集群之间的加密

1. OceanBase 集群配置

1.1 修改集群配置

sql
-- 启用 SSL
ALTER SYSTEM SET enable_ssl = true SCOPE = BOTH;

-- 设置 SSL 证书路径
ALTER SYSTEM SET ssl_cert_path = '/home/oceanbase/ssl/server.crt' SCOPE = BOTH;
ALTER SYSTEM SET ssl_key_path = '/home/oceanbase/ssl/server.key' SCOPE = BOTH;
ALTER SYSTEM SET ssl_ca_path = '/home/oceanbase/ssl/ca.crt' SCOPE = BOTH;

-- 设置 SSL 协议版本
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2' SCOPE = BOTH;
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3' SCOPE = BOTH;

-- 设置 SSL 加密套件
ALTER SYSTEM SET ssl_ciphers = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' SCOPE = BOTH;

1.2 重启 Observer 进程

bash
# 重启所有 Observer 进程
obd cluster restart <cluster-name>

2. OBProxy 配置

编辑 OBProxy 配置文件 obproxy.conf

yaml
# 启用与 OceanBase 集群的 SSL 连接
enable_ssl_client = true

# SSL 证书文件路径
ssl_client_cert_path = /home/obproxy/ssl/client.crt
ssl_client_key_path = /home/obproxy/ssl/client.key
ssl_client_ca_path = /home/obproxy/ssl/ca.crt

# SSL 协议版本
ssl_client_min_protocol_version = TLSv1.2
ssl_client_max_protocol_version = TLSv1.3

# SSL 加密套件
ssl_client_ciphers = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"

3. 验证加密连接

sql
-- 查看 OceanBase 节点 SSL 状态
SELECT * FROM oceanbase.__all_virtual_ssl_status;

-- 查看 OBProxy 与 OceanBase 之间的连接状态
SHOW PROCESSLIST;

配置 OceanBase 集群内部加密

1. 集群内部加密配置

sql
-- 启用集群内部 SSL
ALTER SYSTEM SET enable_ssl_internal = true SCOPE = BOTH;

-- 设置内部 SSL 证书路径
ALTER SYSTEM SET ssl_cert_path = '/home/oceanbase/ssl/server.crt' SCOPE = BOTH;
ALTER SYSTEM SET ssl_key_path = '/home/oceanbase/ssl/server.key' SCOPE = BOTH;
ALTER SYSTEM SET ssl_ca_path = '/home/oceanbase/ssl/ca.crt' SCOPE = BOTH;

-- 设置内部 SSL 协议版本
ALTER SYSTEM SET ssl_min_protocol_version = 'TLSv1.2' SCOPE = BOTH;
ALTER SYSTEM SET ssl_max_protocol_version = 'TLSv1.3' SCOPE = BOTH;

-- 设置内部 SSL 加密套件
ALTER SYSTEM SET ssl_ciphers = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' SCOPE = BOTH;

2. 重启 Observer 进程

bash
# 重启所有 Observer 进程
obd cluster restart <cluster-name>

3. 验证内部加密连接

sql
-- 查看集群内部 SSL 状态
SELECT * FROM oceanbase.__all_virtual_ssl_status;

-- 查看节点间连接状态
SELECT * FROM oceanbase.__all_virtual_server_stat WHERE svr_ip = 'xxx.xxx.xxx.xxx';

TLS/SSL 证书管理

1. 证书有效期监控

sql
-- 查看证书有效期
SHOW PARAMETERS LIKE '%ssl%cert%';

-- 使用 OpenSSL 查看证书有效期
openssl x509 -in /home/oceanbase/ssl/server.crt -noout -dates

2. 证书更新流程

  1. 生成新证书:使用相同的 CA 或新 CA 生成新证书
  2. 部署新证书:将新证书部署到所有节点
  3. 更新配置:更新 OceanBase 和 OBProxy 的证书路径配置
  4. 重启服务:重启 OceanBase 节点和 OBProxy 服务
  5. 验证连接:验证客户端和服务端之间的加密连接

3. 证书自动更新

在生产环境中,建议使用自动化工具管理证书更新,如:

  • cert-manager:Kubernetes 环境下的证书管理工具
  • HashiCorp Vault:用于证书生成、存储和自动更新
  • 自定义脚本:定期检查证书有效期并自动更新

性能优化

1. 加密性能影响

启用 TLS/SSL 会对系统性能产生一定影响,主要包括:

  • CPU 消耗增加:加密和解密操作会消耗额外的 CPU 资源
  • 网络延迟增加:加密数据会增加网络传输量
  • 连接建立时间增加:TLS 握手过程会增加连接建立时间

2. 性能优化措施

2.1 硬件优化

  • 使用支持 AES-NI 指令集的 CPU,提高加密性能
  • 增加 CPU 核心数,分摊加密计算负载
  • 使用高速存储设备,提高证书读取性能

2.2 配置优化

sql
-- 选择高效的加密套件
ALTER SYSTEM SET ssl_ciphers = 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256' SCOPE = BOTH;

-- 启用会话复用
ALTER SYSTEM SET ssl_session_cache_size = 10000 SCOPE = BOTH;
ALTER SYSTEM SET ssl_session_timeout = 3600 SCOPE = BOTH;

-- 调整 SSL 缓冲区大小
ALTER SYSTEM SET ssl_buffer_size = 8192 SCOPE = BOTH;

2.3 连接管理优化

  • 使用连接池,减少 TLS 握手次数
  • 调整连接超时时间,避免频繁重建连接
  • 启用长连接,减少连接建立开销

安全最佳实践

1. 证书安全

  • 保护私钥安全:私钥文件权限设置为 600,仅允许所有者访问
  • 定期更换证书:证书有效期建议设置为 1 年,定期更换
  • 使用强密钥长度:推荐使用 2048 位或以上的 RSA 密钥
  • 限制证书用途:根据实际需要设置证书的 Subject Alternative Name

2. 协议安全

  • 禁用旧版本协议:禁用 TLSv1.0 和 TLSv1.1,仅使用 TLSv1.2 和 TLSv1.3
  • 使用安全的加密套件:选择支持前向 secrecy的加密套件
  • 启用证书验证:始终验证服务器证书,避免中间人攻击

3. 配置安全

  • 启用完整的加密链:客户端到 OBProxy、OBProxy 到 OceanBase、OceanBase 内部节点之间都启用加密
  • 使用不同的证书:为客户端、OBProxy 和 OceanBase 集群使用不同的证书
  • 定期审计配置:定期检查加密配置,确保符合安全要求
  • 启用日志记录:记录 SSL 连接信息,便于审计和故障排查

4. 密钥管理

  • 使用硬件安全模块(HSM):将私钥存储在 HSM 中,提高密钥安全性
  • 实现密钥轮换机制:定期更换密钥,减少密钥泄露风险
  • 建立密钥备份策略:安全备份密钥,防止密钥丢失

常见问题(FAQ)

Q1: 启用 TLS/SSL 后连接变慢怎么办?

A1: 启用 TLS/SSL 后连接变慢可能有以下原因:

  • CPU 资源不足:加密操作消耗大量 CPU 资源,建议增加 CPU 核心数
  • 密钥长度过长:使用 2048 位 RSA 密钥即可,不需要更长的密钥
  • 加密套件效率低:选择高效的加密套件,如 ECDHE-RSA-AES256-GCM-SHA384
  • 连接建立频繁:使用连接池,减少 TLS 握手次数
  • 证书验证开销大:优化证书验证过程,或使用证书缓存

Q2: 如何排查 TLS/SSL 连接失败问题?

A2: 排查 TLS/SSL 连接失败问题可以按照以下步骤进行:

  1. 检查证书文件路径和权限是否正确
  2. 检查证书有效期是否过期
  3. 检查证书的 Subject 和 Subject Alternative Name 是否匹配服务器地址
  4. 检查 SSL 协议版本和加密套件是否兼容
  5. 查看 OceanBase 和 OBProxy 日志,查找 SSL 相关错误信息
  6. 使用 OpenSSL 工具测试 SSL 连接:openssl s_client -connect 127.0.0.1:2881 -CAfile /home/client/ssl/ca.crt

Q3: 自签名证书和 CA 签发证书有什么区别?

A3: 自签名证书和 CA 签发证书的主要区别:

  • 信任级别:CA 签发证书由可信 CA 机构签发,客户端默认信任;自签名证书需要手动信任
  • 安全性:CA 签发证书安全性更高,自签名证书容易被伪造
  • 适用场景:自签名证书适合测试环境,CA 签发证书适合生产环境
  • 管理复杂度:自签名证书管理简单,CA 签发证书管理复杂

Q4: 如何在不中断服务的情况下更新证书?

A4: 在不中断服务的情况下更新证书可以按照以下步骤进行:

  1. 生成新证书,确保新证书与旧证书的 Subject 和 Subject Alternative Name 相同
  2. 将新证书部署到所有节点,与旧证书共存
  3. 更新配置,指向新证书路径
  4. 逐个重启 OceanBase 节点和 OBProxy 服务,实现滚动更新
  5. 验证所有节点都使用新证书后,删除旧证书

Q5: 如何监控 TLS/SSL 连接状态?

A5: 可以通过以下方式监控 TLS/SSL 连接状态:

  • OceanBase 内置视图__all_virtual_ssl_status 视图显示 SSL 连接状态
  • OBProxy 日志:OBProxy 日志中包含 SSL 连接信息
  • 监控工具:OCP、Prometheus 等监控工具提供 SSL 连接监控指标
  • OpenSSL 工具:使用 openssl s_client 命令测试 SSL 连接

Q6: 启用 TLS/SSL 后如何支持旧版本客户端?

A6: 支持旧版本客户端可以采取以下措施:

  • 配置兼容的 SSL 协议版本,如同时支持 TLSv1.2 和 TLSv1.3
  • 配置兼容的加密套件,包含旧版本客户端支持的套件
  • 为旧版本客户端提供单独的连接端口,不启用 SSL
  • 升级旧版本客户端,支持最新的 TLS 协议

Q7: 如何配置双向认证?

A7: 配置双向认证需要以下步骤:

  1. 生成客户端证书和服务器证书
  2. 配置服务器验证客户端证书:ssl_verify_client = required
  3. 配置客户端验证服务器证书
  4. 部署客户端证书到所有客户端
  5. 验证双向认证是否生效

Q8: TLS/SSL 与数据加密有什么区别?

A8: TLS/SSL 与数据加密的主要区别:

  • 加密范围:TLS/SSL 加密传输过程中的数据,数据加密加密存储在磁盘上的数据
  • 加密对象:TLS/SSL 加密网络通信,数据加密加密数据库中的数据
  • 实现方式:TLS/SSL 使用公开密钥加密,数据加密使用对称密钥加密
  • 安全目标:TLS/SSL 防止数据在传输过程中被窃听,数据加密防止数据在存储过程中被窃取