mysql如何防止非授权访问数据库_mysql数据库加固

来源:这里教程网 时间:2026-02-28 20:49:36 作者:

只给必要用户分配最小权限

MySQL 默认的

root
用户常被滥用,尤其在开发环境直接用
root@'%'
允许远程登录,等于把锁打开扔在门口。必须为每个应用或人员创建独立账号,并严格限制主机范围和权限类型。

禁止使用通配符主机:
CREATE USER 'appuser'@'%' IDENTIFIED BY 'pwd';
→ 改为
CREATE USER 'appuser'@'192.168.10.5' IDENTIFIED BY 'pwd';
不授予
GRANT OPTION
,除非明确需要授权能力
REVOKE ALL PRIVILEGES ON *.* FROM 'user'@'host';
清空默认权限,再逐条添加,例如:
GRANT SELECT, INSERT ON mydb.orders TO 'appuser'@'192.168.10.5';
避免给生产账号
FILE
PROCESS
SUPER
等高危权限,它们可能被用于读取服务器文件或绕过权限检查

禁用匿名用户和测试数据库

MySQL 安装后常残留

''@'localhost'
(空用户名)和
test
数据库,这是攻击者常用的入口点。这些不是“默认安全”,而是默认风险。

运行
DROP USER ''@'localhost';
DROP USER ''@'hostname';
删除所有空用户名账户
执行
DROP DATABASE IF EXISTS test;
,并确认
mysql.db
表中无
test%
权限记录
检查
SELECT User, Host FROM mysql.user;
,确保无非预期的
Host
值(如
%
192.168.%
过宽匹配)

强制密码策略与定期轮换

弱密码是绝大多数非授权访问的起点。MySQL 5.7+ 内置了

validate_password
插件,但默认不启用,且策略等级常被设为低(
LOW
),形同虚设。

启用插件:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
设置强度:执行
SET GLOBAL validate_password.policy = MEDIUM;
(要求至少 8 位、大小写字母、数字、特殊字符各一)
禁止重用:设
validate_password.history = 5
,防止用户循环改回旧密码
生产环境应配合外部密钥管理工具(如 HashiCorp Vault)实现密码自动轮换,而非人工定期修改

网络层隔离 + 绑定地址控制

MySQL 不是 Web 服务,不该暴露在公网或大内网段。哪怕有强密码和权限控制,开放

3306
端口仍会引来暴力扫描和漏洞利用(如 CVE-2012-2122)。

修改
my.cnf
中的
bind-address
:从
0.0.0.0
改为具体内网 IP(如
192.168.10.10
)或
127.0.0.1
(仅本地)
操作系统级防火墙必须限制:只放行可信应用服务器 IP 访问
3306
,拒绝其他所有来源
若需远程管理,走跳板机或 SSH 隧道,而非直接开 MySQL 端口 注意:Docker 容器中
bind-address = 0.0.0.0
是常见疏忽,务必覆盖为
127.0.0.1
并通过
-p
显式映射端口

真正难的不是加几条命令,而是每次新增应用、迁移数据库、交接权限时,是否还坚持检查

mysql.user
表、是否真删掉了测试库、是否让运维同事也看到那条
bind-address
配置。加固不是一次性动作,是权限变更的每一步都得过一遍 checklist。

相关推荐