首页/安全/漏洞与攻击面速查/MySQL 暴露与远程账号收敛
主机与服务风险面53 条

MySQL 暴露与远程账号收敛

MySQL 监听 0.0.0.0 且存在 host 为 % 的账号时,数据库直接暴露给所有可达网段;配合弱口令或空口令会直接导致数据泄露,mysql.user 中的历史账号也常被忽略。

漏洞与攻击面速查安全更新于 2026-10-13

MySQL 暴露风险是什么

当 MySQL 监听在 0.0.0.0 或对业务网段全开,同时 mysql.user 里存在 host 为 %(或空 host)的账号,数据库就直接暴露给所有可达来源。配合弱口令或空口令会导致整库数据被拖走,历史遗留的远程账号与匿名账号往往是最容易被忽略的一环。

基本信息

默认端口3306
关键配置my.cnf 的 bind-address、skip-networking
账号面mysql.user 表中的 user/host 组合与口令状态
加固工具mysql_secure_installation 可处理常见默认项

核查命令

核查命令
ss -lntp | grep 3306                                       # 监听地址与进程
mysql -e "SELECT user, host FROM mysql.user WHERE host <> 'localhost';"   # 远程账号清单
mysql -e "SELECT user, host FROM mysql.user WHERE authentication_string = '' OR authentication_string IS NULL;"   # 空口令账号
mysql -e "SELECT user, host, plugin FROM mysql.user WHERE host = '%';"    # 全来源账号

收敛与基线

收敛与基线
mysql_secure_installation   # 依次处理:匿名账号、远程 root、test 库、权限刷新
# my.cnf / mysqld.cnf 中固定监听范围
# bind-address = 127.0.0.1   或改为管理网卡地址
# skip-networking             仅本地套接字访问时启用

典型使用场景

  • 暴露面排查:从外部视角确认 3306 是否可达
  • 账号治理:清理历史遗留的远程账号与测试账号
  • 上线前基线:新实例按「只本机监听 + 无匿名账号」部署
  • 数据泄露响应:确认是否曾开放访问并评估批量导出可能
  • 多环境隔离:测试库与生产库的账号范围分开管理

风险组合与处置

组合风险处置
对外监听 + 空口令账号极高立即关闭账号并收敛网络
对外监听 + 弱口令高强口令策略与来源白名单
内网监听 + % 账号中高按业务来源收敛 host 范围
本机监听 + 最小权限账号可接受纳入日常基线核查
业务确需远程访问时,用具体来源网段账号加防火墙白名单,比全开 % 可控得多;账号粒度也可以按库与权限拆分。
清理远程账号或调整 host 范围前先确认应用连接来源:误删业务账号或收紧网段会导致应用立刻连不上,应先查连接日志再改。

加固优先级

层面动作验证方式
网络层安全组与防火墙只放行应用网段从其他网段 telnet 测试被拒
账号层清理匿名与历史远程账号查询 mysql.user 确认范围收敛
口令层强口令策略并定期轮换空口令账号数量为零
监控层对异常登录与批量导出告警测试触发一次告警链路

易错点

  • 防火墙封了 3306 但 bind-address 未改:内网任意主机仍可直连数据库
  • mysql.user 里的历史远程账号与匿名账号长期未清理
  • 业务账号 host 写为 %,口令一旦泄露即为全网可达
  • 只关注 3306 而忽略高可用端口与只读副本同样对外可达
  • 口令轮换后未同步应用配置,故障时又把范围放宽回去

数据来源与参考

  • MySQL 文档(账号管理与 mysql_secure_installation)
  • MySQL 安全部署指南
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌