isaaaac-2/Secure-Azure-App-Starter
GitHub: isaaaac-2/Secure-Azure-App-Starter
一个集成 Checkov 和 Trivy 安全扫描的 Azure Terraform 模板,在 CI/CD 流水线中自动拦截配置错误、机密泄露和已知 CVE。
Stars: 1 | Forks: 0
# 安全 Azure App Starter
一个 DevSecOps 就绪的 Azure 基础设施模板,具备自动化安全扫描和 CI/CD 部署功能。它是一个 CI/CD 门禁,在每次推送时运行 Checkov 和 Trivy,在带有策略违规、暴露的机密或已知 CVE 的提交到达基础设施之前将其拦截。
## 我在解决什么问题?
Azure 环境经常会积压未经验证的 Terraform 配置和未经扫描的机密,这些东西会混过人工审查。这些漏洞会在任何人注意到之前成为攻击面。
## 为什么这很重要?
在提交时捕获错误配置可以防止导致真实数据泄露的那种配置漂移。今天拦截一次提交,明天就会少一次事件响应。
## 部署内容
- Azure VNet 及其隔离的子网(northeurope)
- 仅强制执行 HTTPS 入站流量的网络安全组(NSG)
- 启用软删除、清除保护且无公共网络访问的 Azure Key Vault
- 采用 GRS 复制、TLS 1.2、blob 版本控制、队列日志记录和 SAS 过期策略的 Azure 存储账户
- 在每次推送/PR 时执行 Checkov + Trivy 安全扫描的 GitHub Actions 流水线
- 使用服务主体认证的自动化 Terraform 部署工作流
- 要求在合并前必须通过安全扫描的分支保护规则
## 技术栈
- Terraform(IaC)
- GitHub Actions(CI/CD)
- Checkov(Terraform 策略扫描)
- Trivy(配置错误检测)
- Azure(VNet、NSG、Subnet、Key Vault、Storage Account)
## 工作原理
1. 推送到 main 分支会触发安全扫描(Checkov + Trivy)
2. 如果扫描通过,Terraform plan + apply 会将基础设施部署到 Azure
3. NSG 默认强制执行最小权限网络访问
4. Key Vault 存储机密,具有清除保护且无公共访问权限
5. 存储账户使用平台管理的密钥对静态数据进行加密,强制执行 TLS 1.2,并记录所有队列操作
6. 如果安全扫描失败,分支保护会阻止合并
## 架构
```
Push to main
│
▼
┌─────────────────────────────┐
│ GitHub Actions │
├─────────────────────────────┤
│ • Checkov │
│ • Trivy │
│ Security & IaC Scanning │
└──────────────┬──────────────┘
│
Pass Security Checks
│
▼
┌─────────────────────────────┐
│ Terraform │
│ Init → Plan → Apply │
└──────────────┬──────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ Azure (North Europe) │
│ │
│ Resource Group │
│ ├── VNet (10.0.0.0/16) │
│ │ └── Subnet (10.0.1.0/24) │
│ │ └── NSG │
│ │ ✓ Allow HTTPS (TCP 443) │
│ │ ✗ Deny all other inbound traffic │
│ │ │
│ ├── Key Vault (secure-app-kv) │
│ │ ✓ Soft Delete (7 days) │
│ │ ✓ Purge Protection Enabled │
│ │ ✗ Public Network Access Disabled │
│ │ ✓ Default Network ACL: Deny │
│ │ │
│ └── Storage Account (secureappsa) │
│ ✓ GRS Replication │
│ ✓ TLS 1.2 Minimum │
│ ✓ Blob Versioning + Soft Delete (7 days) │
│ ✓ Queue Logging (read/write/delete) │
│ ✓ SAS Expiration Policy (30 days) │
│ ✓ Infrastructure Encryption Enabled │
│ ✗ Public Network Access Disabled │
└──────────────────────────────────────────────────────────────┘
```
## 已知的权衡
- *共享密钥认证 (CKV2_AZURE_40):* 启用了存储账户密钥访问以允许 Terraform 预配。在生产环境中,应在部署后禁用此功能并专门使用 Azure AD 认证。网络 ACL 和禁用的公共访问可缓解暴露风险。
- *私有端点 (CKV2_AZURE_32, CKV2_AZURE_33):* Key Vault 和存储账户使用禁用的公共访问 + 网络 ACL,而不是私有端点。这对于作品集展示已经足够;生产部署应使用 Private Link。
- *客户管理的密钥 (CKV2_AZURE_1):* 存储使用平台管理的加密。CMK 会增加复杂性(Key Vault + 托管标识 + 密钥轮换),建议在受监管的工作负载中使用。
标签:Azure, DevSecOps, ECS, Terraform, 上游代理, 安全扫描, 安全门禁, 时序注入