simonchitepo/azure-secure-api-lab

GitHub: simonchitepo/azure-secure-api-lab

一个以云安全和 DevSecOps 为核心的 Azure FastAPI 部署实验室,演示如何安全地构建、部署和监控生产级云 API。

Stars: 0 | Forks: 0

# Azure Secure API Lab ## 1. 问题描述 许多初级的云项目仅仅证明了应用程序可以运行,但并未证明该应用程序是安全的、受到监控的、已文档化的,或者是通过适当的云安全控制部署的。 本项目演示了如何以云安全和 DevSecOps 的思维来构建和部署一个小型 API。 目标是展示对以下方面的实际理解: - 安全的 Azure 部署 - IAM 和最小权限原则 - 密钥管理 - HTTPS/TLS - 日志和监控 - 威胁建模 - 安全控制文档 - GitHub Actions CI - 未来的 Terraform 基础设施 本项目特意保持较小的规模,以便将主要精力集中在安全性、云架构、文档和证据上。 ## 2. 我构建了什么 我构建了一个小型的 FastAPI 应用程序,暴露了以安全为重点的端点。 该 API 包含: | 端点 | 方法 | 用途 | |---|---|---| | `/` | GET | 项目概述 | | `/health` | GET | 健康检查端点 | | `/security-status` | GET | 显示当前和计划中的安全控制 | | `/risk-check` | POST | 接收资产详情并返回简单的风险评分 | 该 API 被用作一个实用的云安全实验室。应用程序逻辑很简单,但周边的工程工作才是重点:部署、IAM、文档、监控、密钥处理和威胁建模。 ## 3. 项目目标 本仓库的目标是证明我能够安全地部署一个生产级的云应用程序,而不仅仅是编写代码。 该项目是我的云安全 / DevSecOps 作品集的一部分,旨在为以下初级岗位提供证明: - 初级云安全分析师 - 初级 DevSecOps 工程师 - 云支持安全 - 初级平台工程师 - IAM / 漏洞分析师 ## 4. 架构摘要 用户通过 HTTPS 访问 API。该 API 运行在 Azure App Service 上。应用程序配置最初通过环境变量处理,随后使用 Managed Identity 转移到 Azure Key Vault。 应用程序遥测和日志将发送到 Azure Application Insights 和 Log Analytics。GitHub Actions 将自动运行测试,未来将使用 Terraform 来定义 Azure 基础设施。 高级架构: ``` User | | HTTPS v Azure App Service | | Runs FastAPI application v FastAPI API | | Future secure secret access v Azure Managed Identity ---> Azure Key Vault Azure App Service ---> Application Insights ---> Log Analytics GitHub Repository ---> GitHub Actions ---> Tests / Future Deployment ``` ## 5. 使用的技术 | 领域 | 技术 | |---|---| | 云服务提供商 | Microsoft Azure | | 托管服务 | Azure App Service | | 后端框架 | FastAPI | | 编程语言 | Python | | 测试 | Pytest | | CI/CD | GitHub Actions | | 密钥管理 | Azure Key Vault | | 身份验证 | Azure Managed Identity | | 监控 | Azure Application Insights | | 日志 | Azure Log Analytics | | 基础设施即代码 | Terraform | | 文档 | Markdown | | 图表 | Mermaid | ## 6. 安全控制 | 控制措施 | 重要性 | 状态 | |---|---|---| | 无硬编码密钥 | 防止密码、API 密钥、token 和云凭据暴露在 GitHub 中 | 进行中 | | 最小权限 IAM | 减少单个身份、服务或账户被盗用时的损害 | 计划中 | | HTTPS/TLS | 保护用户与云应用之间的 API 流量 | 计划中 | | 日志记录 | 帮助检测错误、攻击、可疑请求和失败的访问尝试 | 计划中 | | 威胁模型 | 识别可能的攻击路径并记录缓解措施 | 进行中 | | 环境变量 | 将配置与应用程序代码分开 | 进行中 | | Azure Key Vault | 在源代码之外存储敏感密钥 | 计划中 | | Managed Identity | 允许应用在不将凭据存储在代码中的情况下访问 Azure 资源 | 计划中 | | GitHub Actions CI | 在接受更改之前自动测试项目 | 进行中 | | Terraform | 使云基础设施可重现且易于审查 | 计划中 | ## 7. 仓库结构 ``` azure-secure-api-lab/ ├── app/ │ └── main.py ├── tests/ │ └── test_main.py ├── docs/ │ ├── ARCHITECTURE.md │ ├── THREAT_MODEL.md │ ├── SECURITY_CONTROLS.md │ ├── logs-and-alerts.md │ └── cost-control.md ├── diagrams/ │ └── architecture.mmd ├── screenshots/ ├── terraform/ ├── .github/ │ ├── PULL_REQUEST_TEMPLATE.md │ └── workflows/ │ └── ci.yml ├── README.md ├── SECURITY.md ├── requirements.txt ├── requirements-dev.txt ├── .env.example └── .gitignore ``` ## 8. 本地设置 ### 8.1 克隆仓库 ``` git clone https://github.com/simonchitepo/azure-secure-api-lab.git cd azure-secure-api-lab ``` ### 8.2 创建虚拟环境 对于 Windows PowerShell: ``` python -m venv .venv .\.venv\Scripts\Activate.ps1 ``` 对于 Linux/macOS: ``` python -m venv .venv source .venv/bin/activate ``` ### 8.3 安装依赖 ``` pip install -r requirements.txt pip install -r requirements-dev.txt ``` ### 8.4 在本地运行 API ``` uvicorn app.main:app --reload ``` API 现在应该运行在: ``` http://127.0.0.1:8000 ``` 交互式 API 文档: ``` http://127.0.0.1:8000/docs ``` ## 9. 运行测试 运行: ``` pytest ``` 预期结果: ``` All tests should pass. ``` 测试检查: - 健康检查端点正常工作 - 安全状态端点正常工作 - risk-check 端点返回预期的风险等级 ## 10. API 用法 ### 10.1 健康检查 请求: ``` curl http://127.0.0.1:8000/health ``` 响应示例: ``` { "status": "ok", "environment": "local", "version": "0.1.0" } ``` ### 10.2 安全状态 请求: ``` curl http://127.0.0.1:8000/security-status ``` 响应示例: ``` { "hardcoded_secrets": "not used", "configuration": "environment variables", "planned_controls": [ "Azure Key Vault", "Managed Identity", "Application Insights", "Log Analytics", "Terraform", "GitHub Actions security checks" ] } ``` ### 10.3 风险检查 请求体: ``` { "asset_name": "public-customer-api", "exposure": "public", "data_classification": "confidential", "authentication_required": false, "internet_accessible": true } ``` 响应示例: ``` { "asset_name": "public-customer-api", "risk_score": 10, "risk_level": "high", "recommendations": [ "Use least privilege IAM", "Avoid public exposure unless required", "Store secrets outside source code", "Enable logging and monitoring", "Document threat model and residual risks" ] } ``` ## 11. 环境变量 项目使用环境变量进行配置。 `.env.example` 示例: ``` ENVIRONMENT=local APP_VERSION=0.1.0 ``` 重要规则: ``` .env must never be committed to GitHub. ``` `.gitignore` 文件应包含: ``` .env .venv/ __pycache__/ .pytest_cache/ *.pyc ``` ## 12. 密钥管理方案 当前版本: - 不需要真实的密钥。 - `.env` 被 Git 忽略。 - `.env.example` 记录安全的占位符值。 - 不应提交任何密码、API 密钥或 Azure 凭据。 计划的 Azure 版本: - 使用 Azure Key Vault 管理密钥。 - 使用 Azure Managed Identity,以便 App Service 无需在代码中存储凭据即可访问 Key Vault。 - 使用最小权限,使应用只能读取所需的密钥。 ## 13. IAM 和最小权限计划 IAM 的目标是避免向服务或用户授予广泛的权限。 计划的访问模型: | 身份 | 权限 | 原因 | |---|---|---| | Azure App Service Managed Identity | 读取选定的 Key Vault 密钥 | 允许应用安全地检索密钥 | | GitHub Actions 部署身份 | 受限的部署权限 | 允许 CI/CD 部署而无需过度访问 | | 开发者账户 | 实验室设置期间的临时管理员/贡献者访问权限 | 仅用于学习和设置期间 | 未来的改进: - 将广泛的访问权限替换为更具体的角色分配。 - 记录 IAM 角色分配的截图。 - 在 `docs/SECURITY_CONTROLS.md` 中添加最小权限说明。 ## 14. HTTPS/TLS 计划 部署的 API 应通过 HTTPS 访问。 计划的证据: - 使用 `https://` 访问的已部署 API 的截图 - 浏览器锁形图标的截图 - 解释不应通过纯 HTTP 发送 API 流量的文档 未来的改进: - 添加自定义域名 - 添加托管证书 - 记录 TLS 配置 ## 15. 日志和监控计划 为了能够调查安全事件和操作问题,必须进行日志记录。 计划的日志记录证据: - 启用 Azure Application Insights - 连接 Log Analytics 工作区 - 对 `/health` 请求的截图 - 对 `/risk-check` 请求的截图 - 错误或测试流量的截图 计划的日志文档: ``` docs/logs-and-alerts.md ``` 该文件将说明: - 收集了哪些日志 - 日志存储在哪里 - 日志可以回答哪些安全问题 - 以后应该创建哪些警报 ## 16. 威胁模型 项目包含一个威胁模型文件: ``` docs/THREAT_MODEL.md ``` 该威胁模型涵盖: - 资产 - 参与者 - 入口点 - 攻击路径 - 缓解措施 - 剩余风险 示例威胁: | 威胁 | 示例攻击路径 | 缓解措施 | |---|---|---| | 硬编码密钥暴露 | 密钥被提交到 GitHub | 使用 `.env`、`.gitignore` 和 Azure Key Vault | | 公开端点滥用 | 攻击者发送重复请求 | 添加日志记录、速率限制和警报 | | IAM 权限过大 | 应用身份拥有过多访问权限 | 使用最小权限 IAM | | 缺少日志 | 发生攻击时没有调查追踪记录 | 启用 Application Insights 和 Log Analytics | | 日志中的敏感数据 | 应用记录了密钥或私人数据 | 避免记录密钥并审查日志字段 | ## 17. 云部署计划 目标 Azure 服务: | Azure 服务 | 用途 | |---|---| | Azure Resource Group | 将所有项目资源分组 | | Azure App Service Plan | Web 应用的托管计划 | | Azure App Service | 托管 FastAPI API | | Azure Key Vault | 存储密钥 | | Managed Identity | 允许对 Key Vault 进行安全访问 | | Application Insights | 监控应用程序行为 | | Log Analytics | 存储和查询日志 | 部署步骤将在首次 Azure 部署后进行记录。 ## 18. GitHub Actions CI 该仓库包含一个 GitHub Actions 工作流: ``` .github/workflows/ci.yml ``` CI 工作流将: - 检出仓库 - 设置 Python - 安装依赖 - 使用 `pytest` 运行测试 当前 CI 状态: ``` In progress ``` 未来计划的 CI 改进: - 添加代码检查 - 添加密钥扫描 - 添加依赖扫描 - 添加 Docker 镜像扫描 - 添加部署工作流 - 添加分支保护说明 ## 19. 待添加的证据 该仓库应包含证明该项目正常运行的证据。 计划的证据: | 证据 | 文件或目录 | |---|---| | 架构图 | `diagrams/architecture.mmd` | | 架构截图 | `screenshots/architecture-preview.png` | | 本地 API 文档截图 | `screenshots/local-api-docs.png` | | Azure App Service 截图 | `screenshots/azure-app-service.png` | | HTTPS 截图 | `screenshots/https-working.png` | | 应用程序日志截图 | `screenshots/application-insights-logs.png` | | GitHub Actions 截图 | `screenshots/github-actions-ci.png` | | 威胁模型 | `docs/THREAT_MODEL.md` | | 安全控制 | `docs/SECURITY_CONTROLS.md` | | 成本说明 | `docs/cost-control.md` | ## 20. 截图 截图将随着项目的进展而添加。 需要的截图: - 本地 API 运行情况 - FastAPI `/docs` 页面 - 测试结果 - GitHub Actions 通过状态 - Azure App Service 概览 - HTTPS 正常工作状态 - Application Insights 日志 - 架构图 ## 21. 成本控制说明 云资源可能会产生费用,因此成本控制也是项目的一部分。 成本控制规则: - 尽可能使用小型的 Azure App Service SKU。 - 删除未使用的资源。 - 将所有资源保留在一个 Resource Group 中。 - 使用清晰的资源名称。 - 记录每个资源的用途。 - 不需要时销毁测试资源。 - 稍后添加 Terraform 销毁指令。 成本控制文档将存储在此处: ``` docs/cost-control.md ``` ## 22. 当前状态 | 领域 | 状态 | |---|---| | 本地 FastAPI 应用 | 已完成 | | 单元测试 | 已完成 | | README 文档 | 进行中 | | 安全控制表 | 已完成 | | 架构大纲 | 进行中 | | 威胁模型 | 进行中 | | Azure 部署 | 计划中 | | HTTPS 证据 | 计划中 | | 日志记录证据 | 计划中 | | Terraform | 计划中 | | GitHub Actions | 进行中 | ## 23. 经验教训 目前总结的经验: - 一个云安全项目不需要过于复杂也能发挥价值。 - 其价值在于展示安全的设计、文档、控制和证据。 - 一个小型的 API 可用于演示 IAM、密钥管理、日志记录、监控和部署实践。 - 一个完善的 README 有助于招聘人员快速了解该项目。 随着项目的开发,将添加更多的经验教训。 ## 24. 局限性 这是一个作品集实验,不是完整的生产系统。 当前局限性: - 尚未实现身份验证 - 尚未实现数据库 - 尚未实现速率限制 - 尚未实现 Web Application Firewall - 尚未实现 Terraform 部署 - 尚未实现 Azure Key Vault 集成 - 尚未实现生产环境监控警报 特意记录这些局限性是为了展示安全意识和切合实际的项目范围。 ## 25. 下一步改进 计划的后续步骤: 1. 将 API 部署到 Azure App Service。 2. 确认 HTTPS 访问。 3. 启用 Azure Application Insights。 4. 将截图添加到 `screenshots/` 文件夹中。 5. 编写 `docs/SECURITY_CONTROLS.md`。 6. 改进 `docs/THREAT_MODEL.md`。 7. 添加 Terraform 文件。 8. 添加 GitHub Actions 安全检查。 9. 添加 Azure Key Vault10. 添加 Managed Identity。 11. 记录最小权限 IAM。 12. 为招聘人员添加最终的项目总结。 ## 26. 面试说明 关于本项目的简短说明: ## 27. 最终作品集成果 完成后,本项目应能证明: - 我能够构建和部署一个小型 API。 - 我了解基本的云安全控制。 - 我能够清晰地编写架构文档。 - 我能够编写基本的威胁模型。 - 我能够思考 IAM 和最小权限原则。 - 我能够避免硬编码密钥。 - 我能够通过截图和日志收集证据。 - 我能够专业地使用 GitHub 进行以安全为重点的项目。 ## 28. 作者 Simon Chitepo 专注于云安全、DevSecOps、IAM、Azure、安全部署和安全运营的计算机科学专业学生。
标签:AV绕过, Azure, DevSecOps, ECS, FastAPI, IAM, Terraform, 上游代理, 逆向工具, 防御加固