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, 上游代理, 逆向工具, 防御加固