Files
patbond-doc/docs/development/server-exposure.md
T
lixi 38d9e97174
CI / docs-build (push) Successful in 2m58s
docs: M3.5 收口报告 + 暴露面清单补全(文档站/处置记录/凭证纪律)
- 06 M3.5 收口:6 项用户反馈处置结果、迁移预估被审计推翻的教训、
  关键语义定型(/me 不回退、PATCH 三态、头像权限按字段定档、昵称按码点计)、
  实现期 4 项发现、契约 v1.4.0 纯增量承诺、遗留 5 项
- server-exposure.md 补:patbond-doc 文档站(漏记)、2026-09-11 处置记录、
  纪律 6「凭证不进任何可留存介质」与纪律 7「配置备份不留配置目录」

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-11 18:05:12 +08:00

5.4 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 反向代理,按域名分流(sites-enabled/git.patbond.cnpatbond-doc —— 运行
文档站(patbond-doc 经 nginx 443 mkdocs 构建产物,含架构/部署/迭代全部文档 —— 运行;⚠️ 公开可访问,待评估是否加 basic auth 或 IP 白名单(无凭证内容,但暴露内部架构细节)
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 已移除 已停止 且已 systemctl disable2026-09-11,重启不再自启)

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. 本页与实际不符即为缺陷:核对时发现未登记的开放端口或常驻服务,按缺陷处理——先查清用途,无正当理由即关闭。
  6. 凭证不进任何可留存介质:生成/轮换凭证时一律「直接落盘不回显」(如 NEW=$(gitea generate secret X); sed -i ...; unset NEW),不打印到终端、不粘贴进聊天记录、不写入报告或日志。协作规则原本只约束「不入库」,2026-09-11 的处置中新 token 被回显并粘贴,故扩展此条。
  7. 配置备份不留在配置目录sites-available/*.bak.* 之类应移出(如 /root/nginx-backups/)——留在配置目录里,一旦 include 通配符被改宽或软链手误就会激活旧配置。

5. 处置与核对记录

日期 动作 触发
2026-09-11 Gitea 改仅监听 127.0.0.1;防火墙删 3000/8848/9848/2222;停并 disable Nacos;清理被注入的 gitconfignginx 增 /api/internal/ 全拒;轮换 INTERNAL_TOKEN(两次——首次回显后按纪律 6 重做);外部验证四项通过 安全事件