docs: 2026-09-11 安全事件复盘 + 新建服务器暴露面清单 + M3.5 报告 03/04/05 入档
CI / docs-build (push) Successful in 1m59s
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:
@@ -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 | HTTPS:Gitea 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 | —— | ✅ 运行 |
|
||||
| 腾讯云 agent(barad_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. **本页与实际不符即为缺陷**:核对时发现未登记的开放端口或常驻服务,按缺陷处理——先查清用途,无正当理由即关闭。
|
||||
Reference in New Issue
Block a user