MySQL白名单靠CREATE USER和GRANT中Host字段实现,需显式绑定IP、授予最小必要权限,并配合防火墙及云平台安全组配置。

MySQL 没有“白名单开关”,所谓白名单权限,就是靠 CREATE USER 和 GRANT 语句中显式指定的 Host 字段实现的——它不是附加规则,而是账号身份的硬性组成部分。配错 Host、漏刷权限、或忽略防火墙,都会导致第三方工具连不上,或连上后报权限不足。
用 CREATE USER 显式绑定 IP,别用 '%'
第三方工具(如 Navicat、DBeaver、ETL 工具)通常从固定出口 IP 连接数据库,这时必须创建带具体 IP 的账号,而不是通配符账号。
-
CREATE USER 'etl_app'@'203.0.113.45' IDENTIFIED BY 'strong_pass_2026';✅ 正确:只允许该 IP 连接 -
CREATE USER 'etl_app'@'%' IDENTIFIED BY 'strong_pass_2026';❌ 危险:任何 IP 都可尝试爆破 - 如果工具跑在容器或云服务内(如阿里云 DataWorks),需确认其**出站公网 IP**,不是容器内网 IP 或私有地址(如
172.18.0.3) - 不建议用主机名(如
'etl_app'@'workstation-01.example.com'),DNS 解析失败会导致连接拒绝,且 MySQL 不做反向解析验证
用 GRANT 给最小必要权限,别直接 ALL PRIVILEGES
第三方工具极少需要建库、删表、改用户,给超范围权限等于放大攻击面。常见场景对应权限如下:
- 仅读取同步(如 Flink CDC、Debezium):
GRANT SELECT ON mydb.orders TO 'etl_app'@'203.0.113.45'; - 写入日志表(如 Logstash 写入 audit_log):
GRANT INSERT ON mydb.audit_log TO 'etl_app'@'203.0.113.45'; - 需要查元数据(如 DBeaver 显示表结构):
GRANT SELECT ON mysql.columns_priv TO 'etl_app'@'203.0.113.45';(MySQL 8.0+)或GRANT SELECT ON information_schema.* TO ...(兼容旧版,但较宽泛) - 绝对不要给
FILE、PROCESS、SUPER权限——这些和第三方工具的数据操作无关,却可能被用于提权或读取服务器文件
执行 FLUSH PRIVILEGES 后仍连不上?先查网络层拦截
MySQL 层拒绝连接时错误码通常是 ERROR 1045 (28000): Access denied;而网络不通时是 ERROR 2003 (HY000): Can't connect to MySQL server。两者处理路径完全不同。
- 用
telnet 203.0.113.45 3306或nc -zv 203.0.113.45 3306测试端口可达性:不通 → 查防火墙(iptables/ufw/ 云安全组) - 通但登录失败 → 确认
SELECT User, Host FROM mysql.user;中账号 Host 完全匹配(注意空格、大小写、IPv4/IPv6 格式) - MySQL 8.0 默认用
caching_sha2_password插件,某些老工具不支持:需加IDENTIFIED WITH mysql_native_password显式指定 -
FLUSH PRIVILEGES必须执行,但仅对已存在账号生效;新建账号无需此步(CREATE USER和GRANT自动加载)
Docker 或云 RDS 环境下,白名单要分两层配
容器或托管数据库(如阿里云 RDS、腾讯云 CDB)额外加了一层网络控制,MySQL 账号的 Host 只是第二道关。
- Docker Compose 场景:若第三方工具也在同 Docker 网络,可用容器名作为 Host,如
'tool_user'@'navicat-client';但对外暴露的 IP 仍需走宿主机防火墙或云安全组放行 - RDS 白名单分组(如
default)是独立于 MySQL 用户系统的,必须在控制台手动添加 IP 到对应分组,否则即使账号正确也连不上(ERROR 2003) - 云厂商控制台显示的“白名单”本质是 TCP 层访问控制,和
mysql.user.Host无任何配置耦合,二者缺一不可 - 测试时务必关闭本地开发机的杀毒软件或代理——某些国产安全软件会劫持 3306 端口并静默丢包,现象和防火墙拦截一致
最容易被忽略的是:MySQL 的 Host 匹配是精确字符串比对,不支持 CIDR(如 '192.168.1.%' 只匹配 3 段,不能代替 192.168.1.0/24);需要多个 IP 就得建多个账号,或改用防火墙聚合管控。安全性和运维成本之间,这里没有银弹。


















