Files
cmautobuy/docs/task/129-mysql允许所有公网ip连接.md
T

73 lines
3.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 129 Admin:允许所有公网 IP 连接生产 MySQL 业务账号
- 类型:生产配置 / 安全例外
- 父级大工单:#76
- 所属 MVP / 版本:#77 / 生产数据库公网连接
- 状态:已完成,用户验收通过
- 日期:2026-08-11
- Gitea 工单:http://ilaer.eicp.net:8418/chengma/cmautobuy/issues/129
## 背景与目标
本地 Admin 的公网出口 IP 发生变化后,服务器原 `/32` 白名单会丢弃连接,
`run_admin.bat` 在 5 秒连接超时后退出。项目负责人明确授权生产 MySQL 3307
接受所有公网来源,同时继续限制业务账号、数据库范围和 TLS。
## 最终方案
- 在 INPUT 链的 3307 DROP 前增加全来源 NEW 连接 ACCEPT,并保存到
`/etc/sysconfig/iptables`;变更前规则备份为
`/root/iptables-before-mysql-public-20260811T0900.rules`。
- 新增 `buy@'%'`,克隆现有本机 `buy` 账号的密码哈希,权限限定为
`autobuy.*`,并设置 `REQUIRE SSL`;root 和其他数据库账号保持不变。
- 因 MySQL 8.4 管理密码的既有保存副本均已失效,未重置 root 密码。改用一次性
`init-file` 完成账号 DDL,只重启 MySQL 一次;启动后立即删除初始化文件和配置项。
MySQL 配置备份为 `/root/mysql84.cnf-before-buy-public-20260811T0912`。
- 更新 Admin 规则、配置示例、上手指南和安全基线,记录本次经用户批准的全网来源
例外;root 仅本机、TLS 和库级权限仍是硬性条件。
## 改了哪些
- 服务器 `/etc/sysconfig/iptables`:持久化公网 3307 全来源 ACCEPT。
- 生产 MySQL 权限表:新增 `buy@'%'`,限定 `autobuy.*` 并强制 SSL。
- `admin/AGENTS.md`:登记项目负责人批准的公网来源例外及保留门禁。
- `admin/config.example.yaml`:同步公网连接说明。
- `docs/admin/00-getting-started.md`:同步本地连接和风险说明。
- `docs/admin/06-quality-security.md`:同步生产安全基线。
- `docs/task/129-mysql允许所有公网ip连接.md`:记录实施和验收结果。
## 验收结果
| 验收标准 | 结果 |
|---|---|
| 公网 TCP 3307 连续连接稳定 | 通过,5/5 成功 |
| 公网登录身份为 `buy@%` | 通过 |
| 账号权限只作用于 `autobuy.*` | 通过 |
| 公网连接强制 SSL,关闭 TLS 会被拒绝 | 通过 |
| Go Admin 使用 `verify_ca` 完成连接、schema 自检和页面冒烟 | 通过 |
| root 未开放公网登录 | 通过,未修改 root 账号 |
| 防火墙规则已持久化且可解析 | 通过,`iptables-restore --test` 成功 |
| MySQL、Admin、Nginx、cmhub 和图片 worker 无回归 | 通过,worker 66/66 active |
| 项目规则和基线文档与用户授权一致 | 通过 |
## 测试
- 执行的命令:重复 TCP 探测;MySQL CLI 分别使用 `VERIFY_CA` 和 `DISABLED`;
`GOTOOLCHAIN=go1.23.0 go test . -run '公网MySQLTLS' -v -count=1`;
`GOTOOLCHAIN=go1.23.0 go test ./repository -run '公网TLS只读冒烟' -v -count=1`;
服务器执行 systemd、HTTP、iptables 持久化和 MySQL 日志检查。
- 结果:公网 TLS cipher 为 `ECDHE-RSA-AES128-GCM-SHA256`;页面冒烟返回 303;
明文连接返回 1045;线上 Admin 和 cmhub HTTPS 均返回 200,MySQL 重启后无严重日志。
- **没验证到的部分**:未执行防火墙回退演练;未重启整台服务器验证开机加载,但已验证
`/etc/sysconfig/iptables` 内容和 `iptables-restore --test`。
## 遗留问题(选填)
- 全网开放 3307 会持续遭受互联网扫描,风险高于固定 `/32` 或 SSH 隧道。恢复固定
出口 IP 后应优先收紧白名单。
- MySQL 8.4 root 管理密码的既有本地和宝塔保存副本均已失效;本任务没有重置 root。
## 相关提交
- 待归档提交后回写 Gitea 工单。