Files
novalon-website/docs/plans/ALIGNMENT_JENKINS_SECURITY.md
T
张翔 042f66499a fix: complete test suite fixes - achieve 99.8% pass rate
- Add missing lucide-react icons (Users, Target, MessageCircle, Layers, CreditCard)
- Fix admin/page.test.tsx ESLint errors (add displayName)
- Fix api/contact/route.test.ts ESLint errors (remove any types, use import)
- Add RESEND_API_KEY environment variable for API tests
- All 122 test suites now passing
- Test pass rate: 99.8% (1499/1502 passed, 3 skipped)
2026-04-09 17:33:21 +08:00

341 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Jenkins生产环境安全加固 - 对齐文档
**作者:** 张翔
**日期:** 2026-04-07
**版本:** 1.0
**优先级:** 🔴 P0 - 紧急
**风险等级:** 🔴 严重
---
## 1. 需求理解
### 1.1 原始需求
**腾讯云安全报告:**
- Jenkins服务暴露在公网8080端口
- 黑客可利用该服务组件漏洞进行勒索攻击
- 可能导致数据加密或文件勒索
**当前状态:**
- ✅ 可以免密登录生产环境
- ⚠️ Jenkins直接暴露在公网
- ⚠️ 缺少访问控制和认证
- ⚠️ Webhook Token硬编码在配置文件中
### 1.2 核心场景定义
**场景属性:**
- **环境:** 生产环境(高可用要求)
- **风险:** 勒索攻击、供应链攻击、凭证泄露
- **影响范围:** Jenkins服务、CI/CD流水线、生产部署
- **紧急程度:** 立即处理(24小时内完成加固)
- **团队背景:** 有运维经验,熟悉Linux和Nginx
**关键约束:**
1. 不能影响现有CI/CD流水线运行
2. 加固过程需要可回滚
3. 必须保留审计日志
4. 需要零停机或最小化停机时间
---
## 2. 成功标准
### 2.1 功能性标准
- [ ] Jenkins不再直接暴露在公网8080端口
- [ ] 所有访问必须经过Nginx反向代理
- [ ] 启用HTTP Basic Auth认证
- [ ] Webhook端点配置IP白名单
- [ ] Webhook Token从配置文件中移除,使用环境变量
### 2.2 安全性标准
- [ ] 防火墙已阻止8080端口的外部访问
- [ ] Jenkins仅监听127.0.0.1
- [ ] 启用HTTPS强制重定向
- [ ] 配置安全响应头(HSTS、X-Frame-Options等)
- [ ] 启用访问审计日志
### 2.3 可验证性标准
- [ ] 外部无法直接访问http://SERVER_IP:8080
- [ ] 匿名访问返回401未授权
- [ ] 错误密码访问返回401
- [ ] Webhook签名验证生效
- [ ] CI/CD流水线正常运行
### 2.4 可维护性标准
- [ ] 所有配置已备份
- [ ] 提供回滚方案
- [ ] 文档完整(操作手册、应急响应)
- [ ] 监控和告警已配置
---
## 3. 技术选型与决策
### 3.1 方案对比
#### 方案A:多层防御架构(推荐)
**技术栈:**
- 网络层:防火墙(UFW/Firewalld)阻止8080端口
- 应用层:Nginx反向代理 + HTTPS + HTTP Basic Auth
- 认证层:Jenkins安全配置 + Webhook签名验证
- 审计层:Nginx访问日志 + 监控脚本
**优势:**
- ✅ 多层防御,深度安全
- ✅ 不影响现有CI/CD流水线
- ✅ 可逐步实施,风险可控
- ✅ 已有完整脚本和文档
**劣势:**
- ⚠️ 需要配置多个组件
- ⚠️ 需要重启Jenkins和Nginx服务
**适用场景:** 生产环境,高安全要求,有运维能力
#### 方案BVPN隔离方案
**技术栈:**
- VPN服务器(WireGuard/OpenVPN
- Jenkins仅允许VPN网络访问
- CI/CD通过VPN触发
**优势:**
- ✅ 完全隔离,安全性极高
- ✅ 适用于多服务隔离
**劣势:**
- ❌ 需要额外VPN服务器
- ❌ CI/CD配置复杂
- ❌ 增加运维成本
**适用场景:** 多服务需要隔离,有VPN基础设施
#### 方案C:云厂商WAF方案
**技术栈:**
- 腾讯云WAF
- 安全组规则
- 云防火墙
**优势:**
- ✅ 托管服务,无需维护
- ✅ 专业防护能力
**劣势:**
- ❌ 需要额外费用
- ❌ 依赖云厂商
- ❌ 配置灵活性较低
**适用场景:** 预算充足,依赖云厂商生态
### 3.2 决策建议
**推荐方案:方案A - 多层防御架构**
**决策依据:**
1. **安全性:** 多层防御满足安全要求
2. **成本:** 无需额外硬件或服务费用
3. **可控性:** 完全自主控制,不依赖第三方
4. **已有基础:** 项目已有完整脚本和文档
5. **快速实施:** 可在4小时内完成加固
---
## 4. 风险评估
### 4.1 实施风险
| 风险项 | 影响 | 概率 | 缓解措施 |
|--------|------|------|----------|
| Jenkins服务重启失败 | 高 | 低 | 提前备份,准备回滚脚本 |
| Nginx配置错误导致服务不可用 | 高 | 中 | 配置测试,逐步部署 |
| Webhook触发失败 | 中 | 中 | 保留原触发方式,验证后切换 |
| 认证失败无法访问 | 高 | 低 | 保留SSH访问,准备应急账号 |
### 4.2 业务影响
| 影响项 | 影响程度 | 持续时间 | 缓解措施 |
|--------|----------|----------|----------|
| CI/CD流水线暂停 | 中 | 5-10分钟 | 选择低峰时段执行 |
| Webhook不可用 | 中 | 5-10分钟 | 手动触发备份方案 |
| 访问方式变更 | 低 | 持续 | 提前通知团队 |
---
## 5. 执行计划
### 5.1 阶段划分
#### 阶段0:准备工作(30分钟)
- [ ] 确认生产环境访问权限
- [ ] 备份当前配置
- [ ] 准备应急响应方案
- [ ] 通知相关团队成员
#### 阶段1:快速响应(15分钟)
- [ ] 检查Jenkins是否已被攻击
- [ ] 临时阻止外部访问8080端口
- [ ] 检查可疑进程
- [ ] 备份当前配置
#### 阶段2:网络层加固(30分钟)
- [ ] 修改Jenkins监听地址为127.0.0.1
- [ ] 配置防火墙规则
- [ ] 验证网络隔离
#### 阶段3:应用层防护(45分钟)
- [ ] 生成HTTP Basic Auth密码
- [ ] 配置Nginx反向代理
- [ ] 配置HTTPS和SSL证书
- [ ] 配置安全响应头
#### 阶段4:认证授权层(30分钟)
- [ ] 配置Jenkins安全设置
- [ ] 配置Webhook签名验证
- [ ] 配置IP白名单
- [ ] 移除硬编码Token
#### 阶段5:审计监控层(20分钟)
- [ ] 配置访问日志
- [ ] 配置日志轮转
- [ ] 部署监控脚本
- [ ] 配置告警
#### 阶段6:验证与测试(30分钟)
- [ ] 运行安全验证脚本
- [ ] 执行渗透测试
- [ ] 验证CI/CD流水线
- [ ] 验证Webhook触发
### 5.2 时间估算
- **总时间:** 约3小时
- **停机时间:** 约10分钟(重启服务)
- **建议执行时间:** 低峰时段(如凌晨2:00-5:00
---
## 6. 验收标准
### 6.1 自动化验证
```bash
# 运行安全验证脚本
sudo /usr/local/bin/verify-jenkins-security.sh
```
**预期结果:** 所有检查项通过
### 6.2 手动验证清单
#### 网络层
- [ ] `netstat -tlnp | grep 8080` 显示 `127.0.0.1:8080`
- [ ] `curl http://SERVER_IP:8080` 连接被拒绝
- [ ] `ufw status | grep 8080` 显示 DENY
#### 应用层
- [ ] `nginx -t` 配置测试通过
- [ ] `curl -I https://DOMAIN/jenkins/` 返回 401
- [ ] `curl -I -u admin:password https://DOMAIN/jenkins/` 返回 200
#### 认证层
- [ ] Jenkins匿名访问被拒绝
- [ ] Webhook签名验证生效
- [ ] IP白名单生效
#### 审计层
- [ ] `/var/log/nginx/jenkins-access.log` 正常记录
- [ ] 日志轮转配置生效
- [ ] 监控脚本运行正常
### 6.3 CI/CD验证
- [ ] 手动触发Jenkins构建成功
- [ ] Webhook触发构建成功
- [ ] 构建产物正常部署
---
## 7. 应急响应
### 7.1 回滚方案
```bash
# 恢复Jenkins配置
sudo cp /tmp/jenkins-security-backup-*/jenkins-default.bak /etc/default/jenkins
# 恢复Nginx配置
sudo cp /tmp/jenkins-security-backup-*/nginx-conf/* /etc/nginx/conf.d/
# 重启服务
sudo systemctl restart jenkins
sudo systemctl restart nginx
# 开放8080端口(仅应急)
sudo ufw allow 8080/tcp
```
### 7.2 应急联系
- **安全负责人:** 张翔
- **运维支持:** [待填写]
- **管理决策:** [待填写]
---
## 8. 后续改进
### 8.1 短期(1个月内)
- [ ] 集成OAuth2/OIDC认证
- [ ] 配置多因素认证(MFA
- [ ] 完善监控告警
### 8.2 中期(3个月内)
- [ ] 部署WAFWeb应用防火墙)
- [ ] 配置入侵检测系统(IDS
- [ ] 实施安全信息和事件管理(SIEM
### 8.3 长期(6个月内)
- [ ] 实施零信任架构
- [ ] 微服务隔离
- [ ] 持续安全验证
---
## 9. 文档交付物
- [x] 对齐文档(本文档)
- [ ] 设计文档(DESIGN_JENKINS_SECURITY.md
- [ ] 执行检查清单(CHECKLIST_JENKINS_SECURITY.md
- [ ] 验证报告(VERIFICATION_REPORT.md
---
## 10. 决策确认
**关键决策点:**
1. **技术方案:** 采用多层防御架构(方案A
2. **执行时间:** 建议低峰时段执行
3. **停机时间:** 约10分钟
4. **回滚策略:** 保留完整备份,可快速回滚
**需要确认的问题:**
1. ❓ 是否有特定的执行时间窗口要求?
2. ❓ 是否需要通知外部团队或客户?
3. ❓ 是否有其他依赖Jenkins的服务需要考虑?
4. ❓ SSL证书是否已配置?
---
**文档状态:** ✅ 已完成
**下一步:** 等待确认后进入Architect阶段