一、背景
PD组件存储的是TiKV的元数据信息,pd在启动时没有指定证书校验(--cacert 参数),并且没有通过防火墙等实施访问控制,PD组件的接口和数据就会直接暴露给外部,导致未授权访问漏洞。如果这些接口能够被未经认证的用户访问,那么就意味着存在安全风险。
而熟悉TiDB的小伙伴都知道,开启TLS时会对集群进行停机操作,对于一些业务场景,希望不停机开启TLS,对于此需求,可以利用CDC切换来实现开启TLS不停机。
二、环境准备
准备两套TiDB集群,使用CDC搭建主备集群,创建changefeed,保证数据同步。
集群拓扑如下:


三、操作步骤
1、进行灾备切换
通过CDC进行灾备切换,详细内容请参考:https://pingkai.cn/docs/pingkaidb/stable/ticdc-overview/
确保应用都连接到灾备集群,主集群无应用连接
2、停止cdc ,pause changefeed,记录tso
执行cdc pause ,记录tso,后面创建cdc链路需要加上此tso
./cdc cli changefeed pause -c up-cdc
3、原主集群进行开启tls
缩容pd为1个,如果集群有5个pd,则需要缩容4个
tiup cluster scale-in tidb-test -N IP1:Port,IP2:Port
4、开启tls
在主集群上执行开启tls命令
tiup cluster tls tidb-test enable --wait-timeout 500
#确保Reload PD Members 执行成功,否则后续扩容pd会失败。

5、确保pd开启tls成功,可以用如下命令验证:
tiup ctl:v8.5.3 pd -u https://ip:2379 member --cacert /home/tidb/.tiup/storage/cluster/clusters/tidb-test/tls/ca.crt --cert /home/tidb/.tiup/storage/cluster/clusters/tidb-test/tls/client.crt --key /home/tidb/.tiup/storage/cluster/clusters/tidb-test/tls/client.pem
查看输出内容,是否已经带证书了,member显示的 “https”,否则后期扩容pd会失败

如果开启TLS过程中失败了,需要执行disable命令,在重新开启tls即可
tiup cluster tls tidb-test disable
6、扩容pd节点
扩容pd为3个
tiup cluster scale-out tidb-test ./scale-out.yaml
7、创建changefeed,带上证书
将ca证书传到cdc服务器上
创建changefeed时,需要加上证书,并指定「步骤2」的tso
./cdc cli changefeed create \
--server=http://IP:8300 \
--sink-uri="mysql://root:123456@127.0.0.1:4000/?ssl-ca=ca.crt&ssl-cert=client.crt&ssl-key=client.pem" \
--changefeed-id="simple-tls-task" --start-ts xxx
cdc上游开tls,需要在全局加 --cacert --cert --key;
下游开tls,需要加上下游的证书,写在 --sink-uri参数里
上下游都开tls,里外都要加证书参数
8、进行灾备切换
重复上述步骤「2-7」,将灾备集群也启用TLS
9、业务验证
业务测进行验证,相比之前,需要加上证书来连接,否则会连不上。
四、总结
1、需要加固pd组件,可以开启TLS;
2、想要保持停机时间最短,可以采用CDC灾备切换方式,轮流开始TLS。