Dev #21
+56
-1
@@ -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` 可远程调用(攻击来源 IP:187.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
Reference in New Issue
Block a user