将 IaC 验证与 Cloud Build 集成

您可以编写一个构建配置 指示 Cloud Build 验证基础架构即代码 (IaC) 是构建的一部分。通过验证 IaC,您可以确定您的 Terraform 资源定义是否违反了应用于 Google Cloud 资源的现有组织政策和 Security Health Analytics 检测器。

如需详细了解 IaC 验证,请参阅根据 Google Cloud 组织的政策验证 IaC

准备工作

请完成以下任务,以便开始使用 IaC 验证 Cloud Build

激活 Security Command Center 高级层级或企业版

确认已在组织级层激活 Security Command Center 高级层级或企业层级

激活 Security Command Center 即会启用 securityposture.googleapis.comsecuritycentermanagement.googleapis.com API。

设置权限

  1. Make sure that you have the following role or roles on the organization:

    • Security Posture Shift-Left Validator
    • Log Writer
    • Storage Writer
    • Storage Reader

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the organization.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role colunn to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      前往 IAM
    2. 选择组织。
    3. 点击 授予访问权限
    4. 新的主账号字段中,输入您的用户标识符。 这通常是 Google 账号的电子邮件地址。

    5. 选择角色列表中,选择一个角色。
    6. 如需授予其他角色,请点击 添加其他角色,然后添加其他各个角色。
    7. 点击保存

    如需详细了解 IaC 验证权限,请参阅适用于组织级激活的 IAM

    启用 Cloud Build API

    1. Enable the Cloud Build API.

      Enable the API

    定义您的政策

    明确 组织政策Security Health Analytics 检测器。 如需使用安全状况定义这些政策,请完成创建和部署安全状况中的任务。

    创建 Terraform 代码

    有关说明,请参阅 创建 Terraform 代码

    在 Cloud Build 中验证 IAC

    将以下任务添加到 cloudbuild.yaml 文件中:

    1. 初始化 Terraform:

      - name: hashicorp/terraform
        args:
          - '-c'
          - |
            terraform init \
              -backend-config="bucket=STATE_BUCKET" \
              -backend-config="prefix=REPOSITORY_NAME" \
        dir: FOLDER
        id: Terraform Init
        entrypoint: sh
      

      替换以下内容:

      • STATE_BUCKET 替换为 Cloud Storage 存储桶的名称 将 Terraform 状态存储在
      • REPOSITORY_NAME 替换为托管您的 Terraform 代码。
      • FOLDER 替换为要将 Terraform 工件保存到的文件夹的名称。
    2. 创建方案文件:

      - name: hashicorp/terraform
        args:
          - '-c'
          - |
            terraform plan -out tf.plan
        dir: FOLDER
        id: Terraform Plan
        entrypoint: sh
      
    3. 将方案文件转换为 JSON 格式:

      - name: hashicorp/terraform
        args:
          - '-c'
          - |
            terraform show -json tf.plan > plan.json
        dir: FOLDER
        id: Terraform Show
        entrypoint: sh
      
    4. 创建 IaC 验证报告:

      - name: gcr.io/cloud-builders/gcloud
        args:
          - '-c'
          - |
            gcloud scc iac-validation-reports create \
            organizations/ORGANIZATION_ID/locations/global --tf-plan-file=plan.json \
            --format="json(response.iacValidationReport)" > IaCScanReport_$BUILD_ID.json
        dir: FOLDER
        id: Run IaC scan
        entrypoint: /bin/bash
      

      ORGANIZATION_ID 替换为您的组织的 ID。

    5. 如果您使用的是 Cloud Storage,请将 JSON 结果文件上传到 Cloud Storage:

      - name: gcr.io/cloud-builders/gsutil
        args:
          - cp
          - IaCScanReport_$BUILD_ID.json
          - SCAN_RESULT_FILE_BUCKET
        dir: FOLDER
        id: Upload report file
      

      SCAN_RESULT_FILE_BUCKET 替换为要将结果文件上传到的 Cloud Storage 存储桶。

    6. 如需以 SARIF 格式查看结果,请完成以下操作:

      1. 转换文件:

        - name: golang
          args:
            - '-c'
            - |
              go run github.com/google/gcp-scc-iac-validation-utils/SARIFConverter@latest \
                --inputFilePath=IaCScanReport_$BUILD_ID.json
                --outputFilePath=IaCScanReport_$BUILD_ID.sarif.json
          dir: FOLDER
          id: Convert to SARIF format
          entrypoint: /bin/bash
        
      2. 可选:将文件上传到 Cloud Storage:

        - name: gcr.io/cloud-builders/gsutil
          args:
            - cp
            - IaCScanReport_$BUILD_ID.sarif.json
            - SCAN_RESULT_FILE_BUCKET
          dir: FOLDER
          id: Upload report file
        
    7. 验证结果。请在 结果 JSON 文件:

      - name: golang
        args:
          - '-c'
          - |
            go run github.com/google/gcp-scc-iac-validation-utils/ReportValidator@latest \
              --inputFilePath=IaCScanReport_$BUILD_ID.json --failure_expression=FAILURE_CRITERIA
        dir: FOLDER
        id: Validate results
        entrypoint: /bin/bash
      

      FAILURE_CRITERIA 替换为用于确定何时构建失败的失败阈值条件。阈值条件取决于 IaC 验证扫描遇到的严重、高、中和低严重级别问题的数量。FAILURE_CRITERIA 指明了每个严重级别允许的问题数量,还指定了 问题的汇总方式(ANDOR)。例如,如果您 希望构建在遇到一个严重问题重大问题时失败 请将 FAILURE_CRITERIA 设为 Critical:1,High:1,Operator:OR。默认值为 Critical:1,High:1,Medium:1,Low:1,Operator:OR,这表示如果 IaC 如果发现任何严重级别的违规行为,构建必须失败。

    8. 如果构建失败,请解决 Terraform 代码中的所有违规问题。

    后续步骤