寻求基于GitHub Actions与Terraform部署React至Azure ACR的DevSecOps最佳实践
基于GitHub Actions + Terraform + Azure ACR的DevSecOps CI/CD流水线最佳实践
一、基础设施即代码(IaC)安全
- 最小权限配置Terraform服务主体:给Azure上的Terraform服务主体仅分配管理ACR所需的最小权限(如
AcrPush、AcrPull,而非Owner),通过Terraform的azurerm_role_assignment精准绑定:resource "azurerm_role_assignment" "acr_push" { scope = azurerm_container_registry.acr.id role_definition_name = "AcrPush" principal_id = var.service_principal_id } - Terraform状态文件防护:用Azure Blob Storage存储状态文件,启用软删除和版本控制,通过SAS令牌或Azure AD身份验证限制访问;绝对禁止将状态文件提交到代码仓库。
- IaC静态扫描:在流水线中集成Checkov、Trivy等工具,提前发现ACR配置漏洞(如未启用专用链接、内容信任未开启)。示例GitHub Actions步骤:
- name: Run Checkov scan uses: bridgecrewio/checkov-action@v12 with: directory: ./terraform soft_fail: false
二、GitHub Actions流水线安全
- 敏感变量隔离管理:将Azure服务主体密钥、Terraform状态存储密钥等敏感信息存放在GitHub Environments机密中,而非流水线全局变量,同时配置环境审批规则,部署前需人工复核。
- 杜绝硬编码敏感值:所有敏感内容通过
${{ secrets.XXX }}引用,禁止在YAML或Terraform代码中明文写入。 - 作业环境隔离:使用托管runner时,确保作业间无状态残留;若用自托管runner,需定期清理环境,防止敏感信息泄露。
- 依赖版本锁定与漏洞检测:对流水线使用的Actions锁定具体版本(如
actions/checkout@v4而非actions/checkout@main),启用GitHub Dependabot自动检测依赖漏洞并更新。
三、Azure ACR镜像安全
- 强制镜像内容信任:启用ACR的Notary信任策略,只有签名镜像才能被拉取,防止恶意镜像注入。Terraform配置示例:
resource "azurerm_container_registry" "acr" { name = "myacrregistry" location = var.location resource_group_name = var.resource_group_name sku = "Premium" admin_enabled = false trust_policy { type = "Notary" status = "enabled" } } - 镜像漏洞扫描与质量门:启用ACR内置镜像扫描,流水线中添加扫描步骤,仅允许符合安全阈值(如无CRITICAL/HIGH级漏洞)的镜像推送到ACR。示例步骤:
- name: Scan image vulnerabilities uses: azure/cli@v1 with: inlineScript: | az acr task run --registry ${{ secrets.ACR_NAME }} --name scan-task --image ${{ steps.build.outputs.image-tag }} # 检查扫描结果,不符合则终止流水线 scan_result=$(az acr task logs --registry ${{ secrets.ACR_NAME }} --name scan-task | grep "CRITICAL") if [ -n "$scan_result" ]; then exit 1; fi - 镜像生命周期自动清理:通过Terraform配置ACR保留策略,自动删除旧镜像、未使用标签,减少攻击面。示例:
resource "azurerm_container_registry_retention_policy" "acr_retention" { registry_id = azurerm_container_registry.acr.id days = 30 status = "enabled" }
四、部署流程安全
- 分阶段流水线设计:拆分为
代码检查→IaC扫描→Terraform Plan→人工审批→Terraform Apply→镜像构建→镜像扫描→推送ACR→验证多个阶段,任意阶段失败立即终止流程。 - Plan/Apply分离与审批:将Terraform的
plan和apply拆为独立作业,plan输出执行计划后,需人工审批才能触发apply,避免误操作变更基础设施。 - 镜像签名与验证:构建镜像后用Azure Sign Service签名,推送到ACR后,部署前验证签名有效性,确保镜像未被篡改。
五、示例项目结构
├── .github/ │ └── workflows/ │ ├── ci.yml # 代码检查、IaC扫描、镜像构建与扫描 │ └── cd.yml # Terraform部署、镜像推送、验证 ├── terraform/ │ ├── main.tf # ACR基础设施定义 │ ├── variables.tf # 配置变量 │ ├── outputs.tf # 输出ACR地址等信息 │ └── provider.tf # Azure Provider配置 ├── src/ │ └── Dockerfile # 应用镜像构建文件 └── .checkov.yaml # Checkov扫描规则配置
示例ci.yml片段
name: CI Pipeline on: [pull_request] jobs: lint-and-scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Terraform Format Check run: terraform fmt -check -recursive ./terraform - name: Trivy IaC Scan uses: aquasecurity/trivy-action@v0.10.0 with: scan-type: 'config' scan-ref: './terraform' severity: 'CRITICAL,HIGH' exit-code: '1' - name: Build Docker Image run: docker build -t ${{ secrets.ACR_NAME }}.azurecr.io/myapp:${{ github.sha }} ./src - name: Trivy Image Scan uses: aquasecurity/trivy-action@v0.10.0 with: image-ref: ${{ secrets.ACR_NAME }}.azurecr.io/myapp:${{ github.sha }} severity: 'CRITICAL,HIGH' exit-code: '1'
示例cd.yml片段
name: CD Pipeline on: push: branches: [main] jobs: terraform-deploy: runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v4 - name: Azure Login uses: azure/login@v1 with: creds: ${{ secrets.AZURE_CREDENTIALS }} - name: Terraform Init run: terraform init -backend-config="storage_account_name=${{ secrets.STORAGE_ACCOUNT_NAME }}" ./terraform - name: Terraform Plan run: terraform plan -out=tfplan ./terraform - name: Terraform Apply run: terraform apply tfplan - name: Push Image to ACR run: | az acr login --name ${{ secrets.ACR_NAME }} docker push ${{ secrets.ACR_NAME }}.azurecr.io/myapp:${{ github.sha }}
内容的提问来源于stack exchange,提问作者cyrax1441
相关产品推荐
相关产品推荐

