在数据库运维中,限制用户登录IP是防范未授权访问的重要手段。大多数关系型数据库在用户认证时都会校验来源地址,其中MySQL通过mysql.user表中的Host字段实现基于IP的访问控制,相当于为数据库用户配置了一份登录白名单。

一、Host字段的匹配规则
MySQL的用户账号由用户名和Host两部分组成,格式为 'user'@'host'。Host字段支持多种写法:
localhost:仅允许本机通过socket或回环地址连接- 具体IP如
192.168.0.1:仅该IP可连接 - 带掩码的网络如
192.168.1.%:允许192.168.1段所有主机 %:允许任意IP连接,存在较大风险
数据库在验证时会按最精确匹配优先的原则选择账号,因此将Host从 % 收紧为特定IP可显著提升安全性。
二、创建限定IP的数据库用户
创建用户时直接指定Host即可完成白名单设置,例如只允许应用服务器 192.168.0.1 访问:
-- 创建仅允许来自 192.168.0.1 的用户 appuser CREATE USER 'appuser'@'192.168.0.1' IDENTIFIED BY 'StrongPass123'; -- 授予业务库权限 GRANT SELECT, INSERT, UPDATE ON shop_db.* TO 'appuser'@'192.168.0.1'; FLUSH PRIVILEGES;
三、修改已有用户的Host字段
如果账号已经存在且Host为 %,可以通过重命名用户或修改系统表来限制IP。推荐用 RENAME USER 方式:
-- 将原有任意IP账号改为限定IP RENAME USER 'appuser'@'%' TO 'appuser'@'192.168.0.1'; FLUSH PRIVILEGES;
也可直接更新 mysql.user 表后刷新权限:
UPDATE mysql.user SET Host='192.168.0.1' WHERE User='appuser' AND Host='%'; FLUSH PRIVILEGES;
四、查看与验证当前白名单
通过查询用户表确认配置是否生效:
SELECT user, host FROM mysql.user WHERE user='appuser';
从非白名单IP连接时,数据库会返回 Access denied 错误,说明限制已起作用。
五、多层防护建议
Host字段白名单虽有效,但仍建议结合以下措施:
| 措施 | 说明 |
|---|---|
| 网络防火墙 | 在数据库服务器前限制仅放行应用网段 |
| 数据库代理 | 通过代理层做IP鉴权和审计 |
| 定期审计 | 检查mysql.user中是否存在Host为 % 的高权账号 |
注意:修改Host后,原有来自其他IP的连接会话不会立刻断开,但新连接会被拒绝,必要时应重启服务或杀掉旧连接。
合理运用Host字段与白名单机制,可以让数据库用户的登录来源清晰可控,降低被暴力破解或拖库的风险。