docs: 记录 MySQL 全网连接例外 (#129)
This commit is contained in:
+5
-4
@@ -27,10 +27,11 @@
|
|||||||
- 固定使用 **Go + Gin + Go 标准库 `html/template`**。
|
- 固定使用 **Go + Gin + Go 标准库 `html/template`**。
|
||||||
- 生产数据库固定 **MySQL 8.4**,驱动固定
|
- 生产数据库固定 **MySQL 8.4**,驱动固定
|
||||||
`github.com/go-sql-driver/mysql` **v1.9.2**(纯 Go,兼容 Go 1.23)。
|
`github.com/go-sql-driver/mysql` **v1.9.2**(纯 Go,兼容 Go 1.23)。
|
||||||
- Admin 默认与 MySQL 同机或走私有网络;生产默认连接 `127.0.0.1:3307`,
|
- Admin 默认与 MySQL 同机或走私有网络;生产默认连接 `127.0.0.1:3307`。
|
||||||
不得把 MySQL 端口向全网开放。项目负责人明确批准公网直连时,只允许固定 `/32`
|
项目负责人已于 2026-08-11 明确批准生产 MySQL 3307 接受所有公网来源,公网业务账号
|
||||||
来源白名单,并同时满足:公网接口其余来源 DROP、账号按来源 IP 创建、最小库权限、
|
可以使用 `%`,但必须同时满足:只开放专用业务账号、权限仅限 `autobuy`、
|
||||||
`REQUIRE SSL`、root 仍仅限本机。公网 IP 变化时先更新白名单,不得临时改成 `%`。
|
`REQUIRE SSL`、Admin 使用 `verify_ca`,且 root 仍仅限本机。不得把这项例外扩展到
|
||||||
|
root、其他数据库或关闭 TLS;恢复固定公网 IP 后应优先收回到 `/32` 白名单。
|
||||||
- Admin 公网连接必须使用 `database.tls_mode: verify_ca` 和服务器公开 CA:要求
|
- Admin 公网连接必须使用 `database.tls_mode: verify_ca` 和服务器公开 CA:要求
|
||||||
TLS 1.2+、验证证书链、禁止回退明文。`disabled` 只允许同机或 SSH 隧道连接;
|
TLS 1.2+、验证证书链、禁止回退明文。`disabled` 只允许同机或 SSH 隧道连接;
|
||||||
不得使用驱动的 `preferred` 或单纯 `skip-verify`。
|
不得使用驱动的 `preferred` 或单纯 `skip-verify`。
|
||||||
|
|||||||
@@ -13,9 +13,9 @@
|
|||||||
# 顺运宝接口细节见 docs/admin/08-顺运宝接口.md。
|
# 顺运宝接口细节见 docs/admin/08-顺运宝接口.md。
|
||||||
|
|
||||||
database:
|
database:
|
||||||
# MySQL 8 地址。本机 MySQL 或 SSH 隧道都写 127.0.0.1。数据库客户端需要
|
# MySQL 8 地址。本机 MySQL 或 SSH 隧道都写 127.0.0.1。生产 3307 当前经项目
|
||||||
# 公网直连时,必须先按 admin/AGENTS.md 配置固定 IP 白名单和强制 SSL;
|
# 负责人批准接受所有公网来源,但只能使用限定 autobuy 库权限、REQUIRE SSL 的
|
||||||
# 绝不能把 3307 向所有公网来源开放。
|
# 专用业务账号;root 仍只允许服务器本机登录。详见 admin/AGENTS.md。
|
||||||
host: 127.0.0.1
|
host: 127.0.0.1
|
||||||
|
|
||||||
# 本机 MySQL 默认可写 3307;连接线上 MySQL 的 SSH 隧道可改成 13307。
|
# 本机 MySQL 默认可写 3307;连接线上 MySQL 的 SSH 隧道可改成 13307。
|
||||||
|
|||||||
@@ -179,9 +179,10 @@ database:
|
|||||||
password: "从安全渠道取得"
|
password: "从安全渠道取得"
|
||||||
```
|
```
|
||||||
|
|
||||||
Admin 本地开发连接线上 MySQL 时默认仍通过 SSH 隧道,把 `port` 改为隧道的本地
|
Admin 本地开发连接线上 MySQL 时优先通过 SSH 隧道,把 `port` 改为隧道的本地
|
||||||
端口。数据库客户端确需公网直连时,只能在项目负责人明确批准后采用固定 `/32`
|
端口。项目负责人已于 2026-08-11 批准生产 3307 接受所有公网来源;公网直连仍只能
|
||||||
来源白名单、来源限定账号、最小权限和强制 SSL,绝不能向全网开放。
|
使用限定 `autobuy` 库权限、`REQUIRE SSL` 的专用业务账号,root 只允许服务器本机
|
||||||
|
登录。公网暴露风险高于固定 `/32`,恢复固定出口 IP 后应优先收紧白名单。
|
||||||
|
|
||||||
- 同机或 SSH 隧道:`tls_mode: disabled`;
|
- 同机或 SSH 隧道:`tls_mode: disabled`;
|
||||||
- 公网直连:`tls_mode: verify_ca`,`tls_ca` 指向服务器公开 CA。客户端要求 TLS 1.2+
|
- 公网直连:`tls_mode: verify_ca`,`tls_ca` 指向服务器公开 CA。客户端要求 TLS 1.2+
|
||||||
|
|||||||
@@ -180,9 +180,10 @@
|
|||||||
Git 忽略且不得随程序打包、截图或粘贴到工单和日志;线上优先使用权限 `600` 的
|
Git 忽略且不得随程序打包、截图或粘贴到工单和日志;线上优先使用权限 `600` 的
|
||||||
环境文件,环境变量按字段覆盖 YAML。
|
环境文件,环境变量按字段覆盖 YAML。
|
||||||
|
|
||||||
`[必须]` MySQL 公网端口不得向全网开放。项目负责人明确批准直连时,必须同时使用
|
项目负责人已于 2026-08-11 明确批准生产 MySQL 3307 接受所有公网来源。该例外仅限
|
||||||
固定 `/32` 来源白名单、公网接口其余来源 DROP、来源 IP 限定账号、最小库权限和
|
`autobuy` 专用业务账号,并且必须保持库级权限、`REQUIRE SSL`、Admin
|
||||||
`REQUIRE SSL`;root 始终仅限服务器本机。
|
`verify_ca` 和 root 仅限服务器本机;不得扩展到其他数据库或关闭 TLS。恢复固定
|
||||||
|
出口 IP 后应优先改回 `/32` 白名单。
|
||||||
|
|
||||||
`[必须]` Admin 公网连接使用 `database.tls_mode: verify_ca`:最低 TLS 1.2,加载
|
`[必须]` Admin 公网连接使用 `database.tls_mode: verify_ca`:最低 TLS 1.2,加载
|
||||||
服务器公开 CA 并验证证书链,验证失败即拒绝连接,不得使用允许明文回退的
|
服务器公开 CA 并验证证书链,验证失败即拒绝连接,不得使用允许明文回退的
|
||||||
|
|||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# 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 工单。
|
||||||
Reference in New Issue
Block a user