docs: 2026-09-11 安全事件复盘 + 新建服务器暴露面清单 + M3.5 报告 03/04/05 入档
CI / docs-build (push) Successful in 1m59s

安全事件(已闭环,服务恢复):
- 根因链:Gitea 3000 对公网开放 → 外部调用 /api/internal/manager/add-logger
  注入 gitconfig 的 uploadpack.packObjectsHook → 指向不存在的脚本 →
  upload-pack 发 NAK 后无法产出 pack → 全仓 HTTPS clone 失败(CI 全挂)
- 攻击未达成代码执行(hook 目标脚本不存在);三仓 ref 与本地逐一核对未被篡改;
  无系统层入侵(无陌生 key/crontab/挖矿进程/陌生登录)
- 新建常设「服务器暴露面清单」:补上服务器侧「决策变了环境没跟上」的核对机制
  (Nacos 在 ADR-002 移除后仍暴露公网近两个月)
- CI Runner 手册排障表增三条:CI 秒失败先在本机复现 checkout、跨仓比 CI
  须核对时间戳、clone 坏而 push 正常时查 packObjectsHook 注入

M3.5 交付报告:03 后端资料与头像(api 334→379)、04 契约冻结 v1.4.0
(31→32 路径、矩阵 173→181 格、11 格红转绿)、05 资料页与头像 UI(flutter 526→597)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-11 17:45:35 +08:00
parent 5f02909af6
commit f9b1358b37
8 changed files with 1064 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
# 服务器暴露面清单(常设)
> **定位**:跨迭代常设文档——服务器上**每个对公网开放的端口**与**每个常驻服务**都必须在此登记:用途、归属决策、谁在用、最后确认日期。
> **缘起**2026-09-11 的[安全事件](iterations/iteration-3.5/07-security-incident-20260911.md)——Nacos 在 ADR-002 已将其从项目移除后,进程与防火墙规则仍暴露公网近两个月。代码侧有 ADR + 契约测试防「决策变了实现没跟上」,服务器侧此前无任何对应机制,本页即为补上这一环。
> **维护约定**:① 新开端口/新增常驻服务必须先在此登记;② 每次迭代收官核对一遍,更新「最后确认」;③ 登记不出理由的开放端口,默认删除。
---
## 1. 对公网开放的端口(2026-09-11 核对)
| 端口 | 协议 | 用途 | 谁在用 | 归属决策 | 最后确认 |
| --- | --- | --- | --- | --- | --- |
| 22 | TCP | SSH 登录与 git push/pull(三仓 remote 均为 SSH | 维护者、本机 git | —— | 2026-09-11 |
| 80 | TCP | HTTP(跳转 443 | nginx | —— | 2026-09-11 |
| 443 | TCP | HTTPSGitea Web/API、CI checkout、act_runner 回连 | nginx → 127.0.0.1:3000 | [CI Runner 手册](ci-runner-setup.md) | 2026-09-11 |
| ICMP | —— | ping 连通性 | 运维排查 | —— | 2026-09-11 |
**已于 2026-09-11 关闭**(记录在此以防重开):
| 端口 | 原用途 | 关闭原因 |
| --- | --- | --- |
| 3000 | Gitea HTTP 直连 | **本次安全事件入口**nginx 已从 127.0.0.1 反代,无需公网暴露 |
| 8848 / 9848 | Nacos HTTP / gRPC | 项目已由 **ADR-002** 移除 Nacos;暴露公网近两个月,且 Nacos 历史高危漏洞多(默认凭证、鉴权绕过、反序列化 RCE) |
| 2222 | 不明(疑为早期 Gitea 内建 SSH) | `ss -tlnp` 确认无任何服务监听,空规则即无谓攻击面 |
## 2. 常驻服务
| 服务 | 监听 | 用途 | 归属决策 | 状态 |
| --- | --- | --- | --- | --- |
| gitea | **127.0.0.1:3000** | 代码托管 + Actions 调度 | [CI Runner 手册](ci-runner-setup.md) | ✅ 运行(2026-09-11 起改为仅本机监听) |
| nginx | 0.0.0.0:80/443 | 反向代理,按域名分流 | —— | ✅ 运行 |
| act_runner(容器) | 无监听(主动回连) | Gitea Actions 执行器 | [CI Runner 手册](ci-runner-setup.md) | ✅ 运行 |
| dockerd / containerd | 本机 socket | 容器运行时(runner 与 job 容器) | ADR-006 | ✅ 运行 |
| sshd | 0.0.0.0:22 | SSH | —— | ✅ 运行 |
| 腾讯云 agentbarad_agent / YDEyes / YDLive / stargate | —— | 云监控与主机安全,云厂商预装 | —— | ✅ 运行(预期存在) |
| **nacos** | ~~*:8848 / *:9848~~ | **项目已不使用** | **ADR-002 已移除** | ⛔ 已停止;`nacos.service` 仍为 enabled**待 `systemctl disable`** |
## 3. 核对方法
```bash
# 开放端口与监听服务
sudo ss -tlnp
# 云平台防火墙规则:腾讯云轻量服务器控制台 → 防火墙(轻量无安全组)
# 常驻服务与自启项
systemctl list-unit-files --state=enabled | grep -viE "^(systemd|dbus|network|cloud|snap|apt|unattended|multipathd|open-iscsi|lvm2|rsyslog|cron|ssh)"
docker ps -a
# 异常检查(安全事件后例行)
ps aux --sort=-%cpu | head -15
crontab -l; sudo crontab -l
cat ~/.ssh/authorized_keys
sudo last -20
```
## 4. 纪律
1. **默认拒绝**:新服务一律只监听 `127.0.0.1`,需要外部访问时经 nginx 反代 + 域名分流,不直接开端口。
2. **内部 API 不得对外**Gitea 的 `/api/internal/**` 属内部通道(SSH serv 命令等经 127.0.0.1 调用),nginx 层应显式拒绝——本次事件的注入正是走这条路径。
3. **决策与环境同步**:ADR 决定移除某组件时,**同一次收口内**必须停服务、禁自启、删防火墙规则,并更新本页。
4. **凭证轮换触发条件**:任何「外部可调用内部 API」的迹象,一律视为对应 token 已泄露并轮换(`INTERNAL_TOKEN``SECRET_KEY`)。
5. **本页与实际不符即为缺陷**:核对时发现未登记的开放端口或常驻服务,按缺陷处理——先查清用途,无正当理由即关闭。