209 lines
4.5 KiB
Markdown
209 lines
4.5 KiB
Markdown
|
|
# SOP-004: 应急响应标准作业流程
|
||
|
|
|
||
|
|
**适用**: P0 漏洞 / 数据丢失 / 服务中断 / 安全事件
|
||
|
|
**响应时间**: 5 分钟响应 + 30 分钟止血 + 24 小时根因
|
||
|
|
**关联**: [[风险跟踪表]] / [[CONTRIBUTING]] §紧急修复
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. 事件分级
|
||
|
|
|
||
|
|
| 等级 | 场景 | 响应时间 |
|
||
|
|
|---|---|---|
|
||
|
|
| 🔴 **P0 紧急** | P0 鉴权漏洞 + 数据泄露 + 服务全停 | 5 min |
|
||
|
|
| 🟠 **P1 高** | P1 功能故障 + 单服务降级 | 30 min |
|
||
|
|
| 🟡 **P2 中** | P2 性能 / UI 问题 | 4 h |
|
||
|
|
| 🟢 **P3 低** | 体验优化 | 1 周 |
|
||
|
|
|
||
|
|
## 2. P0 应急流程(5 min 响应)
|
||
|
|
|
||
|
|
### 2.1 立即止血
|
||
|
|
|
||
|
|
1. **服务降级**:
|
||
|
|
- 关闭外网访问:`sudo iptables -A INPUT -p tcp --dport 8418 -j DROP`
|
||
|
|
- 或:套件中心停 Gitea
|
||
|
|
- 或:Nginx `deny all;`
|
||
|
|
2. **停可疑服务**:
|
||
|
|
- 停后端:`docker compose stop backend`
|
||
|
|
- 停 WebSocket:`docker compose stop nginx`(整体停)
|
||
|
|
3. **保留现场**:
|
||
|
|
- 不删任何文件
|
||
|
|
- 复制 log 到 `/tmp/incident-{timestamp}/`
|
||
|
|
- 截图
|
||
|
|
|
||
|
|
### 2.2 通知
|
||
|
|
|
||
|
|
1. 微信 / 电话通知项目负责人 宋献
|
||
|
|
2. 邮件群发:`wecom-it-desk-incident@servyou-it.com`
|
||
|
|
3. 建应急群
|
||
|
|
|
||
|
|
### 2.3 临时回滚
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. 找上一个稳定版本
|
||
|
|
git tag -l # 看 release tag
|
||
|
|
git log --oneline -20 # 看 commit 历史
|
||
|
|
|
||
|
|
# 2. 回滚到上一个 commit
|
||
|
|
git revert HEAD # 生成新 commit 撤销
|
||
|
|
# 或
|
||
|
|
git reset --hard HEAD~1 # 强回滚(慎用)
|
||
|
|
|
||
|
|
# 3. 强推(临时,需 admin 权限)
|
||
|
|
git push -f origin main
|
||
|
|
```
|
||
|
|
|
||
|
|
## 3. 根因分析(24h 内)
|
||
|
|
|
||
|
|
### 3.1 收集证据
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 后端日志
|
||
|
|
docker logs backend --tail 1000 > /tmp/incident/backend.log
|
||
|
|
|
||
|
|
# nginx 错误日志
|
||
|
|
sudo cat /var/log/nginx/error.log > /tmp/incident/nginx-error.log
|
||
|
|
|
||
|
|
# Gitea 日志
|
||
|
|
sudo synopkg log Gitea > /tmp/incident/gitea.log
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.2 5 Why 分析
|
||
|
|
|
||
|
|
```markdown
|
||
|
|
# 5 Why 分析
|
||
|
|
|
||
|
|
**事件**: 坐席登录无鉴权
|
||
|
|
**Why 1**: agents.py login() 函数没用 Depends(get_current_*)
|
||
|
|
**Why 2**: workbuddy 加新端点时没跑 pre-commit-check
|
||
|
|
**Why 3**: pre-commit-check 不在 git commit hook 里
|
||
|
|
**Why 4**: 没用 pre-commit 框架(只是脚本)
|
||
|
|
**Why 5**: 流程规范没强制(评审可跳)
|
||
|
|
|
||
|
|
**根因**: 流程规范未自动化
|
||
|
|
**对策**: 加 pre-commit + Gitea Actions 强制
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.3 写事故报告
|
||
|
|
|
||
|
|
`docs/事故报告/incident-{date}-{topic}.md`:
|
||
|
|
|
||
|
|
```markdown
|
||
|
|
# 事故报告: {topic}
|
||
|
|
|
||
|
|
**日期**: {date}
|
||
|
|
**等级**: 🔴 P0
|
||
|
|
**响应人**: {name}
|
||
|
|
**持续**: X 分钟
|
||
|
|
|
||
|
|
## 1. 时序
|
||
|
|
| 时刻 | 事件 |
|
||
|
|
|---|---|
|
||
|
|
|
||
|
|
## 2. 影响范围
|
||
|
|
- 用户: X 人受影响
|
||
|
|
- 数据: 是否泄露
|
||
|
|
- 服务: 停 X 分钟
|
||
|
|
|
||
|
|
## 3. 5 Why 根因
|
||
|
|
...
|
||
|
|
|
||
|
|
## 4. 修复 commit
|
||
|
|
- {commit-hash}
|
||
|
|
- {commit-message}
|
||
|
|
|
||
|
|
## 5. 防止再发
|
||
|
|
- [ ] 加 pre-commit hook
|
||
|
|
- [ ] 加 Gitea Actions 强制
|
||
|
|
- [ ] 更新风险跟踪表
|
||
|
|
- [ ] 评审 SOP 更新
|
||
|
|
```
|
||
|
|
|
||
|
|
## 4. P1 应急流程(30 min 响应)
|
||
|
|
|
||
|
|
### 4.1 评估
|
||
|
|
|
||
|
|
- 是否影响生产用户?
|
||
|
|
- 是否有降级方案?
|
||
|
|
|
||
|
|
### 4.2 止血
|
||
|
|
|
||
|
|
- 单服务降级(关问题服务,其它继续)
|
||
|
|
- 临时禁用相关端点(nginx `location /api/v1/xxx { return 503; }`)
|
||
|
|
|
||
|
|
### 4.3 修复
|
||
|
|
|
||
|
|
- hotfix 分支(从 main 拉)
|
||
|
|
- PR + 评审 + 合并 + 部署
|
||
|
|
|
||
|
|
## 5. 数据丢失应急
|
||
|
|
|
||
|
|
### 5.1 Gitea 数据丢失
|
||
|
|
|
||
|
|
1. **别再操作** Gitea(避免覆盖)
|
||
|
|
2. 跑 `scripts/backup-gitea.sh --restore latest`
|
||
|
|
3. 验证:仓 commit 数 / token 列表
|
||
|
|
4. 不行:试更早备份
|
||
|
|
|
||
|
|
### 5.2 生产数据库丢失
|
||
|
|
|
||
|
|
1. 立即停所有服务(避免写入)
|
||
|
|
2. 看 PostgreSQL 数据目录:`/var/lib/postgresql/data`
|
||
|
|
3. 走 PITR(Point In Time Recovery)
|
||
|
|
4. 启用只读模式 + 通知用户
|
||
|
|
|
||
|
|
## 6. 安全事件
|
||
|
|
|
||
|
|
### 6.1 Token 泄露
|
||
|
|
|
||
|
|
1. **立即撤销** token:
|
||
|
|
```bash
|
||
|
|
curl -X DELETE -H "Authorization: token $ADMIN_TOKEN" \
|
||
|
|
"http://100.85.152.112:8418/api/v1/users/{username}/tokens"
|
||
|
|
```
|
||
|
|
2. 清 wincred 缓存
|
||
|
|
3. 创新 token + 配新凭据
|
||
|
|
4. 改所有引用旧 token 的脚本/配置
|
||
|
|
5. 评审日志:谁访问过 / 推过什么
|
||
|
|
|
||
|
|
### 6.2 入侵检测
|
||
|
|
|
||
|
|
1. 看 `auth.log` / `nginx-access.log` / `backend.log`
|
||
|
|
2. 找异常 IP / 时间 / 路径
|
||
|
|
3. 封 IP:`sudo iptables -A INPUT -s {ip} -j DROP`
|
||
|
|
4. 改所有密码 / 凭据
|
||
|
|
5. 走事件调查流程
|
||
|
|
|
||
|
|
## 7. 通讯模板
|
||
|
|
|
||
|
|
### 7.1 启动应急
|
||
|
|
|
||
|
|
```
|
||
|
|
【应急启动】{事件简述}
|
||
|
|
等级: 🔴 P0
|
||
|
|
影响: {用户/数据/服务}
|
||
|
|
已开始止血:{动作}
|
||
|
|
请相关人:{人名} 立即响应
|
||
|
|
群: {微信群名}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 7.2 解决通知
|
||
|
|
|
||
|
|
```
|
||
|
|
【已解决】{事件简述}
|
||
|
|
持续: X 分钟
|
||
|
|
修复: {commit-hash}
|
||
|
|
根因: {5 Why 结论}
|
||
|
|
防止再发: {动作}
|
||
|
|
报告: docs/事故报告/{file}.md
|
||
|
|
```
|
||
|
|
|
||
|
|
## 8. 联系
|
||
|
|
|
||
|
|
| 角色 | 联系人 |
|
||
|
|
|---|---|
|
||
|
|
| 项目负责人 | 宋献(企业微信 / 手机) |
|
||
|
|
| 运维 | IT 支持组 |
|
||
|
|
| NAS / Gitea | 群晖技术支持 |
|
||
|
|
| Tailscale | tailscale.com/support |
|