背景
漏洞扫描软件扫描TiDB数据库时,经常会扫出PD API未授权访问漏洞的问题。针对此类问题,本文总结了几种解决方案供参考。
PD组件存储的是TiKV的元数据信息,pd在启动时没有指定证书校验(--cacert 参数),并且没有通过防火墙等实施访问控制,PD组件的接口和数据就会直接暴露给外部,导致未授权访问漏洞。如果这些接口能够被未经认证的用户访问,那么就意味着存在安全风险。
加固方案
本文介绍三种加固方案,方法如下:(本文只针对方案一、方案二提供详细步骤)
1、TiDB 集群开启 TLS
开启 TLS 后组件间通信会被加密,访问组件或工具需提供访问证书,主要共涉及以下组件及工具
- TiDB 与 TiKV、PD
- TiKV 与 PD
- TiDB Control 与 TiDB,TiKV Control 与 TiKV,PD Control 与 PD
- TiKV、PD、TiDB 各自集群内内部通讯
- Dashboard、TiDB Lightning、BR
需注意:开启 TLS 需要扩缩容 PD 节点,并重启整个集群。 目前暂不支持只开启其中部分组件的加密传输。 该方案会对集群造成短时间业务不可用,后续工具及监控需要提供加密证书才可正常使用,会增加一定运维成本,开启该功能建议集群版本为6.5及以上。
2、修改 PD 端口
漏扫软件只扫描2379端口,也可以只修改PD端口号,临时应对漏扫工作。
通过对集群的 PD 节点进行扩缩容,来实现修改集群 PD 端口。
该方案不影响集群正常对外访问,但可能会有轻微性能影响,仅用来避免漏洞检测程序发现该风险。
3、设置防火墙策略
- 网络层面设置防火墙策略,配置访问控制策略,限制IP访问,杜绝未认证登录访问。
- 开启操作系统iptables,配置白名单,内部节点可访问pd节点。
该方案对集群没有任何影响,一般推荐使用网络层面配置访问控制策略。
加固方案实施
《方案一》TiDB 集群开启 TLS 步骤(v6.5)
1、查看集群状态
tiup cluster display tidb-test
2、缩容 PD
开启 TLS 需要缩容其他两个 PD,只保留 PD Leader 节点
tiup cluster scale-in tidb-test -N 192.168.1.11:2379,192.168.1.12:2379
3、开启 TLS
tiup cluster tls tidb-test enable
注意:此过程会自动重启集群,业务无法访问!!!
4、PD-CTL 访问测试
使用 pd-ctl http 无认证登录执行命令会报错
tiup ctl:v6.5.5 pd -u https://192.168.1.13:2379 config show
使用pd-ctl https 认证登录执行命令成功
tiup ctl:v6.5.5 pd -u https://192.168.1.13:2379 --cacert=/root/.tiup/storage/cluster/clusters/tidb-test/tls/ca.crt --key=/root/.tiup/storage/cluster/clusters/tidb-test/tls/client.pem --cert=/root/.tiup/storage/cluster/clusters/tidb-test/tls/client.crt config show
5、Dashboard 访问
若浏览器未安装证书则无法正常使用 Dashboard
安装步骤以 Chorem 浏览器为例
点击设置-隐私安全-安全-管理证书-导入
默认密码:tiup
6、Grafana和Prometheus
这两个组件未开启 TLS,可以正常访问。
7、扩容 PD 节点
编写原 PD 配置文件
cat scale-out-pd.yaml
pd_servers:
- host: 192.168.1.11
ssh_port: 22
name: pd_ip-192.168.1.11
client_port: 2379
peer_port: 2380
deploy_dir: /tidb-data1/pd/tidb-deploy/pd-2379
data_dir: /tidb-data1/pd/tidb-data/pd-2379/data.pd
log_dir: /tidb-data1/pd/tidb-deploy/pd-2379/log
- host: 192.168.1.12
ssh_port: 22
name: pd_ip-192.168.1.12
client_port: 2379
peer_port: 2380
deploy_dir: /tidb-data1/pd/tidb-deploy/pd-2379
data_dir: /tidb-data1/pd/tidb-data/pd-2379/data.pd
log_dir: /tidb-data1/pd/tidb-deploy/pd-2379/log
扩容 PD
tiup cluster scale-out tidb-test scale-out-pd.yaml
《方案二》修改 PD 端口号
1、扩容新端口 PD 节点
编写扩容配置文件,注意修改端口及目录,如修改2979和2980
vi scale-out-pd.yml
pd_servers:
- host: 192.168.1.11
ssh_port: 22
name: pd_ip-192.168.1.11-2979
client_port: 2979
peer_port: 2980
deploy_dir: /tidb-data1/pd/tidb-deploy/pd-2979
data_dir: /tidb-data1/pd/tidb-data/pd-2979/data.pd
log_dir: /tidb-data1/pd/tidb-deploy/pd-2979/log
- host: 192.168.1.12
ssh_port: 22
name: pd_ip-192.168.1.12-2979
client_port: 2979
peer_port: 2980
deploy_dir: /tidb-data1/pd/tidb-deploy/pd-2979
data_dir: /tidb-data1/pd/tidb-data/pd-2979/data.pd
log_dir: /tidb-data1/pd/tidb-deploy/pd-2979/log
- host: 192.168.1.13
ssh_port: 22
name: pd_ip-192.168.1.13-2979
client_port: 2979
peer_port: 2980
deploy_dir: /tidb-data1/pd/tidb-deploy/pd-2979
data_dir: /tidb-data1/pd/tidb-data/pd-2979/data.pd
log_dir: /tidb-data1/pd/tidb-deploy/pd-2979/log
2、扩容 PD
tiup cluster scale-out tidb-test scale-out-pd.yaml -uroot -p
扩容后,每个 PD 节点各有两个端口的 PD。
3、切换 PD Leader 和 Dashboard 到新端口 PD
tiup ctl:v6.5.5 pd -u https://192.168.1.13:2379 -i
切换 PD leader,可能会对业务响应造成轻微影响
member leader transfer pd_ip-192.168.1.13-2979
切换 dashboard 服务到新 PD
config set dashboard-address http://192.168.1.13:2979
切换 TiDB Dashboard 将会丢失之前 TiDB Dashboard 实例所存储的本地数据,包括流量可视化历史、历史搜索记录等。
查看pd成员
member
4、检查集群当前状态
tiup cluster display tidb-test
5、缩容端口号为2379的 PD 节点
tiup cluster scale-in tidb-test --node 192.168.1.11:2379,192.168.1.12:2379,192.168.1.13:2379