You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:04:52