TiDB 安全配置最佳实践

TiDB 的安全性对于保护数据完整性和机密性至关重要。本文提供了 TiDB 集群部署时的安全配置指南。遵循这些最佳实践可以有效降低潜在安全风险、防范数据泄露,并确保 TiDB 数据库系统能够持续稳定、可靠地运行。

设置 root 用户初始密码

默认情况下,新创建的 TiDB 集群中 root 用户的密码为空,这可能导致潜在的安全风险。任何人都可以尝试使用 root 用户登录 TiDB 数据库,从而可能访问和修改数据。

为避免此风险,建议在部署过程中设置 root 密码:

启用密码复杂性检查

默认情况下,TiDB 未启用密码复杂性策略,这可能导致使用弱密码或空密码,增加安全风险。

为确保数据库用户创建强密码,建议配置合理的密码复杂度策略。例如,要求密码包含大写字母、小写字母、数字和特殊字符的组合。启用密码复杂性检查可以提高数据库的安全性、防止暴力破解攻击、减少内部威胁、遵守法规和合规性要求、降低数据泄露风险,并提高整体安全水平。

修改 Grafana 默认密码

TiDB 安装时默认包含 Grafana 组件,其默认的用户名密码通常为 admin/admin。如不及时修改,可能被攻击者利用获取系统控制权。

建议在部署 TiDB 时立即将 Grafana 的密码修改为强密码,并定期更新密码以确保系统安全。修改 Grafana 密码的方式如下:

  • 首次登录 Grafana 时,根据提示完成新密码的修改。

    Grafana Password Reset Guide

  • 进入 Grafana 个人配置中心完成新密码的修改。

    Grafana Password Reset Guide

提高 TiDB Dashboard 安全性

使用最小权限用户

TiDB Dashboard 的账号体系与 TiDB SQL 用户一致,并基于 TiDB SQL 用户的权限进行 TiDB Dashboard 授权验证。TiDB Dashboard 所需的权限较少,甚至可以只有只读权限。

为提高系统安全性,建议为访问 TiDB Dashboard 创建一个最小权限的 SQL 用户,并用该用户登录 TiDB Dashboard,避免使用高权限用户,提升安全性。

限制访问控制

默认情况下,TiDB Dashboard 设计为供受信任的用户访问。默认端口将包含除 TiDB Dashboard 外的其他 API 接口。如果你希望让外部网络用户或不受信任的用户访问 TiDB Dashboard,需要采取以下的措施以避免安全漏洞的出现:

  • 使用防火墙等手段将默认的 2379 端口限制在可信域内,禁止外部用户进行访问。

  • 配置反向代理,将 TiDB Dashboard 服务在另一个端口上安全地提供给外部。

保护内部端口

TiDB 的默认安装中存在许多用于组件间通信的特权接口。这些端口通常不需要向用户端开放,因为它们主要用于内部通信。当这些端口直接暴露在公共网络上时,会增加潜在的攻击面,违反了安全最小化原则,增加了安全风险的产生。下表列出了 TiDB 集群默认监听端口的详细情况:

组件默认监听端口协议
TiDB4000MySQL
TiDB10080HTTP
TiKV20160Protocol
TiKV20180HTTP
PD2379HTTP/Protocol
PD2380Protocol
TiFlash3930Protocol
TiFlash20170Protocol
TiFlash20292HTTP
TiFlash8234HTTP
TiFlow8261/8291HTTP
TiFlow8262HTTP
TiFlow8300HTTP
TiDB Lightning8289HTTP
TiDB Operator6060HTTP
TiDB Dashboard2379HTTP
TiDB Binlog8250HTTP
TiDB Binlog8249HTTP
TMS8082HTTP
TEM8080HTTP
TEM8000HTTP
TEM4110HTTP
TEM4111HTTP
TEM4112HTTP
TEM4113HTTP
TEM4124HTTP
Prometheus9090HTTP
Grafana3000HTTP
AlertManager9093HTTP
AlertManager9094Protocol
Node Exporter9100HTTP
Blackbox Exporter9115HTTP
NG Monitoring12020HTTP

建议向普通用户只公开数据库的 4000 端口和 Grafana 面板的 9000 端口,并通过网络安全策略组或防火墙限制其他端口。以下是使用 iptables 限制端口访问的示例:

# 允许来自各组件白名单 IP 地址范围的内部端口通讯 sudo iptables -A INPUT -s 内网 IP 地址范围 -j ACCEPT # 仅对外部用户开放 4000 和 9000 端口 sudo iptables -A INPUT -p tcp --dport 4000 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 9000 -j ACCEPT # 默认拒绝所有其他流量 sudo iptables -P INPUT DROP

如果需要访问 TiDB Dashboard,建议通过配置反向代理的方式将 TiDB Dashboard 服务安全地提供给外部网络,并将其部署在另外的端口上。

解决第三方扫描器 MySQL 漏洞误报

大多数漏洞扫描器在检测 MySQL 漏洞时,会根据版本信息来匹配 CVE 漏洞。由于 TiDB 仅兼容 MySQL 协议而非 MySQL 本身,基于版本信息的漏洞扫描可能导致误报。建议漏洞扫描应以原理扫描为主。当合规漏洞扫描工具要求 MySQL 版本时,你可以修改服务器版本号,以满足其要求。

通过修改服务器版本号,可避免漏洞扫描器产生误报。server-version 的值会被 TiDB 节点用于验证当前 TiDB 的版本。在进行 TiDB 集群升级前,请将 server-version 的值设置为空或者当前 TiDB 真实的版本值,避免出现非预期行为。

文档内容是否有帮助?