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

72 lines
5.4 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 | 反向代理,按域名分流(`sites-enabled/``git.patbond.cn``patbond-doc` | —— | ✅ 运行 |
| **文档站(patbond-doc** | 经 nginx 443 | mkdocs 构建产物,含架构/部署/迭代全部文档 | —— | ✅ 运行;⚠️ **公开可访问,待评估是否加 basic auth 或 IP 白名单**(无凭证内容,但暴露内部架构细节) |
| 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 已移除** | ⛔ 已停止 **且已 `systemctl disable`**2026-09-11,重启不再自启) |
## 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. **本页与实际不符即为缺陷**:核对时发现未登记的开放端口或常驻服务,按缺陷处理——先查清用途,无正当理由即关闭。
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 重做);外部验证四项通过 | [安全事件](iterations/iteration-3.5/07-security-incident-20260911.md) |