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

4.1 KiB
Raw Blame History

服务器暴露面清单(常设)

定位:跨迭代常设文档——服务器上每个对公网开放的端口每个常驻服务都必须在此登记:用途、归属决策、谁在用、最后确认日期。 缘起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 HTTPSGitea 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 —— 运行
腾讯云 agentbarad_agent / YDEyes / YDLive / stargate —— 云监控与主机安全,云厂商预装 —— 运行(预期存在)
nacos *:8848 / *:9848 项目已不使用 ADR-002 已移除 已停止;nacos.service 仍为 enabledsystemctl 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. 纪律

  1. 默认拒绝:新服务一律只监听 127.0.0.1,需要外部访问时经 nginx 反代 + 域名分流,不直接开端口。
  2. 内部 API 不得对外Gitea 的 /api/internal/** 属内部通道(SSH serv 命令等经 127.0.0.1 调用),nginx 层应显式拒绝——本次事件的注入正是走这条路径。
  3. 决策与环境同步ADR 决定移除某组件时,同一次收口内必须停服务、禁自启、删防火墙规则,并更新本页。
  4. 凭证轮换触发条件:任何「外部可调用内部 API」的迹象,一律视为对应 token 已泄露并轮换(INTERNAL_TOKENSECRET_KEY)。
  5. 本页与实际不符即为缺陷:核对时发现未登记的开放端口或常驻服务,按缺陷处理——先查清用途,无正当理由即关闭。