Files
patbond-doc/docs/development/server-exposure.md
T
lixi f9b1358b37
CI / docs-build (push) Successful in 1m59s
docs: 2026-09-11 安全事件复盘 + 新建服务器暴露面清单 + M3.5 报告 03/04/05 入档
安全事件(已闭环,服务恢复):
- 根因链: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>
2026-09-11 17:45:35 +08:00

63 lines
4.1 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.
# 服务器暴露面清单(常设)
> **定位**:跨迭代常设文档——服务器上**每个对公网开放的端口**与**每个常驻服务**都必须在此登记:用途、归属决策、谁在用、最后确认日期。
> **缘起**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. **本页与实际不符即为缺陷**:核对时发现未登记的开放端口或常驻服务,按缺陷处理——先查清用途,无正当理由即关闭。