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 프리미엄 등급 또는 엔터프라이즈 등급이 조직 수준에서 활성화되었는지 확인합니다.

Security Command Center를 활성화하면 securityposture.googleapis.comsecuritycentermanagement.googleapis.com API가 사용 설정됩니다.

권한 설정

  1. 조직에 다음 역할이 있는지 확인합니다.

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

    역할 확인

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 조직을 선택합니다.
    3. 주 구성원 열에서 이메일 주소가 있는 행을 찾습니다.

      이메일 주소가 열에 없으면 역할이 없는 것입니다.

    4. 이메일 주소가 있는 행에 대해 역할 열에서 역할 목록에 필요한 역할이 있는지 확인합니다.

    역할 부여

    1. Google Cloud 콘솔에서 IAM 페이지로 이동합니다.

      IAM으로 이동
    2. 조직을 선택합니다.
    3. 액세스 권한 부여를 클릭합니다.
    4. 새 주 구성원 필드에 이메일 주소를 입력합니다.
    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 코드 내에서 위반을 해결합니다.

다음 단계