diff --git a/TOC.md b/TOC.md index 9e518ea1e724..8bd53e78e1b1 100644 --- a/TOC.md +++ b/TOC.md @@ -55,6 +55,14 @@ - [如何根据类型或 DDL 内容过滤 binlog 事件](/filter-binlog-event.md) - [如何通过 SQL 表达式过滤 DML binlog 事件](/filter-dml-event.md) - 运维操作 + - 安全加固 + - [TiDB 安全配置最佳实践](/best-practices-for-security-configuration.md) + - [为 TiDB 客户端服务端间通信开启加密传输](/enable-tls-between-clients-and-servers.md) + - [为 TiDB 组件间通信开启加密传输](/enable-tls-between-components.md) + - [生成自签名证书](/generate-self-signed-certificates.md) + - [静态加密](/encryption-at-rest.md) + - [为 TiDB 落盘文件开启加密](/enable-disk-spill-encrypt.md) + - [日志脱敏](/log-redaction.md) - 升级 TiDB 版本 - [使用 TiUP 升级](/upgrade-tidb-using-tiup.md) - [使用 TiDB Operator](https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/upgrade-a-tidb-cluster) @@ -464,13 +472,6 @@ - [TiKV 面板](/grafana-tikv-dashboard.md) - [TiFlash 监控指标](/tiflash/monitor-tiflash.md) - [TiCDC 监控指标](/ticdc/monitor-ticdc.md) - - 安全加固 - - [为 TiDB 客户端服务端间通信开启加密传输](/enable-tls-between-clients-and-servers.md) - - [为 TiDB 组件间通信开启加密传输](/enable-tls-between-components.md) - - [生成自签名证书](/generate-self-signed-certificates.md) - - [静态加密](/encryption-at-rest.md) - - [为 TiDB 落盘文件开启加密](/enable-disk-spill-encrypt.md) - - [日志脱敏](/log-redaction.md) - 权限 - [与 MySQL 安全特性差异](/security-compatibility-with-mysql.md) - [权限管理](/privilege-management.md) diff --git a/best-practices-for-security-configuration.md b/best-practices-for-security-configuration.md new file mode 100644 index 000000000000..9e2f9eab63c6 --- /dev/null +++ b/best-practices-for-security-configuration.md @@ -0,0 +1,117 @@ +--- +title: TiDB 安全配置最佳实践 +summary: 介绍 TiDB 安全配置的最佳实践,帮助你降低潜在的安全风险。 +--- + +# TiDB 安全配置最佳实践 + +TiDB 的安全性对于保护数据完整性和机密性至关重要。本文提供了 TiDB 集群部署时的安全配置指南。遵循这些最佳实践可以有效降低潜在安全风险、防范数据泄露,并确保 TiDB 数据库系统能够持续稳定、可靠地运行。 + +> **注意:** +> +> 本文提供关于 TiDB 安全配置的一般建议。PingCAP 不保证信息的完整性或准确性,对使用本指南所产生的任何问题不承担责任。用户应根据自身需求评估这些建议,并咨询专业人士以获得具体的建议。 + +## 设置 root 用户初始密码 + +默认情况下,新创建的 TiDB 集群中 root 用户的密码为空,这可能导致潜在的安全风险。任何人都可以尝试使用 root 用户登录 TiDB 数据库,从而可能访问和修改数据。 + +为避免此风险,建议在部署过程中设置 root 密码: + +- 使用 TiUP 部署时,参考[使用 TiUP 部署 TiDB 集群](/production-deployment-using-tiup.md#第-7-步启动集群)为 root 用户生成随机密码。 +- 使用 TiDB Operator 部署时,参考[初始化账号和密码设置](https://docs.pingcap.com/zh/tidb-in-kubernetes/stable/initialize-a-cluster#初始化账号和密码设置)为 root 用户设置密码。 + +## 修改 Grafana 默认密码 + +TiDB 安装时默认包含 Grafana 组件,其默认的用户名密码通常为 `admin/admin`。如不及时修改,可能被攻击者利用获取系统控制权。 + +建议在部署 TiDB 时立即将 Grafana 的密码修改为强密码,并定期更新密码以确保系统安全。修改 Grafana 密码的方式如下: + +- 首次登录 Grafana 时,根据提示完成新密码的修改。 + + ![Grafana Password Reset Guide](/media/grafana-password-reset1.png) + +- 进入 Grafana 个人配置中心完成新密码的修改。 + + ![Grafana Password Reset Guide](/media/grafana-password-reset2.png) + +## 提高 TiDB Dashboard 安全性 + +### 使用最小权限用户 + +TiDB Dashboard 的账号体系与 TiDB SQL 用户一致,并基于 TiDB SQL 用户的权限进行 TiDB Dashboard 授权验证。TiDB Dashboard 所需的权限较少,甚至可以只有只读权限。 + +为提高系统安全性,建议为访问 TiDB Dashboard 创建一个[最小权限的 SQL 用户](/dashboard/dashboard-user.md),并用该用户登录 TiDB Dashboard,避免使用高权限用户,提升安全性。 + +### 限制访问控制 + +默认情况下,TiDB Dashboard 设计为供受信任的用户访问。默认端口将包含除 TiDB Dashboard 外的其他 API 接口。如果你希望让外部网络用户或不受信任的用户访问 TiDB Dashboard,需要采取以下的措施以避免安全漏洞的出现: + +- 使用防火墙等手段将默认的 `2379` 端口限制在可信域内,禁止外部用户进行访问。 + + > **注意:** + > + > TiDB、TiKV 等组件需要通过 PD Client 端口与 PD 组件进行通信。请勿对组件内部网络阻止访问,这将导致集群不可用。 + +- [配置反向代理](/dashboard/dashboard-ops-reverse-proxy.md#通过反向代理使用-tidb-dashboard),将 TiDB Dashboard 服务在另一个端口上安全地提供给外部。 + +## 保护内部端口 + +TiDB 的默认安装中存在许多用于组件间通信的特权接口。这些端口通常不需要向用户端开放,因为它们主要用于内部通信。当这些端口直接暴露在公共网络上时,会增加潜在的攻击面,违反了安全最小化原则,增加了安全风险的产生。下表列出了 TiDB 集群默认监听端口的详细情况: + +| 组件 | 默认监听端口 | 协议 | +|-------------------|--------------|------------| +| TiDB | 4000 | MySQL | +| TiDB | 10080 | HTTP | +| TiKV | 20160 | Protocol | +| TiKV | 20180 | HTTP | +| PD | 2379 | HTTP/Protocol| +| PD | 2380 | Protocol | +| TiFlash | 3930 | Protocol | +| TiFlash | 20170 | Protocol | +| TiFlash | 20292 | HTTP | +| TiFlash | 8234 | HTTP | +| TiFlow | 8261/8291 | HTTP | +| TiFlow | 8262 | HTTP | +| TiFlow | 8300 | HTTP | +| TiDB Lightning | 8289 | HTTP | +| TiDB Operator | 6060 | HTTP | +| TiDB Dashboard | 2379 | HTTP | +| TiDB Binlog | 8250 | HTTP | +| TiDB Binlog | 8249 | HTTP | +| TMS | 8082 | HTTP | +| TEM | 8080 | HTTP | +| TEM | 8000 | HTTP | +| TEM | 4110 | HTTP | +| TEM | 4111 | HTTP | +| TEM | 4112 | HTTP | +| TEM | 4113 | HTTP | +| TEM | 4124 | HTTP | +| Prometheus | 9090 | HTTP | +| Grafana | 3000 | HTTP | +| AlertManager | 9093 | HTTP | +| AlertManager | 9094 | Protocol | +| Node Exporter | 9100 | HTTP | +| Blackbox Exporter | 9115 | HTTP | +| NG Monitoring | 12020 | HTTP | + +建议向普通用户只公开数据库的 `4000` 端口和 Grafana 面板的 `9000` 端口,并通过网络安全策略组或防火墙限制其他端口。以下是使用 `iptables` 限制端口访问的示例: + +```shell +# 允许来自各组件白名单 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,建议通过[配置反向代理](/dashboard/dashboard-ops-reverse-proxy.md#通过反向代理使用-tidb-dashboard)的方式将 TiDB Dashboard 服务安全地提供给外部网络,并将其部署在另外的端口上。 + +## 解决第三方扫描器 MySQL 漏洞误报 + +大多数漏洞扫描器在检测 MySQL 漏洞时,会根据版本信息来匹配 CVE 漏洞。由于 TiDB 仅兼容 MySQL 协议而非 MySQL 本身,基于版本信息的漏洞扫描可能导致误报。建议漏洞扫描应以原理扫描为主。当合规漏洞扫描工具要求 MySQL 版本时,你可以[修改服务器版本号](/faq/high-reliability-faq.md#我们的安全漏洞扫描工具对-mysql-version-有要求tidb-是否支持修改-server-版本号呢),以满足其要求。 + +通过修改服务器版本号,可避免漏洞扫描器产生误报。[`server-version`](/tidb-configuration-file.md#server-version) 的值会被 TiDB 节点用于验证当前 TiDB 的版本。在进行 TiDB 集群升级前,请将 `server-version` 的值设置为空或者当前 TiDB 真实的版本值,避免出现非预期行为。 diff --git a/media/grafana-password-reset1.png b/media/grafana-password-reset1.png new file mode 100644 index 000000000000..b8559c659cf7 Binary files /dev/null and b/media/grafana-password-reset1.png differ diff --git a/media/grafana-password-reset2.png b/media/grafana-password-reset2.png new file mode 100644 index 000000000000..0c7c604d0fda Binary files /dev/null and b/media/grafana-password-reset2.png differ