f9b1358b37
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>
4.1 KiB
4.1 KiB
服务器暴露面清单(常设)
定位:跨迭代常设文档——服务器上每个对公网开放的端口与每个常驻服务都必须在此登记:用途、归属决策、谁在用、最后确认日期。 缘起:2026-09-11 的安全事件——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 手册 | 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 手册 | ✅ 运行(2026-09-11 起改为仅本机监听) |
| nginx | 0.0.0.0:80/443 | 反向代理,按域名分流 | —— | ✅ 运行 |
| act_runner(容器) | 无监听(主动回连) | Gitea Actions 执行器 | CI Runner 手册 | ✅ 运行 |
| dockerd / containerd | 本机 socket | 容器运行时(runner 与 job 容器) | ADR-006 | ✅ 运行 |
| sshd | 0.0.0.0:22 | SSH | —— | ✅ 运行 |
| 腾讯云 agent(barad_agent / YDEyes / YDLive / stargate) | —— | 云监控与主机安全,云厂商预装 | —— | ✅ 运行(预期存在) |
| nacos | 项目已不使用 | ADR-002 已移除 | ⛔ 已停止;nacos.service 仍为 enabled,待 systemctl disable |
3. 核对方法
# 开放端口与监听服务
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. 纪律
- 默认拒绝:新服务一律只监听
127.0.0.1,需要外部访问时经 nginx 反代 + 域名分流,不直接开端口。 - 内部 API 不得对外:Gitea 的
/api/internal/**属内部通道(SSH serv 命令等经 127.0.0.1 调用),nginx 层应显式拒绝——本次事件的注入正是走这条路径。 - 决策与环境同步:ADR 决定移除某组件时,同一次收口内必须停服务、禁自启、删防火墙规则,并更新本页。
- 凭证轮换触发条件:任何「外部可调用内部 API」的迹象,一律视为对应 token 已泄露并轮换(
INTERNAL_TOKEN、SECRET_KEY)。 - 本页与实际不符即为缺陷:核对时发现未登记的开放端口或常驻服务,按缺陷处理——先查清用途,无正当理由即关闭。