Skip to content

TiDB IP 白名单配置

IP 白名单是 TiDB 数据库的重要安全功能,用于限制哪些 IP 地址可以访问 TiDB 数据库。通过配置 IP 白名单,可以有效防止未授权访问,提高数据库的安全性。

IP 白名单配置

1. 全局 IP 白名单配置

在 TiDB 配置文件中,可以设置全局 IP 白名单:

toml
# tidb.toml
[security]
# 全局 IP 白名单,多个 IP 或 CIDR 用逗号分隔
# 格式:"192.168.1.0/24,10.0.0.1,127.0.0.1"
# 空字符串表示允许所有 IP 访问
ip-whitelist = "127.0.0.1,192.168.1.0/24"

2. 基于用户的 IP 白名单配置

TiDB 支持为不同用户设置不同的 IP 白名单:

sql
-- 创建用户并设置 IP 白名单
CREATE USER 'user1'@'%' IDENTIFIED BY 'password' WITH MAX_USER_CONNECTIONS 10;
-- 为用户设置 IP 白名单
GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%' REQUIRE IP '192.168.1.0/24,10.0.0.1';

-- 修改用户的 IP 白名单
ALTER USER 'user1'@'%' REQUIRE IP '192.168.1.0/24,10.0.0.1,172.16.0.0/16';

-- 查看用户的 IP 白名单
SHOW GRANTS FOR 'user1'@'%';

3. 动态修改 IP 白名单

TiDB 支持在运行时动态修改 IP 白名单,无需重启服务:

sql
-- 动态修改全局 IP 白名单
SET GLOBAL tidb_ip_whitelist = '127.0.0.1,192.168.1.0/24,10.0.0.1';

-- 查看当前全局 IP 白名单
SELECT @@global.tidb_ip_whitelist;

IP 白名单格式

TiDB IP 白名单支持以下格式:

1. 单个 IP 地址

192.168.1.1
10.0.0.1

2. CIDR 格式

192.168.1.0/24
10.0.0.0/8
172.16.0.0/16

3. 多个地址用逗号分隔

127.0.0.1,192.168.1.0/24,10.0.0.1

IP 白名单管理

1. 查看当前 IP 白名单

sql
-- 查看全局 IP 白名单
SELECT @@global.tidb_ip_whitelist;

-- 查看会话 IP 白名单
SELECT @@session.tidb_ip_whitelist;

2. 测试 IP 白名单

可以使用以下方法测试 IP 白名单是否生效:

bash
# 从允许的 IP 访问 TiDB
mysql -h <tidb-ip> -P 4000 -u root -p

# 从禁止的 IP 访问 TiDB(应该失败)
mysql -h <tidb-ip> -P 4000 -u root -p

3. IP 白名单日志

当 IP 访问被拒绝时,TiDB 会在日志中记录相关信息:

[2023/01/01 12:00:00.000 +08:00] [WARN] [server.go:1234] ["connection denied by ip whitelist"] [ip=10.0.0.2] [whitelist="127.0.0.1,192.168.1.0/24"]

IP 白名单最佳实践

1. 遵循最小权限原则

  • 只允许必要的 IP 地址访问 TiDB
  • 避免使用过于宽泛的 CIDR 范围(如 0.0.0.0/0)
  • 定期审查和更新 IP 白名单

2. 区分不同环境

  • 生产环境、测试环境和开发环境使用不同的 IP 白名单
  • 为不同环境的用户设置不同的 IP 白名单

3. 结合其他安全措施

  • IP 白名单应与密码认证结合使用
  • 考虑使用 TLS 加密通信
  • 启用审计日志,监控访问情况

4. 定期备份 IP 白名单配置

  • 定期备份 TiDB 配置文件
  • 记录用户 IP 白名单设置
  • 建立 IP 白名单变更的审批流程

5. 考虑使用防火墙

  • 在 TiDB 服务器前部署防火墙
  • 防火墙规则与 IP 白名单配合使用,提供双层保护

常见问题(FAQ)

Q1: IP 白名单不生效怎么办?

A1: 可以从以下几个方面排查:

  • 检查 TiDB 配置文件中 ip-whitelist 参数是否正确设置
  • 检查是否使用了动态设置,全局变量 tidb_ip_whitelist 是否正确
  • 检查用户级别的 IP 白名单设置
  • 查看 TiDB 日志,确认是否有相关错误信息

Q2: 如何允许所有 IP 访问?

A2: 将 IP 白名单设置为空字符串或不设置该参数,即可允许所有 IP 访问:

toml
ip-whitelist = ""

sql
SET GLOBAL tidb_ip_whitelist = '';

Q3: IP 白名单支持 IPv6 吗?

A3: 是的,TiDB IP 白名单支持 IPv6 地址和 CIDR 格式:

::1
2001:db8::/32

Q4: 如何批量管理用户 IP 白名单?

A4: 可以使用以下方法批量管理:

  • 使用脚本生成 SQL 语句,批量修改用户 IP 白名单
  • 使用 TiDB 工具如 TiUP 管理用户和权限
  • 定期导出和导入用户权限配置

Q5: IP 白名单会影响性能吗?

A5: IP 白名单检查是轻量级操作,对 TiDB 性能影响很小。但如果设置了非常复杂的 IP 白名单规则,可能会有轻微影响。

Q6: 如何在 TiDB 集群中统一管理 IP 白名单?

A6: 可以通过以下方式统一管理:

  • 使用相同的配置文件模板部署所有 TiDB 节点
  • 使用 TiUP 管理集群配置,统一更新 IP 白名单
  • 定期检查所有 TiDB 节点的 IP 白名单配置,确保一致性