docs: 新增 3 个 Runbook - 配置更新、安全事件响应、事件响应
完成 Runbook 目录建设: - 05-config-update.md: 配置更新流程和回滚 - 06-security-incident.md: 安全事件分级和响应流程 - 07-incident-response.md: 服务事件分级和应急响应
This commit is contained in:
196
docs/runbooks/05-config-update.md
Normal file
196
docs/runbooks/05-config-update.md
Normal file
@@ -0,0 +1,196 @@
|
||||
# 配置更新 Runbook
|
||||
|
||||
## 触发条件
|
||||
- 修改系统配置
|
||||
- 更新环境变量
|
||||
- 更改配置文件
|
||||
|
||||
## 警告
|
||||
|
||||
**配置更新可能影响服务行为:**
|
||||
- 某些配置需要重启服务才能生效
|
||||
- 错误的配置可能导致服务启动失败
|
||||
- 生产环境修改前请确认备份
|
||||
|
||||
## 配置位置
|
||||
|
||||
```bash
|
||||
# 配置文件
|
||||
./configs/config.yaml
|
||||
|
||||
# 环境变量文件
|
||||
.env
|
||||
|
||||
# Docker Compose 配置
|
||||
docker-compose.yml
|
||||
```
|
||||
|
||||
## 配置更新步骤
|
||||
|
||||
### 1. 确认当前配置
|
||||
|
||||
```bash
|
||||
# 查看当前配置(测试环境)
|
||||
cat ./configs/config.yaml
|
||||
|
||||
# 查看环境变量
|
||||
cat .env | grep -v SECRET
|
||||
|
||||
# 确认服务状态
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
### 2. 备份当前配置
|
||||
|
||||
```bash
|
||||
# 备份配置文件
|
||||
cp ./configs/config.yaml ./configs/config.yaml.bak.$(date +%Y%m%d)
|
||||
|
||||
# 备份环境变量(不包含敏感值)
|
||||
cp .env .env.bak.$(date +%Y%m%d)
|
||||
```
|
||||
|
||||
### 3. 执行配置更新
|
||||
|
||||
#### 方式一:更新环境变量(推荐)
|
||||
|
||||
```bash
|
||||
# 编辑 .env 文件
|
||||
vi .env
|
||||
|
||||
# 常用配置项:
|
||||
# JWT_SECRET - JWT 签名密钥(必须 32+ 字符)
|
||||
# DB_TYPE - 数据库类型(sqlite/postgres)
|
||||
# DB_PATH - SQLite 数据库路径
|
||||
# TOTP_ENCRYPTION_KEY - TOTP 加密密钥
|
||||
# TZ - 时区设置
|
||||
```
|
||||
|
||||
#### 方式二:更新配置文件
|
||||
|
||||
```bash
|
||||
# 编辑配置文件
|
||||
vi ./configs/config.yaml
|
||||
|
||||
# 关键配置项:
|
||||
# jwt.secret - JWT 签名密钥
|
||||
# jwt.access_token_expire_minutes - Token 过期时间
|
||||
# server.port - 服务端口
|
||||
# cors.allow origins - CORS 白名单
|
||||
```
|
||||
|
||||
### 4. 验证配置更新
|
||||
|
||||
```bash
|
||||
# 重启服务使配置生效
|
||||
docker compose restart
|
||||
|
||||
# 检查服务状态
|
||||
docker compose ps
|
||||
|
||||
# 检查健康端点
|
||||
curl http://localhost:8080/api/v1/health
|
||||
|
||||
# 检查日志无错误
|
||||
docker compose logs | grep -i error
|
||||
```
|
||||
|
||||
### 5. 验证功能
|
||||
|
||||
```bash
|
||||
# 测试登录
|
||||
curl -X POST http://localhost:8080/api/v1/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"admin","password":"your-password"}'
|
||||
|
||||
# 测试需要认证的接口
|
||||
curl http://localhost:8080/api/v1/users \
|
||||
-H "Authorization: Bearer <token>"
|
||||
```
|
||||
|
||||
## 常见配置更新
|
||||
|
||||
### 1. 修改 JWT 密钥
|
||||
|
||||
```bash
|
||||
# 生成新密钥(32+ 字符随机字符串)
|
||||
openssl rand -base64 32
|
||||
|
||||
# 更新 .env
|
||||
echo "JWT_SECRET=your-new-secret-key-here" >> .env
|
||||
|
||||
# 重启服务
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
### 2. 修改数据库路径
|
||||
|
||||
```bash
|
||||
# 编辑配置文件
|
||||
vi ./configs/config.yaml
|
||||
|
||||
# 修改 db.path
|
||||
# 注意:修改数据库路径后需要确保新路径可写
|
||||
|
||||
# 重启服务
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
### 3. 修改 CORS 配置
|
||||
|
||||
```bash
|
||||
# 编辑配置文件
|
||||
vi ./configs/config.yaml
|
||||
|
||||
# 修改 cors.allow_origins
|
||||
# 例如:["http://localhost:3000", "https://yourdomain.com"]
|
||||
|
||||
# 重启服务
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
### 4. 修改端口
|
||||
|
||||
```bash
|
||||
# 编辑 docker-compose.yml
|
||||
vi docker-compose.yml
|
||||
|
||||
# 修改 ports:
|
||||
# - "8080:8080" -> - "8090:8080"
|
||||
|
||||
# 重启服务
|
||||
docker compose down
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## 回滚步骤
|
||||
|
||||
如果配置更新后服务异常:
|
||||
|
||||
```bash
|
||||
# 停止服务
|
||||
docker compose stop
|
||||
|
||||
# 恢复配置文件
|
||||
cp ./configs/config.yaml.bak.* ./configs/config.yaml
|
||||
|
||||
# 恢复环境变量
|
||||
cp .env.bak.* .env
|
||||
|
||||
# 重启服务
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
## 配置验证清单
|
||||
|
||||
- [ ] 配置文件语法正确
|
||||
- [ ] 环境变量已正确设置
|
||||
- [ ] 服务成功启动
|
||||
- [ ] 健康检查通过
|
||||
- [ ] 主要功能正常
|
||||
- [ ] 已通知相关人员配置变更
|
||||
|
||||
## 联系人
|
||||
|
||||
- 运维负责人:[填写]
|
||||
- 开发团队:[填写]
|
||||
223
docs/runbooks/06-security-incident.md
Normal file
223
docs/runbooks/06-security-incident.md
Normal file
@@ -0,0 +1,223 @@
|
||||
# 安全事件响应 Runbook
|
||||
|
||||
## 触发条件
|
||||
- 发现未授权访问
|
||||
- 收到安全漏洞报告
|
||||
- 发现异常登录行为
|
||||
- 遭受 DDoS 攻击
|
||||
- 发现数据泄露
|
||||
|
||||
## 紧急程度
|
||||
|
||||
| 级别 | 说明 | 响应时间 |
|
||||
|------|------|----------|
|
||||
| P0 | 数据泄露、服务器被入侵 | 立即 |
|
||||
| P1 | 账户被盗用、疑似入侵 | 1小时内 |
|
||||
| P2 | 暴力破解、异常行为 | 4小时内 |
|
||||
| P3 | 潜在漏洞、配置风险 | 24小时内 |
|
||||
|
||||
## 响应步骤
|
||||
|
||||
### P0/P1 紧急响应(数据泄露、服务器被入侵)
|
||||
|
||||
#### 1. 立即隔离
|
||||
|
||||
```bash
|
||||
# 立即停止服务(保持证据)
|
||||
docker compose kill
|
||||
|
||||
# 阻止外部访问(防火墙)
|
||||
sudo ufw deny 8080/tcp
|
||||
|
||||
# 不要删除任何日志或数据 - 这是证据
|
||||
```
|
||||
|
||||
#### 2. 通知相关人员
|
||||
|
||||
```bash
|
||||
# 通知运维负责人
|
||||
# 通知开发团队
|
||||
# 通知安全团队
|
||||
# 如有数据泄露,通知法务/合规团队
|
||||
```
|
||||
|
||||
#### 3. 保留证据
|
||||
|
||||
```bash
|
||||
# 导出当前日志
|
||||
docker compose logs > incident_logs_$(date +%Y%m%d_%H%M%S).txt
|
||||
|
||||
# 备份数据库(包含时间戳)
|
||||
cp ./data/user_management.db ./data/user_management.db.incident.$(date +%Y%m%d)
|
||||
|
||||
# 记录当前系统状态
|
||||
docker compose ps > system_status_$(date +%Y%m%d_%H%M%S).txt
|
||||
```
|
||||
|
||||
#### 4. 评估影响
|
||||
|
||||
```bash
|
||||
# 检查未授权操作
|
||||
grep -E "unauthorized|failed login|invalid token" ./logs/app.log | tail -100
|
||||
|
||||
# 检查异常 IP 访问
|
||||
grep "client_ip" ./logs/app.log | awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
|
||||
|
||||
# 检查账户异常
|
||||
sqlite3 ./data/user_management.db "SELECT username, created_at, last_login FROM users WHERE status='suspended';"
|
||||
```
|
||||
|
||||
#### 5. 恢复服务(在隔离后)
|
||||
|
||||
```bash
|
||||
# 在确定原因并修复后,以最小权限重新启动
|
||||
docker compose up -d
|
||||
|
||||
# 监控系统异常
|
||||
docker compose logs -f | grep -E "error|warning|unauthorized"
|
||||
```
|
||||
|
||||
### P2 响应(账户被盗用、疑似入侵)
|
||||
|
||||
#### 1. 确认事件
|
||||
|
||||
```bash
|
||||
# 检查登录日志
|
||||
docker compose logs | grep -E "login|logout" | tail -50
|
||||
|
||||
# 检查失败登录尝试
|
||||
grep "login.*failed" ./logs/app.log | tail -20
|
||||
|
||||
# 检查异常 IP
|
||||
grep "192.168.1.1" ./logs/app.log # 替换为可疑IP
|
||||
```
|
||||
|
||||
#### 2. 锁定可疑账户
|
||||
|
||||
```bash
|
||||
# 暂停可疑账户
|
||||
curl -X PUT http://localhost:8080/api/v1/users/{user_id}/status \
|
||||
-H "Authorization: Bearer <admin_token>" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"status":"suspended"}'
|
||||
|
||||
# 撤销可疑设备信任
|
||||
curl -X POST http://localhost:8080/api/v1/devices/{device_id}/untrust \
|
||||
-H "Authorization: Bearer <admin_token>"
|
||||
```
|
||||
|
||||
#### 3. 重置相关凭证
|
||||
|
||||
```bash
|
||||
# 强制用户重置密码
|
||||
# 通过管理员后台操作
|
||||
|
||||
# 撤销所有活跃 token
|
||||
# 需要开发团队介入清理 Redis/session 存储
|
||||
```
|
||||
|
||||
### P3 响应(潜在漏洞、配置风险)
|
||||
|
||||
#### 1. 记录漏洞
|
||||
|
||||
```bash
|
||||
# 创建漏洞记录
|
||||
cat > vulnerability_report_$(date +%Y%m%d).md << EOF
|
||||
# 漏洞报告
|
||||
|
||||
日期:[填写]
|
||||
发现人:[填写]
|
||||
漏洞描述:[详细描述]
|
||||
影响范围:[评估影响]
|
||||
复现步骤:[如何复现]
|
||||
修复建议:[建议的修复方案]
|
||||
EOF
|
||||
```
|
||||
|
||||
#### 2. 验证漏洞
|
||||
|
||||
```bash
|
||||
# 如果是配置问题,检查当前配置
|
||||
cat ./configs/config.yaml | grep -E "jwt|secret|password"
|
||||
|
||||
# 如果是代码漏洞,在测试环境复现
|
||||
```
|
||||
|
||||
#### 3. 修复验证
|
||||
|
||||
```bash
|
||||
# 在测试环境验证修复
|
||||
# 确认修复有效后,在维护窗口更新生产环境
|
||||
```
|
||||
|
||||
## 安全检查清单
|
||||
|
||||
### 立即检查
|
||||
|
||||
- [ ] 服务已隔离或已停止(如需要)
|
||||
- [ ] 防火墙规则已更新
|
||||
- [ ] 相关人员已通知
|
||||
- [ ] 证据已保存
|
||||
|
||||
### 事件评估
|
||||
|
||||
- [ ] 确认受影响账户/数据范围
|
||||
- [ ] 确认攻击向量
|
||||
- [ ] 评估业务影响
|
||||
|
||||
### 恢复步骤
|
||||
|
||||
- [ ] 已修复漏洞/攻击向量
|
||||
- [ ] 已重置受影响凭证
|
||||
- [ ] 已加强监控
|
||||
- [ ] 服务已恢复正常
|
||||
|
||||
### 事后处理
|
||||
|
||||
- [ ] 编写事件报告
|
||||
- [ ] 更新安全措施
|
||||
- [ ] 安排复盘会议
|
||||
- [ ] 更新 Runbook
|
||||
|
||||
## 常用命令参考
|
||||
|
||||
```bash
|
||||
# 查看活跃登录
|
||||
docker compose logs | grep "login.*success"
|
||||
|
||||
# 查看失败登录
|
||||
docker compose logs | grep "login.*failed"
|
||||
|
||||
# 查看 Token 验证失败
|
||||
docker compose logs | grep "invalid token"
|
||||
|
||||
# 查看账户创建
|
||||
docker compose logs | grep "user.*created"
|
||||
|
||||
# 查看权限变更
|
||||
docker compose logs | grep "permission"
|
||||
|
||||
# 踢出指定用户所有会话
|
||||
curl -X POST http://localhost:8080/api/v1/users/{user_id}/logout-all
|
||||
|
||||
# 禁用账户
|
||||
curl -X PUT http://localhost:8080/api/v1/users/{user_id}/status \
|
||||
-H "Authorization: Bearer <admin_token>" \
|
||||
-d '{"status":"suspended"}'
|
||||
```
|
||||
|
||||
## 联系人
|
||||
|
||||
- 安全团队:[填写]
|
||||
- 运维负责人:[填写]
|
||||
- 开发团队:[填写]
|
||||
- 法务/合规:[填写]
|
||||
|
||||
## 事后复盘
|
||||
|
||||
事件响应完成后,需要:
|
||||
1. 编写详细事件报告
|
||||
2. 分析根本原因
|
||||
3. 制定长期改进措施
|
||||
4. 更新安全 Runbook
|
||||
5. 进行团队培训
|
||||
250
docs/runbooks/07-incident-response.md
Normal file
250
docs/runbooks/07-incident-response.md
Normal file
@@ -0,0 +1,250 @@
|
||||
# 事件响应 Runbook
|
||||
|
||||
## 触发条件
|
||||
- 服务无响应
|
||||
- 服务报错
|
||||
- 性能严重下降
|
||||
- 依赖服务故障
|
||||
- 硬件/基础设施故障
|
||||
|
||||
## 事件分级
|
||||
|
||||
| 级别 | 说明 | 响应时间 | 示例 |
|
||||
|------|------|----------|------|
|
||||
| SEV1 | 服务完全不可用 | 立即 | 服务崩溃、数据库损坏 |
|
||||
| SEV2 | 部分功能不可用 | 30分钟内 | 登录失败、API 超时 |
|
||||
| SEV3 | 性能下降 | 2小时内 | 响应变慢、偶发错误 |
|
||||
| SEV4 | 轻微问题 | 24小时内 | 日志错误、非关键功能异常 |
|
||||
|
||||
## SEV1 响应(服务完全不可用)
|
||||
|
||||
### 1. 确认事件
|
||||
|
||||
```bash
|
||||
# 检查服务状态
|
||||
docker compose ps
|
||||
|
||||
# 检查容器日志
|
||||
docker compose logs --tail=100
|
||||
|
||||
# 检查系统资源
|
||||
docker stats --no-stream
|
||||
```
|
||||
|
||||
### 2. 收集信息
|
||||
|
||||
```bash
|
||||
# 保存当前日志
|
||||
docker compose logs > incident_logs_$(date +%Y%m%d_%H%M%S).txt
|
||||
|
||||
# 检查磁盘空间
|
||||
df -h
|
||||
|
||||
# 检查内存
|
||||
free -h
|
||||
|
||||
# 检查进程
|
||||
ps aux | grep docker
|
||||
```
|
||||
|
||||
### 3. 尝试重启
|
||||
|
||||
```bash
|
||||
# 优雅重启
|
||||
docker compose restart
|
||||
|
||||
# 等待 30 秒后检查
|
||||
sleep 30
|
||||
docker compose ps
|
||||
curl http://localhost:8080/api/v1/health
|
||||
```
|
||||
|
||||
### 4. 如果重启失败
|
||||
|
||||
```bash
|
||||
# 查看详细错误
|
||||
docker compose up
|
||||
|
||||
# 检查端口占用
|
||||
lsof -i :8080
|
||||
|
||||
# 检查配置文件
|
||||
cat ./configs/config.yaml
|
||||
```
|
||||
|
||||
### 5. 数据库问题
|
||||
|
||||
```bash
|
||||
# 检查数据库文件
|
||||
ls -la ./data/
|
||||
|
||||
# 验证 SQLite 完整性
|
||||
sqlite3 ./data/user_management.db "PRAGMA integrity_check;"
|
||||
|
||||
# 如果损坏,从备份恢复
|
||||
./scripts/backup/backup.sh --restore
|
||||
```
|
||||
|
||||
## SEV2 响应(部分功能不可用)
|
||||
|
||||
### 1. 确认问题范围
|
||||
|
||||
```bash
|
||||
# 测试健康端点
|
||||
curl http://localhost:8080/api/v1/health
|
||||
|
||||
# 测试登录
|
||||
curl -X POST http://localhost:8080/api/v1/auth/login \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"test","password":"test"}'
|
||||
|
||||
# 查看错误日志
|
||||
docker compose logs | grep -E "error|ERROR|fail|FAIL" | tail -50
|
||||
```
|
||||
|
||||
### 2. 检查依赖
|
||||
|
||||
```bash
|
||||
# 检查数据库连接
|
||||
docker compose logs | grep -i "database"
|
||||
|
||||
# 检查外部服务(如邮件、短信)
|
||||
docker compose logs | grep -i "external\|oauth\|sms\|email"
|
||||
```
|
||||
|
||||
### 3. 针对性修复
|
||||
|
||||
```bash
|
||||
# 如果是数据库连接问题
|
||||
docker compose restart
|
||||
|
||||
# 如果是配置问题,更新配置后重启
|
||||
vi ./configs/config.yaml
|
||||
docker compose restart
|
||||
|
||||
# 如果是资源问题,清理资源
|
||||
docker system prune -a
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
## SEV3 响应(性能下降)
|
||||
|
||||
### 1. 诊断
|
||||
|
||||
```bash
|
||||
# 查看实时资源使用
|
||||
docker stats
|
||||
|
||||
# 检查慢请求
|
||||
grep -E "[0-9]+ms" ./logs/app.log | awk '{if($NF ~ /[0-9]+ms/ && $NF+0 > 1000) print}' | head -20
|
||||
|
||||
# 检查数据库查询
|
||||
sqlite3 ./data/user_management.db "SELECT COUNT(*) FROM users;"
|
||||
|
||||
# 查看当前连接数
|
||||
lsof ./data/user_management.db | wc -l
|
||||
```
|
||||
|
||||
### 2. 常见解决方案
|
||||
|
||||
```bash
|
||||
# 重启服务清理缓存
|
||||
docker compose restart
|
||||
|
||||
# 如果是数据库锁等待,等待或重启
|
||||
docker compose restart
|
||||
|
||||
# 检查是否有慢查询
|
||||
# 参考 04-log-analysis.md 的查询分析
|
||||
```
|
||||
|
||||
### 3. 监控恢复
|
||||
|
||||
```bash
|
||||
# 持续监控
|
||||
watch -n 5 'curl -s http://localhost:8080/api/v1/health'
|
||||
|
||||
# 检查响应时间
|
||||
time curl -s http://localhost:8080/api/v1/health
|
||||
```
|
||||
|
||||
## SEV4 响应(轻微问题)
|
||||
|
||||
### 1. 记录问题
|
||||
|
||||
```bash
|
||||
# 创建问题记录
|
||||
cat > issue_$(date +%Y%m%d).md << EOF
|
||||
# 问题记录
|
||||
|
||||
日期:[填写]
|
||||
问题描述:[详细描述]
|
||||
影响:[影响范围]
|
||||
日志:[相关日志片段]
|
||||
EOF
|
||||
```
|
||||
|
||||
### 2. 安排修复
|
||||
|
||||
```bash
|
||||
# 在下一个维护窗口修复
|
||||
# 或安排开发团队跟进
|
||||
```
|
||||
|
||||
## 回滚步骤
|
||||
|
||||
如果当前修复导致新问题:
|
||||
|
||||
```bash
|
||||
# 停止服务
|
||||
docker compose stop
|
||||
|
||||
# 恢复到上一个稳定版本
|
||||
git checkout <previous-version>
|
||||
docker compose up -d
|
||||
|
||||
# 或从备份恢复数据
|
||||
./scripts/backup/backup.sh --restore
|
||||
```
|
||||
|
||||
## 事件恢复清单
|
||||
|
||||
- [ ] 服务恢复正常
|
||||
- [ ] 健康检查通过
|
||||
- [ ] 主要功能验证正常
|
||||
- [ ] 性能指标正常
|
||||
- [ ] 无新增错误
|
||||
- [ ] 通知相关人员恢复完成
|
||||
|
||||
## 联系人
|
||||
|
||||
- 运维负责人:[填写]
|
||||
- 开发团队:[填写]
|
||||
- 基础设施团队:[填写]
|
||||
- 项目经理:[填写]
|
||||
|
||||
## 事后处理
|
||||
|
||||
### 1. 事件记录
|
||||
|
||||
创建详细的事件报告,包括:
|
||||
- 事件时间线
|
||||
- 根本原因
|
||||
- 影响评估
|
||||
- 修复步骤
|
||||
- 经验教训
|
||||
|
||||
### 2. 预防措施
|
||||
|
||||
根据事件分析:
|
||||
- 增强监控告警
|
||||
- 优化自动化恢复流程
|
||||
- 更新 Runbook
|
||||
- 加强容量规划
|
||||
|
||||
### 3. 复盘会议
|
||||
|
||||
- 讨论事件过程
|
||||
- 识别改进点
|
||||
- 分配行动项
|
||||
- 更新应急流程
|
||||
@@ -57,4 +57,4 @@
|
||||
|
||||
---
|
||||
|
||||
*最后更新:2026-04-08*
|
||||
*最后更新:2026-04-08(新增 05-07 Runbook)*
|
||||
|
||||
Reference in New Issue
Block a user