Creare un'attestazione di Autorizzazione binaria in una pipeline Cloud Build

Questo tutorial mostra come creare un'attestazione di Autorizzazione binaria in una pipeline Cloud Build. Questa configurazione contribuisce a garantire che solo le immagini container create e firmate nell'ambito del processo di compilazione di Cloud Build siano autorizzate automaticamente a essere eseguite nell'ambiente di deployment.

Panoramica di Cloud Build

Cloud Build (panoramica) prende il codice sorgente memorizzato in Cloud Source Repositories o in un altro repository ospitato, esegue le build e i test e archivia gli output software risultanti in Container Registry o in un altro servizio di archiviazione su Google Cloud Platformoud.

Panoramica di Autorizzazione binaria

Autorizzazione binaria (panoramica) è un prodottoGoogle Cloud che applica vincoli di deployment alle applicazioni. L'integrazione di Google Kubernetes Engine (GKE) consente agli utenti di garantire che i container di cui è stato eseguito il deployment in un cluster Kubernetes siano firmati crittograficamente da un'autorità attendibile e verificati da un attestatore di autorizzazione binaria.

Puoi configurare Autorizzazione binaria in modo che richieda attestazioni in base alla posizione del codice sorgente per impedire il deployment di immagini container create da un'origine non autorizzata.

Per saperne di più:

Architettura

Il seguente diagramma mostra i componenti in una configurazione di Autorizzazione binaria/Cloud Build:

Pipeline di attestazione di Autorizzazione binaria di Cloud Build.
Figura 1. Pipeline Cloud Build che crea un'attestazione di Autorizzazione binaria.

In questa pipeline:

  1. Il codice per creare l'immagine container viene inviato a un repository di origine, ad esempio Cloud Source Repositories.

  2. Uno strumento di integrazione continua (CI), Cloud Build, crea e testa il container.

  3. La build esegue il push dell'immagine container in Container Registry o in un altro registro che archivia le immagini create.

  4. Cloud Key Management Service, che fornisce la gestione delle chiavi per la coppia di chiavi di crittografia, firma l'immagine container. La firma risultante viene quindi archiviata in un'attestazione appena creata.

  5. Al momento del deployment, l'attestatore verifica l'attestazione utilizzando la chiave pubblica della coppia di chiavi. Autorizzazione binaria applica i criteri richiedendo attestazioni firmate per eseguire il deployment dell'immagine container.

Creare un'attestazione utilizzando Cloud Build con Cloud Key Management Service

Questa sezione mostra come implementare l'architettura descritta sopra. Utilizza un passaggio di build personalizzato open source della community Cloud Build. Il passaggio di build personalizzato firma un'immagine container, crea l'attestazione e la carica in Autorizzazione binaria.

Configura Identity and Access Management

Per utilizzare questo passaggio di build, il account di servizio Cloud Build deve disporre dei seguenti ruoli IAM:

  • Visualizzatore attestatori autorizzazione binaria
    • roles/binaryauthorization.attestorsViewer
  • Firmatario/Responsabile verifica Cloud KMS CryptoKey (se utilizzi la chiave in KMS per firmare l'attestazione)
    • roles/cloudkms.signerVerifier
  • Artifact Analysis Notes Attacher
    • roles/containeranalysis.notes.attacher

I seguenti comandi possono essere utilizzati per aggiungere i ruoli all'account di servizio Cloud Build del progetto:

  1. Attiva Cloud Build:

    Abilita l'API Cloud Build nel progetto Google Cloud di destinazione.

  2. Salva l'ID progetto in una variabile di ambiente:

    PROJECT_ID=PROJECT_ID
    

    dove PROJECT_ID è l'ID progetto Google Cloud .

  3. Imposta Google Cloud CLI del progetto:

    gcloud config set project ${PROJECT_ID}
    
  4. Recupera il numero di progetto:

    PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")
    
  5. Aggiungi il ruolo Visualizzatore attestatore di autorizzazione binaria al service account Cloud Build:

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/binaryauthorization.attestorsViewer
    
  6. Aggiungi il ruolo Firmatario/Responsabile verifica Cloud KMS CryptoKey all'account di servizio Cloud Build (firma basata su KMS):

    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
      --role roles/cloudkms.signerVerifier
    
  7. Aggiungi il ruolo Artifact Analysis Notes Attacher al service account Cloud Build:

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

Crea e registra il passaggio di build personalizzato con Cloud Build

  1. Clona il repository della community di Google Cloud Build:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
    
  2. Configura il firmatario di Autorizzazione binaria per Cloud Build:

    Prima dell'uso, il codice per il passaggio di build personalizzato deve essere integrato in un container e inviato a Cloud Build. Per farlo, esegui i seguenti comandi:

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

    Il passaggio di build personalizzato è stato eseguito il push nel Container Registry Google del progetto corrente ed è ora pronto per l'uso.

Crea un attestatore in Autorizzazione binaria

Crea un attestatore che Autorizzazione binaria utilizzerà al momento del deployment per verificare l'attestazione.

Configura una coppia di chiavi di attestatore e Cloud Key Management Service in Autorizzazione binaria:

Consulta Creare un attestatore utilizzando l'interfaccia a riga di comando

Verifica che l'attestatore sia stato creato

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

Aggiungi un passaggio "create-attestation" al tuo cloudbuild.yaml

Per utilizzare il passaggio binauthz-attestation, devi aggiornare cloudbuild.yaml aggiungendo il passaggio che firmerà la build di cui è stato eseguito il push in Container Registry.

Di seguito sono riportati due metodi:

  • Aggiorna manualmente cloudbuild.yaml.

  • Esegui una pipeline di esempio con le variabili di ambiente che hai impostato in precedenza.

Aggiornare manualmente cloudbuild.yaml

  1. Aggiorna manualmente cloudbuild.yaml aggiungendo il passaggio di build riportato di seguito dopo il passaggio in cui il container viene caricato in Container Registry. Nota:devi sostituire manualmente ATTESTOR_NAME, KMS_KEY_LOCATION, KMS_KEYRING_NAME, KMS_KEY_NAME e KMS_KEY_VERSION con i tuoi valori:

    - 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'
    

    È valido anche quanto segue:

    - 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'
    

(Facoltativo) Testa la pipeline

Per testare una pipeline di attestazione Cloud Build di esempio, esegui i seguenti passaggi:

  1. Crea un file cloudbuild.yaml con le variabili di ambiente che hai impostato in precedenza:

    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. Esegui Cloud Build con l'esempio cloudbuild_example.yaml:

    Dalla directory cloud-builders-community/binauthz-attestation/example, esegui i seguenti comandi:

    gcloud builds submit . --config cloudbuild_example.yaml
    

Passaggi successivi