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

1次阅读

mysql安全加固需坚持最小权限原则:为必要用户分配最小权限,禁用匿名账户和test库,启用密码强度策略,绑定内网ip并限制网络访问。

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

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

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';
  • 避免给生产账号 FILEPROCESSSUPER 等高危权限,它们可能被用于读取服务器文件或绕过权限检查

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

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。

text=ZqhQzanResources