Admin:允许所有公网 IP 连接生产 MySQL 业务账号 #129

Closed
opened 2026-08-11 09:02:08 +08:00 by ila · 2 comments
Owner

基本信息

  • 类型:生产配置 / 安全例外
  • 父级大工单:#76
  • 所属 MVP / 版本:#77
  • 阶段:生产数据库公网连接
  • 状态:待验收

要解决什么

本地 Admin 的公网出口 IP 不固定,而服务器原来仅放行旧 /32 地址,导致连接 185.216.248.75:3307 大量超时。用户已明确授权修改原“仅固定 /32 白名单”的项目规则,并要求生产 MySQL 允许所有公网 IP 访问。

做什么 / 不做什么

  • 做:备份当前防火墙规则和 MySQL 配置;开放公网 TCP 3307;增加 buy@'%',复用现有密码哈希,权限限定在 autobuy.* 并强制 SSL;保留 root 仅本机;同步 Admin 项目规则和基线文档;验证公网 TCP、TLS/MySQL 和 Admin 启动。
  • 不做:不开放或重置 root;不关闭 TLS;不授予 buy 全局权限;不改业务数据。

最终实现方案

  1. 保存 iptables 现状,在 3307 DROP 前加入所有公网来源的 NEW 连接 ACCEPT,并持久化到 /etc/sysconfig/iptables。
  2. 既有 MySQL 8.4 root 密码副本均已失效,因此没有重��� root。使用 MySQL 一次性 init-file,从 buy@127.0.0.1 克隆密码哈希到 buy@'%',授权 autobuy.* 并设置 REQUIRE SSL。
  3. 只重启 MySQL 8.4 一次;启动后删除一次性 SQL 和 init_file 配置,保留变更前配置备份。
  4. 更新 admin/AGENTS.md、admin/config.example.yaml、Admin 上手指南和质量安全基线,记录项目负责人批准的全网来源例外;root、TLS 和数据库范围限制不变。
  5. 从本机重复验证 TCP、TLS 身份、授权、明文拒绝、Go 页面冒烟;检查线上 Admin、Nginx、cmhub 和 worker。

验收标准

  • 公网来源可稳定连接 185.216.248.75:3307,连续 5 次 TCP 探测成功。
  • 公网身份为 buy@'%',权限仅作用于 autobuy.*。
  • 公网账号强制 SSL,关闭 TLS 的连接被拒绝。
  • root 账号未被开放或重置。
  • 本地 Admin 通过 verify_ca 完成数据库连接、schema 自检和页面冒烟。
  • 防火墙规则已持久化,iptables-restore --test 通过并保留回退备份。
  • MySQL、Admin、Nginx、cmhub 和 66 个图片 worker 无回归。
  • 项目规则、配置示例和 Admin 基线文档与用户授权一致。

验证结果

  • TCP:5/5 成功。
  • TLS:ECDHE-RSA-AES128-GCM-SHA256;--ssl-mode=DISABLED 返回 1045。
  • MySQL:CURRENT_USER() 为 buy@%;grants 只有 USAGE ON *.* 和 ALL PRIVILEGES ON autobuy.*。
  • Go:Admin 公网页面冒烟通过,首页返回 303;repository 公网 TLS 冒烟通过。
  • 线上:MySQL 8.4、Admin、Nginx、cmhub Web/Generate active;图片 worker 66/66 active;Admin 和 cmhub HTTPS 返回 200。

风险和回退

  • 风险:3307 将持续暴露于互联网扫描,风险显著高于固定 /32 或 SSH 隧道。
  • 缓解:只使用 buy 业务账号、权限限定 autobuy.*、强制 TLS、Admin 校验 CA、root 不开放。
  • 防火墙回退:恢复 /root/iptables-before-mysql-public-20260811T0900.rules。
  • MySQL 配置回退:配置备份 /root/mysql84.cnf-before-buy-public-20260811T0912;需要收回公网账号时删除 buy@'%' 并恢复原 /32 规则。

实施记录

  • 最初超时根因:iptables 只允许旧 /32,其他 3307 连接被 DROP。
  • 防火墙开放后 Admin 从超时变为 Host ... is not allowed,证明网络已恢复、剩余为账号 Host 限制。
  • 一次性初始化完成后,公网 TLS 登录和 Admin 完整连接均通过;初始化文件已删除,MySQL 配置中不再含 init_file。
  • 归档:docs/task/129-mysql允许所有公网ip连接.md。
  • 提交:4ede126 docs: 记录 MySQL 全网连接例外 (#129)。
## 基本信息 - 类型:生产配置 / 安全例外 - 父级大工单:#76 - 所属 MVP / 版本:#77 - 阶段:生产数据库公网连接 - 状态:待验收 ## 要解决什么 本地 Admin 的公网出口 IP 不固定,而服务器原来仅放行旧 `/32` 地址,导致连接 `185.216.248.75:3307` 大量超时。用户已明确授权修改原“仅固定 `/32` 白名单”的项目规则,并要求生产 MySQL 允许所有公网 IP 访问。 ## 做什么 / 不做什么 - 做:备份当前防火墙规则和 MySQL 配置;开放公网 TCP 3307;增加 `buy@'%'`,复用现有密码哈希,权限限定在 `autobuy.*` 并强制 SSL;保留 root 仅本机;同步 Admin 项目规则和基线文档;验证公网 TCP、TLS/MySQL 和 Admin 启动。 - 不做:不开放或重置 root;不关闭 TLS;不授予 `buy` 全局权限;不改业务数据。 ## 最终实现方案 1. 保存 iptables 现状,在 3307 DROP 前加入所有公网来源的 NEW 连接 ACCEPT,并持久化到 `/etc/sysconfig/iptables`。 2. 既有 MySQL 8.4 root 密码副本均已失效,因此没有重��� root。使用 MySQL 一次性 `init-file`,从 `buy@127.0.0.1` 克隆密码哈希到 `buy@'%'`,授权 `autobuy.*` 并设置 `REQUIRE SSL`。 3. 只重启 MySQL 8.4 一次;启动后删除一次性 SQL 和 `init_file` 配置,保留变更前配置备份。 4. 更新 `admin/AGENTS.md`、`admin/config.example.yaml`、Admin 上手指南和质量安全基线,记录项目负责人批准的全网来源例外;root、TLS 和数据库范围限制不变。 5. 从本机重复验证 TCP、TLS 身份、授权、明文拒绝、Go 页面冒烟;检查线上 Admin、Nginx、cmhub 和 worker。 ## 验收标准 - [x] 公网来源可稳定连接 `185.216.248.75:3307`,连续 5 次 TCP 探测成功。 - [x] 公网身份为 `buy@'%'`,权限仅作用于 `autobuy.*`。 - [x] 公网账号强制 SSL,关闭 TLS 的连接被拒绝。 - [x] root 账号未被开放或重置。 - [x] 本地 Admin 通过 `verify_ca` 完成数据库连接、schema 自检和页面冒烟。 - [x] 防火墙规则已持久化,`iptables-restore --test` 通过并保留回退备份。 - [x] MySQL、Admin、Nginx、cmhub 和 66 个图片 worker 无回归。 - [x] 项目规则、配置示例和 Admin 基线文档与用户授权一致。 ## 验证结果 - TCP:5/5 成功。 - TLS:`ECDHE-RSA-AES128-GCM-SHA256`;`--ssl-mode=DISABLED` 返回 1045。 - MySQL:`CURRENT_USER()` 为 `buy@%`;grants 只有 `USAGE ON *.*` 和 `ALL PRIVILEGES ON autobuy.*`。 - Go:Admin 公网页面冒烟通过,首页返回 303;repository 公网 TLS 冒烟通过。 - 线上:MySQL 8.4、Admin、Nginx、cmhub Web/Generate active;图片 worker 66/66 active;Admin 和 cmhub HTTPS 返回 200。 ## 风险和回退 - 风险:3307 将持续暴露于互联网扫描,风险显著高于固定 `/32` 或 SSH 隧道。 - 缓解:只使用 `buy` 业务账号、权限限定 `autobuy.*`、强制 TLS、Admin 校验 CA、root 不开放。 - 防火墙回退:恢复 `/root/iptables-before-mysql-public-20260811T0900.rules`。 - MySQL 配置回退:配置备份 `/root/mysql84.cnf-before-buy-public-20260811T0912`;需要收回公网账号时删除 `buy@'%'` 并恢复原 `/32` 规则。 ## 实施记录 - 最初超时根因:iptables 只允许旧 `/32`,其他 3307 连接被 DROP。 - 防火墙开放后 Admin 从超时变为 `Host ... is not allowed`,证明网络已恢复、剩余为账号 Host 限制。 - 一次性初始化完成后,公网 TLS 登录和 Admin 完整连接均通过;初始化文件已删除,MySQL 配置中不再含 `init_file`。 - 归档:`docs/task/129-mysql允许所有公网ip连接.md`。 - 提交:`4ede126 docs: 记录 MySQL 全网连接例外 (#129)`。
Author
Owner

实施已完成,等待用户验收。公网 TCP、buy@%、强制 TLS、Go Admin 冒烟及线上服务均已验证;完整风险、回退路径和提交见更新后的工单正文。

实施已完成,等待用户验收。公网 TCP、buy@%、强制 TLS、Go Admin 冒烟及线上服务均已验证;完整风险、回退路径和提交见更新后的工单正文。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:6386d76
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`6386d76` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 11:00:40 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#129