Cloud Build와 IaC 검증 통합

빌드에 포함된 코드형 인프라(IaC) 검증을 Cloud Build에 지시하는 빌드 구성을 작성할 수 있습니다. IaC 검증을 통해 Terraform 리소스 정의가 Google Cloud 리소스에 적용된 기존 조직 정책 및 Security Health Analytics 감지기를 위반하는지 여부를 확인할 수 있습니다.

IaC 검증에 대한 자세한 내용은 Google Cloud 조직 정책에 따라 IaC 검증을 참조하세요.

시작하기 전에

Cloud Build를 사용하여 IaC 검증을 시작하려면 다음 태스크를 완료합니다.

Security Command Center 프리미엄 등급 또는 Enterprise 등급 활성화

Security Command Center 프리미엄 등급 또는 Enterprise 등급이 조직 수준에서 활성화되었는지 확인합니다.

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_BUCKETTerraform 상태를 저장할 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는 허용되는 각 심각도의 문제 수를 지정하고 문제가 합산되는 방식(AND 또는 OR)도 지정합니다. 예를 들어 심각한 문제 하나 또는 심각도가 높은 문제 하나가 발생할 경우 빌드가 실패하도록 하려면 FAILURE_CRITERIACritical:1,High:1,Operator:OR로 설정합니다. 기본값은 Critical:1,High:1,Medium:1,Low:1,Operator:OR입니다. 즉, IaC 검증 스캔에서 심각도 위반이 발생하면 빌드가 실패해야 합니다.

    8. 빌드가 실패하면 Terraform 코드 내에서 위반을 해결합니다.

    다음 단계