将 IaC 验证与 Cloud Build 集成

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

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

准备工作

完成以下任务,即可开始使用 Cloud Build 进行 IaC 验证。

激活 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. 点击 Save(保存)。

    如需详细了解 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 替换为要存储 Terraform 状态的 Cloud Storage 存储桶的名称
      • 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. 验证结果。针对尚未转换为 SARIF 格式的结果 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)。例如,如果您希望 build 在遇到一个严重问题一个严重程度较高的问题时失败,请将 FAILURE_CRITERIA 设置为 Critical:1,High:1,Operator:OR。默认值为 Critical:1,High:1,Medium:1,Low:1,Operator:OR,这意味着,如果 IaC 验证扫描遇到任何严重程度的违规问题,构建必须失败。

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

    后续步骤