abdulraheem381/Taskflow-devsecops-ecs-pipeline

GitHub: abdulraheem381/Taskflow-devsecops-ecs-pipeline

一个集成完整 DevSecOps CI/CD 流水线的微服务任务管理应用,展示了从代码安全扫描到 AWS ECS Fargate 自动部署的全流程。

Stars: 0 | Forks: 0

# TaskFlow DevSecOps ECS Pipeline TaskFlow 是一个三服务 Web 应用程序,包裹在 DevSecOps CI/CD 流水线中。该仓库包含: - 一个 React 前端 - 一个用于注册、登录和基于 JWT 身份验证的 `auth-service` - 一个用于任务 CRUD 操作的 `tasks-service` - 用于 CI 和 CD 的 GitHub Actions 工作流 - 用于 AWS 基础设施配置的 Terraform - 用于容器打包和镜像分发的 Docker 和 Docker Hub 该项目的主要目标是展示一个可用于作品集的 DevSecOps 流程:`main` 分支上的代码更改会触发安全性和质量检查,镜像会被构建并推送到 Docker Hub,成功的 CI 可以自动将堆栈部署到 AWS ECS Fargate。为了演示使用,CD 工作流还支持手动 `destroy` 操作,以便可以移除基础设施以避免持续的云成本。 ## 截图 ### 登录页面 ![登录页面](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/ddfa52db8d182156.png) ### 仪表盘浅色 ![仪表盘浅色](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/cad8298c68182158.png) ### 仪表盘深色 ![仪表盘深色](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/f82427bc72182159.png) ## 项目概述 该仓库实现了一个基于微服务的任务管理应用程序及其周围的交付流水线。 ### 应用层 - `frontend`:由 Nginx 服务的 React + Vite UI - `auth-service`:使用 JWT 和 SQLite 的 Node.js/Express 身份验证 API - `tasks-service`:使用 SQLite 的 Node.js/Express 任务 API ### DevSecOps 层 - 在推送到 `main` 和拉取请求时进行 CI - Trivy 文件系统漏洞扫描 - OWASP Dependency-Check 报告生成和工件上传 - SonarCloud 代码扫描 - Docker 镜像构建并推送到 Docker Hub - CD 工作流使用 Terraform 应用或销毁 AWS 基础设施 ### 基础设施层 - AWS VPC - 公共子网 - Internet Gateway - 路由表和关联 - 安全组 - CloudWatch 日志组 - ECS 集群 - ECS 任务定义 - Fargate 上的 ECS 服务 - S3 中的远程 Terraform 状态 ## 仓库结构 ``` . |-- .github/ | `-- workflows/ | |-- devsecops-ecs-pipeline.yml | `-- cd-pipeline.yml |-- auth-service/ |-- frontend/ |-- screenshots/ |-- tasks-service/ |-- terraform/ |-- docker-compose.yml `-- README.md ``` ## 架构 ``` User | v Frontend (React + Nginx, port 3000 locally / 8080 in ECS) | +--> Auth API (Node.js, Express, SQLite, port 4001) | `--> Tasks API (Node.js, Express, SQLite, port 4002) GitHub Actions CI -> Trivy -> OWASP Dependency-Check -> SonarCloud -> Docker build and push GitHub Actions CD -> AWS credential configuration -> Terraform init/apply or destroy -> ECS Fargate deployment using Docker Hub images ``` ## 技术栈 ### 前端 - React 18 - Vite - Tailwind CSS - React Router - React DnD - Axios - Nginx ### 后端 - Node.js 20 - Express - 通过 `better-sqlite3` 使用 SQLite - 通过 `jsonwebtoken` 使用 JWT - 通过 `bcryptjs` 进行密码哈希 - Joi 验证 - Helmet - 速率限制 - Winston 日志记录 ### DevOps 和云 - GitHub Actions - Docker - Docker Buildx - Docker Hub - Trivy - OWASP Dependency-Check - SonarCloud - Terraform - AWS ECS Fargate - AWS VPC 网络 - AWS CloudWatch Logs - 用于 Terraform 状态的 Amazon S3 后端 ## 应用功能 - 用户注册和登录 - JWT 保护的路由 - 认证的 `me` 端点 - 任务的创建、更新、删除和列表 - 拖放式的看板风格面板 - 任务的表格视图 - 浅色和深色主题支持 - 所有服务的健康检查 - 容器化的本地开发和部署 ## 服务和端口 | 组件 | 本地端口 | ECS 容器端口 | 用途 | |---|---:|---:|---| | 前端 | `3000` | `8080` | Web UI | | 认证服务 | `4001` | `4001` | 注册、登录、JWT 验证 | | 任务服务 | `4002` | `4002` | 任务 CRUD | ## API 摘要 ### 认证服务 基础路径:`http://localhost:4001/api/auth` - `POST /register` - `POST /login` - `GET /me` - `GET /health` ### 任务服务 基础路径:`http://localhost:4002/api/tasks` - `GET /` - `GET /:id` - `POST /` - `PUT /:id` - `DELETE /:id` - `GET /health` ## CI 流水线 工作流文件:`.github/workflows/devsecops-ecs-pipeline.yml` ### 触发条件 - 推送到 `main` - 针对 `main` 的拉取请求 ### 作业顺序 1. `trivy-scan` 2. `owasp-scan` 3. `sonarqube-scan` 4. `build-and-push` 每个后续作业都依赖于前一个作业并使用 `needs`,因此流水线按顺序运行。 ### CI 的工作内容 #### 1. Trivy 文件系统扫描 - 以文件系统模式扫描仓库 - 查找操作系统和库漏洞 - 重点关注 `CRITICAL` 和 `HIGH` 严重程度的发现 #### OWASP Dependency-Check - 扫描仓库中的依赖项 - 生成 HTML 报告 - 将报告作为名为 `owasp-report` 的 GitHub Actions 工件上传 #### 3. SonarCloud 扫描 - 使用 SonarCloud 执行静态分析 - 使用 `SONAR_TOKEN` 和内置的 `GITHUB_TOKEN` #### 4. Docker 构建和推送 - 为以下服务构建镜像: - `auth-service` - `tasks-service` - `frontend` - 在 `push` 事件时将镜像推送到 Docker Hub - 在拉取请求时跳过推送 - 使用以下标签标记镜像: - `latest` - `${{ github.sha }}` ### Docker Hub 镜像名称 - `abdulraheem381/taskflow-auth-service:latest` - `abdulraheem381/taskflow-tasks-service:latest` - `abdulraheem381/taskflow-frontend:latest` ## CD 流水线 工作流文件:`.github/workflows/cd-pipeline.yml` ### 触发模式 #### 自动部署 CD 工作流监听 `DevSecOps Pipeline` 工作流的完成。如果 CI 成功完成,CD 可以自动运行并应用 Terraform 配置。 #### 手动部署或销毁 该工作流还支持带有 `action` 输入的 `workflow_dispatch`: - `apply` - `destroy` 这对于演示环境很有用,您可以在其中创建基础设施、测试应用程序,然后拆除所有内容以避免成本。 ### CD 的工作内容 1. 检出仓库 2. 从 GitHub Secrets 配置 AWS 凭证 3. 安装 Terraform 4. 运行 `terraform init` 5. 运行以下之一: - `terraform apply --auto-approve` - `terraform destroy --auto-approve` ## Terraform 基础设施 Terraform 文件位于 [`terraform`](./terraform) 目录中。 ### 后端状态 Terraform 配置为使用 S3 后端: - 存储桶:`taskflow-terraform-state-abdulraheem` - 键:`state/terraform.tfstate` - 区域:`ap-south-2` ### 配置的资源 - `aws_vpc` - `aws_internet_gateway` - 用于公共子网的 `aws_subnet` - `aws_route_table` - `aws_route_table_association` - `aws_security_group` - `aws_cloudwatch_log_group` - 用于 ECS 执行角色的 `aws_iam_role` - 用于 ECS 任务角色的 `aws_iam_role` - `aws_ecs_cluster` - `aws_ecs_task_definition` - `aws_ecs_service` ### ECS 部署模型 - 启动类型:`FARGATE` - 网络模式:`awsvpc` - 公共 IP 分配给任务 - 前端在端口 `8080` 上公开 - 安全组允许来自 `0.0.0.0/0` 的入站 `8080/tcp` - 前端依赖于健康的 `auth-service` 和 `tasks-service` 容器 - 日志发送到 CloudWatch ### 运行时容器镜像 Terraform 通过 `terraform.tfvars` 默认部署这些镜像: - `abdulraheem381/taskflow-frontend:latest` - `abdulraheem381/taskflow-auth-service:latest` - `abdulraheem381/taskflow-tasks-service:latest` ## 所需的 GitHub Secrets 要成功运行工作流,请配置这些仓库密钥: | 密钥 | 用途 | |---|---| | `DOCKERHUB_USERNAME` | Docker Hub 账户/用户名 | | `DOCKERHUB_TOKEN` | Docker Hub 访问令牌 | | `SONAR_TOKEN` | SonarCloud 身份验证 | |AWS_ACCESS_KEY_ID` | 用于 Terraform 部署/销毁的 AWS 访问密钥 | | `AWS_SECRET_ACCESS_KEY` | 用于 Terraform 部署/销毁的 AWS 秘密密钥 | ## 本地开发 ### 选项 1:使用 Docker Compose 运行 ``` docker-compose up --build ``` 打开: - 前端:`http://localhost:3000` - 认证 API:`http://localhost:4001/health` - 任务 API:`http://localhost:4002/health` ### 选项 2:手动运行每个服务 #### 前端 ``` cd frontend npm install npm run dev ``` #### 认证服务 ``` cd auth-service npm install npm run dev ``` #### 任务服务 ``` cd tasks-service npm install npm run dev ``` ### 环境文件 仓库包含示例环境文件: - `frontend/.env.example` - `auth-service/.env.example` - `tasks-service/.env.example` 前端变量: ``` VITE_AUTH_API_URL=http://localhost:4001/api/auth VITE_TASKS_API_URL=http://localhost:4002/api/tasks ``` 认证服务变量: ``` PORT=4001 NODE_ENV=development JWT_SECRET=change-me-to-a-long-random-secret JWT_EXPIRES_IN=8h DB_PATH=./data/auth.db CORS_ORIGIN=http://localhost:3000 LOG_LEVEL=info ``` 任务服务变量: ``` PORT=4002 NODE_ENV=development JWT_SECRET=change-me-to-a-long-random-secret DB_PATH=./data/tasks.db CORS_ORIGIN=http://localhost:3000 LOG_LEVEL=info ``` ## Docker 详情 ### 前端镜像 - 多阶段构建 - 使用 Node.js 构建 - 使用 Nginx 服务 - 暴露 `8080` ### 后端镜像 - 基于 `node:20-alpine` - 仅安装生产依赖 - 以非 root 用户运行 - 暴露 `4001` 和 `4002` - 包含容器健康检查 ## 应用中的安全控制 - JWT 身份验证 - 使用 `bcryptjs` 进行密码哈希 - Joi 请求验证 - Helmet 头 - Express 速率限制 - 每个服务的健康检查 - 结构化的请求和错误日志记录 ## 部署流程 1. 开发者将代码推送到 `main` 或打开针对 `main` 的拉取请求 2. CI 启动安全性和质量作业 3. 如果工作流到达镜像阶段,Docker 镜像会被构建 4. 在非 PR 事件上,镜像会被推送到 Docker Hub 5. 成功的 CI 运行可以触发 CD 工作流 6. CD 针对远程 S3 后端初始化 Terraform 7. Terraform 配置或更新 AWS 网络和 ECS 资源 8. ECS 从 Docker Hub 拉取镜像并启动应用程序 ## 销毁流程 为了演示和成本控制,该项目包含手动销毁路径。 1. 在 GitHub Actions 中打开 `CD Pipeline` 工作流 2. 选择 `Run workflow` 3. 选择 `destroy` 4. 运行工作流 5. Terraform 从 S3 读取远程状态并销毁配置的资源 这使项目易于演示,并避免让 AWS 资源不必要地持续运行。 ## 重要的实施说明 - CD 工作流区域设置为 `ap-south-2`。 - Terraform 变量 `aws_region` 的默认值是 `us-east-1`,但 `terraform.tfvars` 将其覆盖为 `ap-south-2`。 - 当前的 CI 工作流使用 SonarCloud,而不是自托管的 SonarQube 服务器。 - 当前的 Trivy 步骤配置为 `exit-code: '0'`,这意味着它报告发现但本身不会使作业失败。如果希望 Trivy 在检测到漏洞时硬性失败 CI,请将该值更改为 `1`。 - 当前的 ECS 部署直接在端口 `8080` 上使用公共 IP 和安全组公开前端;该仓库中没有 Application Load Balancer。 ## 此项目如何适合 DevSecOps 作品集 此项目展示: - 默认安全的应用开发 - 容器化的微服务 - CI 中的左移安全扫描 - 自动工件创建和注册表发布 - 使用 Terraform 的基础设施即代码 - 自动部署到 AWS ECS Fargate - 用于低成本演示的可控拆除 它适合作为动手 DevSecOps 作品集项目,因为它展示了从源代码到安全检查再到云部署的完整路径。 ## 许可证 该项目基于 MIT 许可证授权 - 有关详细信息,请参阅 [LICENSE](LICENSE) 文件。
标签:AWS, CloudWatch, DevSecOps, Docker, DPI, EC2, ECS, ECS, Express, Fargate, GitHub Actions, GNU通用公共许可证, IaC, JWT, MITM代理, Nginx, NIDS, Node.js, PoC框架, React, S3, SonarCloud, SQLite, Syscalls, Terraform, Terraform, VPC, 上游代理, 任务管理, 作品集项目, 前后端分离, 多服务架构, 安全扫描, 安全防御评估, 容器化, 日志, 时序注入, 演示项目, 特权提升, 监控, 网络安全组, 自动化部署, 自动笔记, 自定义脚本, 请求拦截