tryhackmeacct-netizen/P2.O
GitHub: tryhackmeacct-netizen/P2.O
该项目是一个以电商应用为场景的 DevSecOps 流水线实践仓库,通过 CI/CD 多阶段安全扫描门禁实现云原生应用的「安全左移」。
Stars: 1 | Forks: 0
# 电商应用的企业级 IaC DevSecOps Pipeline
## 目录
- [项目概述](#project-overview)
- [架构](#architecture)
- [技术栈](#technology-stack)
- [仓库结构](#repository-structure)
- [本地设置指南](#local-setup-guide)
- [CI/CD 工作流分解](#cicd-workflow-breakdown)
- [安全层](#security-layers)
- [漏洞演示](#vulnerability-demonstration)
- [截图](#screenshots)
- [学习成果](#learning-outcomes)
- [未来增强功能](#future-enhancements)
- [分支策略](#branch-strategy)
- [提交计划](#commit-plan)
## 项目概述
### 业务问题
在电子商务领域,快速部署至关重要。然而,云模板中的配置错误或未打补丁的依赖项可能会瞬间暴露海量消费者信息数据库。仅检查软件 bug 的传统 CI/CD pipeline 已不再足够。
### 为什么 DevSecOps 很重要
DevSecOps 将安全集成到软件开发生命周期的每个阶段,而不是将其视为事后补充。这种“左移”方法可以在修复成本最低的早期阶段发现漏洞。
### 为什么 IaC 安全很重要
基础设施即代码 (IaC) 在受版本控制的文件中定义云环境。一个错误的配置(例如,开放的安全组)可能会暴露整个生产环境。自动化的 IaC 扫描可以在配置基础设施之前防止这些问题。
### 为什么左移安全很重要
在开发阶段发现漏洞的成本比在生产阶段低 30 倍。左移安全可以在编码阶段、问题进入生产环境之前将其捕获。
## 架构
### 系统架构
```
graph TB
subgraph "Developer Workflow"
A[Developer] -->|git push| B[GitHub Repository]
A -->|PR| C[Feature Branch]
C -->|Review + CI| D[main branch]
end
subgraph "CI/CD Pipeline"
B --> E[Build & Test]
E --> F[SAST Scan]
F --> G[SCA Scan]
G --> H[Container Scan]
H --> I[IaC Scan]
I --> J[DAST Scan]
J --> K[Security Gate]
end
subgraph "Security Tools"
E --> E1[ESLint + Jest]
F --> F1[Semgrep + CodeQL]
G --> G1[Trivy Dependencies]
H --> H1[Trivy Container]
I --> I1[Checkov + TFSec]
J --> J1[OWASP ZAP]
end
subgraph "Deployment"
K -->|All pass| L[Merge to main]
K -->|Any fail| M[Block & Alert]
end
```
### Pipeline 流程
```
flowchart LR
subgraph "Stage 1: Build"
A[Checkout] --> B[Install]
B --> C[Lint]
C --> D[Test]
D --> E[Docker Build]
end
subgraph "Stage 2: SAST"
F[Semgrep] --> G[CodeQL]
end
subgraph "Stage 3: SCA"
H[Trivy Deps] --> I[Gitleaks]
end
subgraph "Stage 4: Container"
J[Build Image] --> K[Trivy Image]
end
subgraph "Stage 5: IaC"
L[Checkov] --> M[TFSec]
end
subgraph "Stage 6: DAST"
N[Start App] --> O[ZAP Scan]
end
subgraph "Stage 7: Gate"
P{All Pass?}
P -->|Yes| Q[Deploy]
P -->|No| R[Block]
end
E --> F
G --> H
I --> J
K --> L
M --> N
O --> P
```
### 安全门逻辑
```
flowchart TD
A[Security Gate Triggered] --> B{Check Each Scan}
B --> C[SAST]
B --> D[SCA]
B --> E[Container]
B --> F[IaC]
C --> G{All Pass?}
D --> G
E --> G
F --> G
G -->|Yes| H[Allow Merge]
G -->|No| I[Block Merge]
I --> J[Notify Team]
J --> K[Create Issue]
```
## 技术栈
| 组件 | 技术 | 选择原因 |
|-----------|-----------|------------|
| **Runtime** | Node.js 20 | 行业标准,卓越的生态系统 |
| **框架** | Express 4 | 轻量、灵活、使用广泛 |
| **容器化** | Docker | 通用的容器化标准 |
| **CI/CD** | GitHub Actions | 原生 GitHub 集成,对公开仓库免费 |
| **SAST** | Semgrep + CodeQL | Semgrep 用于快速模式匹配,CodeQL 用于深度分析 |
| **SCA** | Trivy | 全面、快速,支持多种格式 |
| **容器安全** | Trivy | 与 SCA 使用相同工具,体验一致 |
| **Secret 扫描** | Gitleaks | 防止 secret 进入代码库 |
| **IaC** | Terraform | 行业标准,支持多云 |
| **IaC 扫描** | Checkov + TFSec | Checkov 用于合规性,TFSec 用于最佳实践 |
| **DAST** | OWASP ZAP | 免费、全面、行业标准 |
| **测试** | Jest + Supertest | 快速,内置覆盖率,带有断言库 |
| **Linting** | ESLint | 高度可配置,规则集丰富 |
## 仓库结构
```
.
├── app/ # E-commerce application
│ ├── src/
│ │ ├── config/
│ │ │ ├── index.js # Configuration management
│ │ │ └── logger.js # Structured JSON logging
│ │ ├── middleware/
│ │ │ ├── auth.js # JWT authentication
│ │ │ ├── errorHandler.js # Centralized error handling
│ │ │ ├── validator.js # Input validation
│ │ │ └── rateLimiter.js # Rate limiting
│ │ ├── routes/
│ │ │ ├── index.js # Route aggregator
│ │ │ ├── health.js # Health check endpoints
│ │ │ ├── auth.js # Authentication routes
│ │ │ ├── products.js # Product CRUD routes
│ │ │ └── cart.js # Shopping cart routes
│ │ ├── models/
│ │ │ ├── User.js # User model
│ │ │ ├── Product.js # Product model
│ │ │ └── Cart.js # Cart model
│ │ ├── utils/
│ │ │ └── helpers.js # Utility functions
│ │ ├── app.js # Express app setup
│ │ └── server.js # Server entry point
│ ├── tests/
│ │ ├── health.test.js # Health endpoint tests
│ │ ├── auth.test.js # Authentication tests
│ │ ├── products.test.js # Product API tests
│ │ └── cart.test.js # Cart API tests
│ ├── Dockerfile # Multi-stage Docker build
│ ├── .dockerignore # Docker ignore rules
│ ├── .env.example # Environment template
│ ├── .eslintrc.json # ESLint configuration
│ └── package.json # Dependencies and scripts
├── infrastructure/
│ ├── insecure/ # Intentionally vulnerable IaC
│ │ ├── main.tf # Insecure VPC, SG, EC2, S3
│ │ ├── variables.tf
│ │ └── outputs.tf
│ ├── secure/ # Remediated IaC
│ │ ├── main.tf # Secure VPC, SG, EC2, S3
│ │ ├── variables.tf
│ │ └── outputs.tf
│ └── environments/
│ ├── dev/terraform.tfvars
│ └── prod/terraform.tfvars
├── .github/
│ ├── workflows/
│ │ ├── ci-build.yml # Build and test
│ │ ├── sast-scan.yml # SAST scanning
│ │ ├── sca-scan.yml # Dependency scanning
│ │ ├── container-scan.yml # Container scanning
│ │ ├── iac-scan.yml # IaC scanning
│ │ ├── dast-scan.yml # DAST scanning
│ │ └── security-gate.yml # Aggregated security gate
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ └── CODEOWNERS
├── .checkov.yml # Checkov configuration
├── .trivyignore # Trivy ignore list
├── .zap/
│ └── rules.tsv # ZAP alert thresholds
├── docker-compose.yml # Local development + tools
├── sonar-project.properties # SonarQube configuration
├── BRANCHING.md # Branch strategy
├── COMMITS.md # 28-day commit plan
├── PR-DESCRIPTIONS.md # PR descriptions
└── README.md # This file
```
## 本地设置指南
### 前置条件
- Node.js 20+
- Docker & Docker Compose
- Git
- (可选)Terraform 1.5+
### 安装
```
# 克隆仓库
git clone https://github.com/your-org/ecommerce-devsecops.git
cd ecommerce-devsecops
# 安装依赖
cd app && npm install
```
### 环境变量
```
# 复制环境模板
cp .env.example .env
# 使用您的值编辑 .env
JWT_SECRET=your-secure-random-string-min-32-chars
```
### 本地运行
```
# 启动服务器
npm start
# 或者使用 auto-reload(开发模式)
npm run dev
```
### 运行测试
```
# 运行所有测试
npm test
# 运行 coverage
npm run test:coverage
# Watch 模式
npm run test:watch
```
### 运行 Lint
```
# 检查 lint
npm run lint
# 自动修复
npm run lint:fix
```
### 使用 Docker 运行
```
# 构建并启动
docker compose up app
# 或者仅构建
docker build -t ecommerce-app ./app
# 运行容器
docker run -p 3000:3000 -e JWT_SECRET=your-secret ecommerce-app
```
### 在本地运行安全扫描
```
# 依赖扫描
docker run --rm -v $(pwd)/app:/app aquasec/trivy fs /app
# 容器扫描
docker build -t ecommerce-app ./app
docker run --rm aquasec/trivy image ecommerce-app
# SonarQube
docker compose --profile sast up -d sonarqube
# 访问 http://localhost:9000 (admin/admin)
```
### 运行 Terraform
```
cd infrastructure/secure
# 初始化
terraform init
# 计划
terraform plan -var-file=environments/dev/terraform.tfvars
# 应用(需要 AWS 凭证)
terraform apply -var-file=environments/dev/terraform.tfvars
# 销毁
terraform destroy -var-file=environments/dev/terraform.tfvars
```
## CI/CD 工作流分解
### 必需的 GitHub Secrets
| Secret | 描述 | 获取位置 |
|--------|-------------|--------------|
| `SONAR_TOKEN` | SonarQube 认证 token | SonarQube UI → My Account → Security |
| `SONAR_HOST_URL` | SonarQube 服务器 URL | 你的 SonarQube 实例 URL |
| `SEMGREP_APP_TOKEN` | Semgrep App token | semgrep.dev → Settings |
### 工作流摘要
| 工作流 | 触发条件 | 目的 | 失败门 |
|----------|---------|---------|--------------|
| `ci-build.yml` | 推送/PR 到 main | Lint、测试、Docker 构建 | 任何失败 |
| `sast-scan.yml` | 推送/PR,每周 | Semgrep + CodeQL | 严重发现 |
| `sca-scan.yml` | 推送/PR,每天 | Trivy 依赖 + Gitleaks | 严重/高危 CVE |
| `container-scan.yml` | 推送/PR | Trivy 容器 + Hadolint | 严重/高危 CVE |
| `iac-scan.yml` | 推送/PR,每周 | Checkov + TFSec | 高危配置错误 |
| `dast-scan.yml` | 手动,每周 | OWASP ZAP | 高风险警报 |
| `security-gate.yml` | 在任何工作流之后 | 聚合门 | 任何失败 |
### 失败场景
1. **SAST 失败**:代码包含安全漏洞 → 修复代码,重新运行
2. **SCA 失败**:依赖项存在 CVE → 更新依赖项,重新运行
3. **容器失败**:Docker 镜像存在漏洞 → 更新基础镜像,重新运行
4. **IaC 失败**:Terraform 存在配置错误 → 修复 terraform,重新运行
5. **DAST 失败**:发现 runtime 漏洞 → 修复代码,重新运行
### 修复流程
1. 检查失败的工作流运行
2. 下载 SARIF 报告 artifact
3. 查看报告中的发现
4. 在你的 feature 分支中修复问题
5. 推送更改 → 重新运行 pipeline
6. 全部通过后,请求 PR 审查
## 安全层
### 1. SAST (静态应用安全测试)
**目的:** 在不运行应用程序的情况下分析源代码中的安全漏洞。
**工具:** Semgrep, CodeQL
**优势:**
- 在开发早期捕获漏洞
- 适用于每次提交
- 无需运行应用程序
**示例发现:**
- SQL 注入
- 跨站脚本攻击 (XSS)
- 硬编码的 secret
- 不安全的反序列化
**修复建议:**
- 使用参数化查询
- 对用户输入进行清理
- 将 secret 移至环境变量
- 使用安全的序列化方法
### 2. SCA (软件成分分析)
**目的:** 识别第三方依赖项中的已知漏洞。
**工具:** Trivy, Gitleaks
**优势:**
- 捕获依赖项中的已知 CVE
- 防止供应链攻击
- 扫描 package-lock.json 以获取确切版本
**示例发现:**
- lodash < 4.17.21 中的 CVE-2023-12345
- express 中的原型链污染
- 代码中硬编码的 API key
**修复建议:**
- 更新易受攻击的包:`npm update`
- 使用 `npm audit fix`
- 替换无人维护的包
- 移除硬编码的 secret
### 3. 容器安全
**目的:** 扫描 Docker 镜像中的漏洞和配置错误。
**工具:** Trivy, Hadolint
**优势:**
- 捕获操作系统级别的漏洞
- 验证 Dockerfile 最佳实践
- 确保最小的攻击面
**示例发现:**
- 易受攻击的基础镜像(例如,node:14 存在 CVE)
- 以 root 用户运行
- 安装了不必要的包
- 缺少健康检查
**修复建议:**
- 使用最小化的基础镜像 (Alpine, Distroless)
- 以非 root 用户运行
- 移除不必要的包
- 添加健康检查
### 4. IaC 安全
**目的:** 在部署前检测基础设施代码中的配置错误。
**工具:** Checkov, TFSec
**优势:**
- 防止云配置错误
- 强制执行合规标准
- 在配置前捕获安全问题
**示例发现:**
- SSH 对 0.0.0.0/0 开放 (CKV_AWS_24)
- S3 存储桶未加密 (CKV_AWS_19)
- EC2 未启用 IMDSv2 (CKV_AWS_138)
- 安全组没有描述
**修复建议:**
- 将 SSH 限制在特定 IP
- 启用 S3 服务器端加密
- 在 EC2 上要求使用 IMDSv2
- 添加安全组描述
### 5. DAST (动态应用安全测试)
**目的:** 测试运行中的应用程序是否存在安全漏洞。
**工具:** OWASP ZAP
**优势:**
- 捕获 runtime 漏洞
- 测试实际的 HTTP 请求
- 发现只有在运行时才会出现的问题
**示例发现:**
- 跨站脚本攻击 (XSS)
- 通过 HTTP 进行的 SQL 注入
- 缺少安全标头
- 信息泄露
**修复建议:**
- 实施内容安全策略
- 使用参数化查询
- 添加安全标头
- 移除详细的错误消息
## 漏洞演示
### 不安全的 Terraform(第 3 周演示)
`infrastructure/insecure/` 目录包含故意设置了漏洞的 Terraform:
```
# INTENTIONAL:SSH 对 0.0.0.0/0 开放
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# INTENTIONAL:EC2 未加密
root_block_device {
encrypted = false
}
# INTENTIONAL:S3 允许公开读取
resource "aws_s3_bucket_policy" "data" {
policy = jsonencode({
Statement = [{
Effect = "Allow"
Principal = "*"
Action = "s3:GetObject"
}]
})
}
```
### 安全的 Terraform(已修复)
`infrastructure/secure/` 目录修复了所有问题:
```
# SECURE:SSH 限制为特定 CIDR
ingress {
from_port = 22
to_port = 22
cidr_blocks = var.allowed_ssh_cidrs # e.g., ["10.0.0.0/8"]
}
# SECURE:加密的 root volume
root_block_device {
encrypted = true
}
# SECURE:S3 启用 public access block
resource "aws_s3_bucket_public_access_block" "data" {
block_public_acls = true
block_public_policy = true
ignore_public_acls = true
restrict_public_buckets = true
}
```
## 截图
### 文档所需的截图
1. **GitHub Actions - 成功的构建**
- 所有阶段均为绿色(lint、测试、构建)
2. **Trivy 依赖扫描**
- 显示已扫描包的表格输出
3. **Trivy 容器扫描**
- 镜像漏洞评估
4. **Checkov IaC 扫描**
- 不安全:检测到多个失败
- 安全:所有检查通过
5. **OWASP ZAP 报告**
- 基线扫描结果
- 警报摘要
6. **SonarQube 仪表板**(如果是自托管)
- 质量门状态
- 代码异味和漏洞
7. **Docker 构建**
- 多阶段构建成功
8. **测试覆盖率报告**
- 覆盖率百分比和文件细分
## 学习成果
### DevSecOps
- 理解左移安全
- 将安全工具集成到 CI/CD
- 自动化漏洞检测
- 安全门实施
### 云安全
- AWS 安全最佳实践
- IAM 角色和策略
- VPC 和安全组配置
- S3 存储桶安全
- EC2 实例加固
### 基础设施即代码
- Terraform 模块设计
- 状态管理
- 环境隔离
- IaC 安全扫描
### 安全自动化
- GitHub Actions 工作流设计
- SARIF 报告生成
- Artifact 管理
- 自动化失败门
### CI/CD 安全
- Pipeline 安全阶段
- 安全工具集成
- 报告生成和分类
- 修复工作流
## 未来增强功能
1. **运行时应用自我保护 (RASP)** - 集成 RASP 以进行实时威胁检测
2. **Web 应用防火墙 (WAF)** - 添加 AWS WAF 用于 HTTP 过滤
3. **容器编排** - 使用 Helm charts 迁移到 Kubernetes
4. **服务网格** - 实施 Istio 以保障微服务安全
5. **API 网关** - 添加带有速率限制和身份验证的 AWS API Gateway
6. **Secret 管理** - 集成 AWS Secrets Manager 或 HashiCorp Vault
7. **合规性扫描** - 添加 SOC2、PCI-DSS 合规性检查
8. **镜像签名** - 使用 Cosign 实施容器镜像签名
9. **SBOM 生成** - 生成软件物料清单 (SBOM)
10. **混沌工程** - 添加 Gremlin 或 Litmus 进行弹性测试
11. **蓝绿部署** - 实施零停机部署策略
12. **金丝雀发布** - 添加逐步推出功能
13. **监控与警报** - 集成 Prometheus 和 Grafana
14. **日志聚合** - 添加 ELK stack 进行集中式日志记录
15. **事件响应** - 创建自动化的事件响应工作流
16. **渗透测试** - 安排定期的渗透测试
17. **漏洞赏金计划** - 实施负责任的披露计划
18. **安全培训** - 为开发人员添加自动化安全培训
## 分支策略
```
main (protected)
└── develop (integration)
├── feature/week1-containerization-sast
├── feature/week2-dependency-container-security
├── feature/week3-iac-security
└── feature/week4-dast-hardening
```
有关详细策略,请参阅 [BRANCHING.md](BRANCHING.md)。
## 提交计划
有关带有语义化消息的完整 28 天提交计划,请参阅 [COMMITS.mdCOMMITS.md)。
## 许可证
MIT
标签:DevSecOps, ECS, IaC安全, MITM代理, Terraform, Web截图, 上游代理, 容器安全, 自动化漏洞扫描, 请求拦截