Cloud Build 파이프라인에서 Binary Authorization 증명 만들기

이 튜토리얼에서는 Cloud Build 파이프라인에서 Binary Authorization 증명을 만드는 방법을 보여줍니다. 이 설정을 사용하면 Cloud Build 빌드 프로세스의 일부로 빌드 및 서명된 컨테이너 이미지만 배포 환경에서 실행되도록 자동 승인됩니다.

Cloud Build 빌드 파이프라인에서 Artifact Analysis 취약점 스캔을 사용하는 방법을 알아보려면 Voucher로 증명 만들기 또는 Kritis Signer로 증명 만들기를 참조하세요.

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. Binary Authorization 증명을 만드는 Cloud Build 파이프라인

이 파이프라인에 대한 설명은 다음과 같습니다.

  1. 컨테이너 이미지를 빌드하는 코드가 Cloud Source Repositories와 같은 소스 저장소로 푸시됩니다.

  2. 지속적 통합(CI) 도구인 Cloud Build가 컨테이너를 빌드하고 테스트합니다.

  3. 이 빌드는 컨테이너 이미지를 Container Registry 또는 빌드된 이미지를 저장하는 다른 레지스트리로 푸시합니다.

  4. 암호화 키 쌍용 키 관리를 제공하는 Cloud Key Management Service가 컨테이너 이미지에 서명합니다. 그러면 결과 서명이 새로 생성된 증명에 저장됩니다.

  5. 배포 시 증명자가 키 쌍의 공개 키를 사용하여 증명을 확인합니다. Binary Authorization에서 서명된 증명에 컨테이너 이미지를 배포하도록 요구하여 정책을 적용합니다.

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

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

Identity and Access Management 구성

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

  • Binary Authorization 증명자 뷰어
    • roles/binaryauthorization.attestorsViewer
  • Cloud KMS CryptoKey 서명자/확인자(증명 서명에 KMS 키를 사용하는 경우)
    • roles/cloudkms.signerVerifier
  • Artifact Analysis 메모 첨부자
    • roles/containeranalysis.notes.attacher

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

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

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

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

    PROJECT_ID=PROJECT_ID
    

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

  3. 프로젝트 Google Cloud CLI를 설정합니다.

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

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

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --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_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Cloud Build 서비스 계정에 Artifact Analysis 메모 연결자 역할을 추가합니다.

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --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
    

다음 단계