外观
TiDB 传输加密
TiDB 传输加密是指对 TiDB 集群中各个组件之间的通信进行加密,防止数据在传输过程中被窃取或篡改。TiDB 支持使用 TLS(Transport Layer Security)协议进行传输加密,包括 TiDB 与客户端、组件之间的所有通信链路。
TLS 证书准备
1. 证书类型
- 根证书(Root CA):用于签发其他证书,是整个证书链的信任源
- 服务器证书:用于验证服务器身份,由根证书签发
- 客户端证书:用于验证客户端身份,由根证书签发(可选)
2. 生成证书
可以使用 OpenSSL 或 cfssl 工具生成 TLS 证书。以下是使用 cfssl 生成证书的示例:
bash
# 安装 cfssl
go install github.com/cloudflare/cfssl/cmd/cfssl@latest
go install github.com/cloudflare/cfssl/cmd/cfssljson@latest
# 创建证书配置文件
cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"tidb": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
EOF
# 创建根证书请求
cat > ca-csr.json << EOF
{
"CN": "TiDB CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"O": "PingCAP",
"OU": "TiDB",
"ST": "Beijing"
}
]
}
EOF
# 生成根证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 创建服务器证书请求
cat > tidb-server-csr.json << EOF
{
"CN": "TiDB Server",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"O": "PingCAP",
"OU": "TiDB",
"ST": "Beijing"
}
],
"hosts": [
"127.0.0.1",
"localhost",
"tidb",
"tidb.local",
"<tidb-ip>"
]
}
EOF
# 生成服务器证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=tidb tidb-server-csr.json | cfssljson -bare tidb-server3. 证书管理
- 证书存储:将证书存储在安全的位置,限制访问权限
- 证书有效期:定期检查证书有效期,提前更新即将过期的证书
- 证书轮换:定期轮换证书,提高安全性
- 证书备份:定期备份证书,防止证书丢失
TiDB 传输加密配置
1. TiDB 服务器加密配置
在 TiDB 配置文件中添加以下配置启用传输加密:
toml
# tidb.toml
[security]
# 启用 TLS
enable-tls = true
# 服务器证书文件路径
ssl-cert = "/path/to/tidb-server.pem"
# 服务器私钥文件路径
ssl-key = "/path/to/tidb-server-key.pem"
# CA 证书文件路径
ssl-ca = "/path/to/ca.pem"
# 要求客户端提供证书(可选)
require-secure-transport = true2. PD 加密配置
在 PD 配置文件中添加以下配置启用传输加密:
toml
# pd.toml
[security]
# 启用 TLS
enable-ssl = true
# 服务器证书文件路径
ssl-cert-path = "/path/to/pd-server.pem"
# 服务器私钥文件路径
ssl-key-path = "/path/to/pd-server-key.pem"
# CA 证书文件路径
ssl-ca-path = "/path/to/ca.pem"3. TiKV 加密配置
在 TiKV 配置文件中添加以下配置启用传输加密:
toml
# tikv.toml
[security]
# 启用 TLS
enable-ssl = true
# 服务器证书文件路径
ssl-cert-path = "/path/to/tikv-server.pem"
# 服务器私钥文件路径
ssl-key-path = "/path/to/tikv-server-key.pem"
# CA 证书文件路径
ssl-ca-path = "/path/to/ca.pem"4. TiFlash 加密配置
在 TiFlash 配置文件中添加以下配置启用传输加密:
toml
# tiflash.toml
[security]
# 启用 TLS
enable_ssl = true
# 服务器证书文件路径
cert_path = "/path/to/tiflash-server.pem"
# 服务器私钥文件路径
key_path = "/path/to/tiflash-server-key.pem"
# CA 证书文件路径
ca_path = "/path/to/ca.pem"5. TiCDC 加密配置
在 TiCDC 配置文件中添加以下配置启用传输加密:
toml
# ticdc.toml
[security]
# 启用 TLS
enable-ssl = true
# 服务器证书文件路径
cert-path = "/path/to/ticdc-server.pem"
# 服务器私钥文件路径
key-path = "/path/to/ticdc-server-key.pem"
# CA 证书文件路径
ca-path = "/path/to/ca.pem"客户端加密连接
1. MySQL 客户端加密连接
使用 MySQL 客户端连接 TiDB 时,添加 --ssl-mode=VERIFY_IDENTITY 参数启用加密连接:
bash
mysql -h <tidb-ip> -P 4000 -u root --ssl-mode=VERIFY_IDENTITY --ssl-ca=/path/to/ca.pem2. TiUP 加密连接
使用 TiUP 连接 TiDB 集群时,需要在 TiUP 配置文件中配置 TLS 证书:
toml
# tiup-cluster.toml
[tidb_servers]
- host = "<tidb-ip>"
port = 4000
status_port = 10080
config = {
security = {
enable-tls = true,
ssl-cert = "/path/to/tidb-server.pem",
ssl-key = "/path/to/tidb-server-key.pem",
ssl-ca = "/path/to/ca.pem"
}
}传输加密最佳实践
1. 启用全链路加密
- 启用 TiDB 集群中所有组件之间的加密通信
- 包括客户端与 TiDB 之间、组件之间的通信
- 确保数据在整个传输过程中都得到保护
2. 使用强加密算法
- 使用 TLS 1.2 或 TLS 1.3 协议
- 使用强加密算法,如 AES-256-GCM
- 禁用弱加密算法和协议
3. 合理管理证书
- 使用专用的证书管理工具管理证书
- 定期轮换证书,建议每 1-2 年轮换一次
- 监控证书有效期,提前更新即将过期的证书
- 限制证书的访问权限,只允许需要的组件访问
4. 验证证书有效性
- 启用证书验证,确保通信双方的身份真实
- 不使用自签名证书或不受信任的证书
- 定期检查证书的完整性和有效性
5. 监控加密通信
- 监控加密通信的性能影响
- 监控证书的使用情况和状态
- 及时发现和处理加密通信中的问题
6. 测试加密配置
- 在测试环境中测试加密配置的有效性
- 测试加密通信的性能影响
- 测试证书轮换过程
传输加密性能影响
启用传输加密会对 TiDB 集群的性能产生一定影响,主要表现为:
- CPU 使用率增加:加密和解密操作需要消耗 CPU 资源
- 延迟略有上升:加密和解密操作会增加通信延迟
- 吞吐量略有下降:加密和解密操作会影响通信吞吐量
可以通过以下方式减轻性能影响:
- 使用性能更好的 CPU
- 增加集群节点数量,分担加密和解密的负载
- 使用 TLS 1.3 协议,其性能比 TLS 1.2 更好
- 合理配置加密参数
证书轮换
1. 证书轮换步骤
2.1 生成新证书
使用相同的 CA 或新的 CA 生成新的证书。
2.2 配置新证书
将新证书复制到各个组件的证书目录中。
2.3 滚动更新组件
逐个重启组件,使用新证书:
bash
# 滚动更新 TiDB 节点
tiup cluster reload <cluster-name> -R tidb --rolling
# 滚动更新 PD 节点
tiup cluster reload <cluster-name> -R pd --rolling
# 滚动更新 TiKV 节点
tiup cluster reload <cluster-name> -R tikv --rolling
# 滚动更新 TiFlash 节点
tiup cluster reload <cluster-name> -R tiflash --rolling
# 滚动更新 TiCDC 节点
tiup cluster reload <cluster-name> -R ticdc --rolling2.4 验证证书轮换结果
验证各个组件是否成功使用新证书:
bash
# 查看 TiDB 证书信息
openssl s_client -connect <tidb-ip>:4000 -CAfile /path/to/ca.pem | openssl x509 -noout -dates
# 查看 PD 证书信息
curl --cacert /path/to/ca.pem --cert /path/to/client.pem --key /path/to/client-key.pem https://<pd-ip>:2379/health
# 查看 TiKV 证书信息
tikv-ctl status --host <tikv-ip>:20160 --ca-path /path/to/ca.pem --cert-path /path/to/client.pem --key-path /path/to/client-key.pem常见问题(FAQ)
Q1: 传输加密会影响 TiDB 集群的性能吗?
A1: 启用传输加密会对 TiDB 集群的性能产生一定影响,主要表现为 CPU 使用率增加、延迟略有上升和吞吐量略有下降。可以通过使用性能更好的 CPU、增加集群节点数量、使用 TLS 1.3 协议等方式减轻性能影响。
Q2: 如何验证传输加密是否生效?
A2: 可以通过以下方式验证传输加密是否生效:
- 使用
openssl s_client命令检查 TiDB 端口的加密状态 - 查看 TiDB 日志,确认是否启用了 TLS
- 使用
curl命令检查 PD API 的加密状态 - 查看各组件的配置文件,确认 TLS 配置是否正确
Q3: 如何管理多个 TiDB 集群的证书?
A3: 可以使用以下方式管理多个 TiDB 集群的证书:
- 使用专用的证书管理工具,如 HashiCorp Vault
- 为每个集群创建独立的证书链
- 定期检查和轮换所有集群的证书
- 建立统一的证书管理流程
Q4: 证书过期了怎么办?
A4: 如果证书过期了,需要重新生成证书并更新到各个组件。建议在证书过期前 30 天开始准备更新,避免证书过期导致集群不可用。
Q5: 可以使用自签名证书吗?
A5: 可以使用自签名证书进行测试,但不建议在生产环境中使用。生产环境中建议使用由可信 CA 签发的证书,或者建立自己的 CA 体系。
Q6: 如何启用客户端证书认证?
A6: 可以在 TiDB 配置文件中添加 require-secure-transport = true 和 ssl-verify-cn = true 参数启用客户端证书认证。客户端需要提供有效的证书才能连接到 TiDB。
