docs: update deployment documentation and add session logs

This commit is contained in:
2026-08-15 09:35:24 +08:00
parent b84ee9515f
commit 315d664b9c
2 changed files with 427 additions and 1 deletions
+56 -1
View File
@@ -521,4 +521,59 @@ echo " 3. 重载 Nginx: docker exec novalon-nginx-secure nginx -s reload"
1. **DNS 解析必须先完成**:SSL 证书申请需要域名已指向服务器 IP
2. **证书续期**:建议在现有 cron 任务中加入产品子域名的自动续期
3. **如果未来产品数量超过 15 个**,建议升级为泛域名证书(`*.novalon.cn`),可大幅简化证书管理
4. **文件更新**:更新某个产品的 HTML 文件后,只需替换 `sites/product-x/` 下的文件,无需重启 Nginx(静态文件通过 volume 挂载)
4. **文件更新**:更新某个产品的 HTML 文件后,只需替换 `sites/product-x/` 下的文件,无需重启 Nginx(静态文件通过 volume 挂载)
---
## 六、安全加固(2026-08-15 新增)
### 6.1 安全事件摘要(2026-08-14 发现并处置)
**事件**:生产服务器 Gitea 容器被入侵,git 操作被注入恶意钩子,导致 `git pull``bad pack header` / `early EOF`、响应延迟 4-6 秒。
**攻击链还原**
1. Gitea 内部 API`/api/internal/manager/add-logger`)经 nginx `location /` 暴露到公网,配合泄露的 `INTERNAL_TOKEN` 可远程调用(攻击来源 IP187.15.89.220,巴西)
2. 利用 `add-logger` 的日志文件路径能力向 `/data/gitea/home/.gitconfig` 追加写入 `[uploadpack] packObjectsHook = <base64 下载器>`
3. 每次 git 操作(upload-pack)触发钩子 → 从 C2 域名 `sitego-step-hu.pages.dev/setup-mon`Cloudflare Pages,挖矿/后门分发)下载并执行 payload
4. 恶意脚本以 git 用户权限回写 `.gitconfig` 与仓库 `hooks/` 实现持久化 —— **持久化位于 `/data` 卷,容器重建后依然保留**,这是本次排查最关键的教训
**影响范围**:Gitea 容器(git 用户权限);宿主机深度排查未发现入侵痕迹。
### 6.2 已执行的加固措施
| 措施 | 详情 |
|------|------|
| Gitea 升级 | `1.27.0``1.27.2`compose 文件:`novalon-cicd/gitea/docker-compose.yml` |
| 清理恶意文件 | 重写 `/data/gitea/home/.gitconfig`(移除 packObjectsHook 与日志注入行);恢复 `everything-is-suitable.git/hooks/pre-applypatch.sample` 为标准样本 |
| 封堵内部 API | nginx `git.f.novalon.cn.conf` 增加 `location ~ ^/api/internal/ { return 403; }`80/443 两个 server 块均已加) |
| 收紧代理信任 | `REVERSE_PROXY_TRUSTED_PROXIES = *``172.20.0.0/16,127.0.0.1` |
| 凭据轮换 | `INTERNAL_TOKEN``SECRET_KEY``LFS_JWT_SECRET`、OAuth `JWT_SECRET`、postgres 密码、4 个管理员密码全部更换 |
| 数据库清理 | 删除遗留 `forgejo` / `woodpecker` 数据库;引导超级用户角色改名 `postgres`(OID 不变,系统目录归属不受影响) |
| 内存优化 | Jenkins `JAVA_OPTS``-Xmx2g -Xms512m` 调为 `-Xmx1024m -Xms256m``daemon.json` 移除失效镜像源(dockerproxy.com 已死,会卡住镜像拉取) |
| SSE 长连接 | `location ~ /events$` 增加 `proxy_buffering off` + `proxy_read_timeout 3600s`(修复 `/user/events` 每 30s 被掐断的问题) |
### 6.3 安全基线(必须长期保持)
1. **内部 API 禁止公网可达**`/api/internal/*` 必须保持 403,任何新 nginx 配置不得代理该路径
2. **`INTERNAL_TOKEN` 不得泄露**:禁止出现在日志、备份、代码仓库中;定期轮换
3. **`REVERSE_PROXY_TRUSTED_PROXIES` 保持最小化**:仅 docker 网段 + 本机
4. **Gitea 版本保持最新**:当前 1.27.2,关注官方安全公告(1.26.4 / 1.27.x 有安全修复)
5. **管理员密码定期轮换**;评估切换到 `gitea/gitea:*-rootless` 镜像(当前非 rootless,容器内 s6 以 root 运行)
6. **凭据统一管理**postgres 密码同时存在于 `app.ini``secrets/db_passwd`,更换时必须两处同步
### 6.4 攻击排查速查表
| 项目 | 内容 |
|------|------|
| 恶意标记 | `giteahook` / `sitego-step` / `setup-mon` / `packObjectsHook` / `add-logger` |
| 重点检查点 | `/data/gitea/home/.gitconfig`、各仓库 `hooks/``docker diff <container>``ps aux \| grep base64` |
| 根因验证 | 原始 `git upload-pack` 正常 + 经 Gitea HTTP 失败 ⇒ 怀疑钩子/转发层被篡改 |
| 取证目录 | `/root/incident-20260814/`(恶意 .gitconfig、恶意 hook、容器 inspect、日志) |
| 数据库备份 | `/root/db-cleanup-20260815/`forgejo.sql.gz / woodpecker.sql.gz |
### 6.5 已知限制与待办
- **出网带宽 ≈ 1Mbps**(腾讯云实例限制,实测 110KB/s):248MB 仓库全量 clone 约需 35 分钟;建议在腾讯云控制台升级带宽(如 5-10Mbps),这是当前 git 使用体验的唯一瓶颈
- **jenkins 容器**:以 root 运行且挂载 `/var/run/docker.sock``/root/.ssh`(CI 构建需要,但一旦被攻破即等于宿主机沦陷,建议评估最小权限方案)
- **遗留 forgejo 引用**`dist_backup_20260422_161751/``novalon-website/.woodpecker.yml` 等旧文件中仍含 forgejo/woodpecker 配置,属历史归档,无需处理
- **监控缺失**:本次攻击 2026-08-11 开始,3 天后才被发现;建议配置 fail2ban + 容器日志告警 + 定时恶意文件扫描
File diff suppressed because one or more lines are too long