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 确认范围收敛 |
| 口令层 | 强口令策略并定期轮换 | 空口令账号数量为零 |
| 监控层 | 对异常登录与批量导出告警 | 测试触发一次告警链路 |