Cloud Build 통합

이 페이지에서는 Cloud Build에서 Binary Authorization을 설정하는 방법을 간략히 설명합니다. 이 설정을 사용하면 Cloud Build 빌드 프로세스의 일부로 빌드 및 서명된 컨테이너 이미지만 배포 환경에서 실행되도록 자동 승인됩니다.

Cloud Build 빌드 파이프라인에 취약점 스캔을 추가하는 방법에 대한 자세한 내용은 컨테이너 분석 및 Kritis 서명자로 취약점 스캔을 참조하세요.

개요

Cloud Build

Cloud Build(개요)는 Cloud Source Repositories 또는 호스팅된 저장소에 저장된 소스 코드를 가져와 빌드 및 테스트를 실행하고 결과로 생성된 소프트웨어 출력을 Google Cloud Platform의 Container Registry 또는 다른 스토리지 서비스에 저장합니다.

Binary Authorization

Binary Authorization(개요)은 애플리케이션에 배포 시간 제약조건을 적용하는 Google Cloud 제품입니다. Google Kubernetes Engine(GKE) 통합을 통해 사용자는 Kubernetes 클러스터에 배포된 컨테이너를 신뢰할 수 있는 기관에서 암호화 서명하고 Binary Authorization 증명자가 검증하도록 강제할 수 있습니다.

승인되지 않은 소스에서 빌드된 컨테이너 이미지가 배포되지 않도록 소스 코드의 위치를 기반으로 증명을 요구하도록 Binary Authorization을 구성할 수 있습니다.

자세히 알아보기:

아키텍처

다음 다이어그램은 Binary Authorization/Cloud Build 설정에 사용되는 구성요소를 보여줍니다.

Cloud Build Binary Authorization 증명 파이프라인
그림 1. Cloud Build Binary Authorization 증명 파이프라인 다이어그램

그림 1에서 (1) 코드가 저장소로 푸시됩니다. (2) Cloud Build와 같은 지속적 통합(CI) 파이프라인에서 컨테이너를 빌드하고 테스트합니다. (3) 새로 빌드한 컨테이너 이미지가 Container Registry에 제출됩니다. (4) Cloud Key Management Service가 컨테이너 이미지를 서명하고 (5) 증명을 만들어 Binary Authorization에 저장합니다.

구성요소는 다음과 같습니다.

  • Cloud Source Repositories 또는 다른 보안 저장소에는 컨테이너 이미지를 빌드하는 데 사용되는 소스 코드가 포함됩니다.

  • Cloud Build는 빌드 및 테스트를 실행하고 빌드된 이미지를 저장하는 Container Registry 또는 다른 소프트웨어 레지스트리에 컨테이너 이미지를 출력합니다.

  • Container Registry는 Google Cloud에서 실행되는 비공개 컨테이너 이미지 레지스트리입니다.

  • Cloud Key Management Service암호화 키 쌍을 위한 키 관리 기능을 제공합니다. 키 쌍은 공개 키와 비공개 키로 구성됩니다. 비공개 키는 컨테이너 이미지를 서명하는 데 사용됩니다. 그러면 결과 서명이 새로 생성된 증명에 저장됩니다. 증명은 배포 시에 키 쌍에서 공개 키를 구성하는 증명자가 확인합니다.

  • Binary Authorization은 컨테이너 이미지를 배포하기 전에 서명된 증명을 요구하는 정책을 시행합니다.

Cloud Key Management Service에서 Cloud Build를 사용하여 Binary Authorization 증명 만들기

이 섹션에서는 위의 아키텍처를 구현하는 방법을 보여줍니다. 여기에서는 Cloud Build 커뮤니티의 오픈소스 커스텀 빌드 단계를 사용합니다. 커스텀 빌드 단계는 컨테이너 이미지를 서명하고 증명을 만들어 Binary Authorization에 업로드합니다.

ID 및 액세스 관리 구성

이 빌드 단계를 사용하려면 Cloud Build 서비스 계정에 다음 IAM 역할이 필요합니다.

  • Binary Authorization 증명자 뷰어
    • roles/binaryauthorization.attestorsViewer
  • Cloud KMS CryptoKey 서명자/확인자(증명 서명에 KMS 키를 사용하는 경우)
    • roles/cloudkms.signerVerifier
  • 컨테이너 분석 메모 연결자
    • roles/containeranalysis.notes.attacher

다음 명령어를 사용하여 프로젝트의 Cloud Build 서비스 계정에 역할을 추가할 수 있습니다.

  1. Cloud Build를 사용 설정합니다.

    대상 클라우드 프로젝트에서 Cloud Build API를 사용 설정합니다.

  2. 프로젝트 ID를 환경 변수로 저장합니다.

    PROJECT_ID=PROJECT_ID
    

    여기서 PROJECT_ID는 Google Cloud 프로젝트 ID입니다.

  3. 프로젝트 gcloud 명령줄 도구를 설정합니다.

    gcloud config set project ${PROJECT}
    
  4. 프로젝트 번호를 가져옵니다.

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT}" --format="value(PROJECT_NUMBER)")
    
  5. Cloud Build 서비스 계정에 Binary Authorization 증명자 뷰어 역할을 추가합니다.

    gcloud projects add-iam-policy-binding ${PROJECT} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/binaryauthorization.attestorsViewer
    
  6. Cloud Build 서비스 계정(KMS 기반 서명)에 Cloud KMS CryptoKey 서명자/확인자 역할을 추가합니다.

    gcloud projects add-iam-policy-binding ${PROJECT} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Cloud Build 서비스 계정에 컨테이너 분석 메모 연결자 역할을 추가합니다.

    gcloud projects add-iam-policy-binding ${PROJECT} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/containeranalysis.notes.attacher
    

Cloud Build로 커스텀 빌드 단계 빌드 및 등록

  1. Google Cloud 빌드 커뮤니티 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. Cloud Build용 Binary Authorization 서명자를 구성합니다.

    사용하려면 먼저 컨테이너에 커스텀 빌드 단계의 코드를 빌드하고 Cloud Build로 푸시해야 합니다. 이를 위해 다음 명령어를 실행하세요.

    cd cloud-builders-community/binauthz-attestation
    gcloud builds submit . --config cloudbuild.yaml
    

    커스텀 빌드 단계가 현재 프로젝트의 Google Container Registry로 푸시되었으면 이제 사용할 수 있습니다.

Binary Authorization에서 증명자 만들기

Binary Authorization이 배포 시에 증명을 확인하는 데 사용할 증명을 만듭니다.

Binary Authorization에서 증명자와 Cloud Key Management Service 키 쌍을 설정합니다.

CLI를 사용하여 증명자 만들기를 참조하세요.

증명자가 생성되었는지 확인

   gcloud --project="${ATTESTOR_PROJECT_ID}" container binauthz attestors list
   

cloudbuild.yaml에 'create-attestation' 단계 추가

binauthz-attestation 단계를 사용하려면 Container Registry에 푸시된 빌드를 서명하는 단계를 추가하여 cloudbuild.yaml을 업데이트해야 합니다.

두 가지 방법 모두 아래에 나와 있습니다.

  • cloudbuild.yaml을 수동으로 업데이트합니다.

  • 앞에서 설정한 환경 변수를 사용하여 예시 파이프라인을 실행합니다.

cloudbuild.yaml 수동 업데이트

  1. 컨테이너가 Container Registry에 업로드되는 단계 이후에 빌드 단계를 추가하여 cloudbuild.yaml를 수동으로 업데이트합니다. 참고: ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME, KMS_KEY_VERSION을 고유의 값으로 수동으로 바꿔야 합니다.

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'projects/${PROJECT_ID}/attestors/ATTESTOR_NAME'
        - '--keyversion'
        - 'projects/${PROJECT_ID}/locations/KMS_KEY_LOCATION/keyRings/KMS_KEYRING_NAME/cryptoKeys/KMS_KEY_NAME/cryptoKeyVersions/KMS_KEY_VERSION'
    

    다음도 유효합니다.

    - id: 'create-attestation'
      name: 'gcr.io/${PROJECT_ID}/binauthz-attestation:latest'
      args:
        - '--artifact-url'
        - 'gcr.io/${PROJECT_ID}/helloworld:latest'
        - '--attestor'
        - 'ATTESTOR_NAME'
        - '--attestor-project'
        - '${PROJECT_ID}'
        - '--keyversion'
        - 'KEY_VERSION'
        - '--keyversion-project'
        - '${PROJECT_ID}'
        - '--keyversion-location'
        - 'KEY_LOCATION'
        - '--keyversion-keyring'
        - 'KEYRING_NAME'
        - '--keyversion-key'
        - 'KEY_NAME'
    

[선택사항] 파이프라인 테스트

Cloud Build 증명 파이프라인의 예시를 테스트하려면 다음 단계를 수행하세요.

  1. 앞에서 설정한 환경 변수로 cloudbuild.yaml 파일을 만듭니다.

    cd example
    cat <<EOM > cloudbuild_example.yaml
    steps:
      - id: 'build'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'build'
          - '-t'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '.'
      - id: 'publish'
        name: 'gcr.io/cloud-builders/docker'
        args:
          - 'push'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
      - id: 'create-attestation'
        name: 'gcr.io/$PROJECT_ID/binauthz-attestation:latest'
        args:
          - '--artifact-url'
          - 'gcr.io/$PROJECT_ID/helloworld:latest'
          - '--attestor'
          - 'projects/$PROJECT_ID/attestors/${ATTESTOR_NAME}'
          - '--keyversion'
          - 'projects/${PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}'
    tags: ['cloud-builders-community']
    
    EOM
    
  2. cloudbuild_example.yaml 예시를 사용하여 Cloud Build를 실행합니다.

    cloud-builders-community/binauthz-attestation/example 디렉터리에서 다음 명령어를 실행합니다.

    gcloud builds submit . --config cloudbuild_example.yaml
    

다음 단계