Skip to content

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-server

3. 证书管理

  • 证书存储:将证书存储在安全的位置,限制访问权限
  • 证书有效期:定期检查证书有效期,提前更新即将过期的证书
  • 证书轮换:定期轮换证书,提高安全性
  • 证书备份:定期备份证书,防止证书丢失

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 = true

2. 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.pem

2. 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 --rolling

2.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 = truessl-verify-cn = true 参数启用客户端证书认证。客户端需要提供有效的证书才能连接到 TiDB。