38d9e97174
CI / docs-build (push) Successful in 2m58s
- 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>
72 lines
5.4 KiB
Markdown
72 lines
5.4 KiB
Markdown
# 服务器暴露面清单(常设)
|
||
|
||
> **定位**:跨迭代常设文档——服务器上**每个对公网开放的端口**与**每个常驻服务**都必须在此登记:用途、归属决策、谁在用、最后确认日期。
|
||
> **缘起**: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 | HTTPS:Gitea 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 | —— | ✅ 运行 |
|
||
| 腾讯云 agent(barad_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;清理被注入的 gitconfig;nginx 增 `/api/internal/` 全拒;轮换 `INTERNAL_TOKEN`(两次——首次回显后按纪律 6 重做);外部验证四项通过 | [安全事件](iterations/iteration-3.5/07-security-incident-20260911.md) |
|