Questo tutorial mostra come creare un'attestazione di Autorizzazione binaria in una pipeline di 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 nel tuo ambiente di deployment.
Panoramica di Cloud Build
Cloud Build (panoramica) prende il codice sorgente archiviato in un 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 Platform.
Panoramica di Autorizzazione binaria
Autorizzazione binaria (panoramica) è un prodottoGoogle Cloud che applica vincoli in fase di deployment alle applicazioni. La sua integrazione con Google Kubernetes Engine (GKE) consente agli utenti di imporre che i container di cui viene eseguito il deployment in un cluster Kubernetes siano firmati in modo crittografico 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ù:
- Un'introduzione generale ad Autorizzazione binaria
- Codelab: Securing Your GKE Deployments with Binary Authorization
Architettura
Il seguente diagramma mostra i componenti di una configurazione di Autorizzazione binaria/Cloud Build:
In questa pipeline:
Il codice per creare l'immagine container viene inviato tramite push a un repository di origine.
Cloud Build, uno strumento di integrazione continua (CI), crea e testa il container.
La build esegue il push dell'immagine container in Container Registry o in un altro registry in cui sono archiviate le immagini create.
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.
Al momento del deployment, l'attestatore verifica l'attestazione utilizzando la chiave pubblica della coppia di chiavi. Autorizzazione binaria applica la policy richiedendo attestazioni firmate per eseguire il deployment dell'immagine container.
Crea 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 di Cloud Build. Il passaggio di build personalizzato firma un'immagine container, crea l'attestazione e la carica su 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:
- Binary Authorization Attestor Viewer
roles/binaryauthorization.attestorsViewer
- Cloud KMS CryptoKey Signer/Verifier (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 al service account Cloud Build del tuo progetto:
Abilita Cloud Build:
Abilita l'API Cloud Build nel progetto Google Cloud di destinazione.
Salva l'ID progetto in una variabile di ambiente:
PROJECT_ID=PROJECT_ID
dove PROJECT_ID è l'ID progetto Google Cloud .
Imposta il progetto Google Cloud CLI:
gcloud config set project ${PROJECT_ID}Recupera il numero del progetto:
PROJECT_NUMBER=$(gcloud projects list --filter="${PROJECT_ID}" --format="value(PROJECT_NUMBER)")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. \ --role roles/binaryauthorization.attestorsViewerAggiungi il ruolo Cloud KMS CryptoKey Signer/Verifier al service account Cloud Build (firma basata su KMS):
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild. \ --role roles/cloudkms.signerVerifierAggiungi il ruolo Artifact Analysis Notes Attacher al service account Cloud Build:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member serviceAccount:${PROJECT_NUMBER}@cloudbuild. \ --role roles/containeranalysis.notes.attacher
Crea e registra il passaggio di build personalizzato con Cloud Build
Clona il repository della community Google Cloud Build:
git clone https://github.com/GoogleCloudPlatform/cloud-builders-community.git
Configura il firmatario di Autorizzazione binaria per Cloud Build:
Prima dell'uso, il codice per la fase di build personalizzata deve essere integrato in un container e inviato a Cloud Build. Per farlo, esegui questi comandi:
cd cloud-builders-community/binauthz-attestation gcloud builds submit . --config cloudbuild.yaml
Il passaggio di build personalizzato è stato inviato a Google Container Registry del progetto corrente ed è ora pronto per l'uso.
Crea un attestatore in Autorizzazione binaria
Crea un attestatore che verrà utilizzato da Autorizzazione binaria al momento del deployment per verificare l'attestazione.
Configura un attestatore e una coppia di chiavi Cloud Key Management Service in Autorizzazione binaria:
Vedi Crea 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 a Container Registry.
Di seguito sono riportati due metodi:
Aggiorna manualmente
cloudbuild.yaml.Esegui una pipeline di esempio con le variabili di ambiente impostate in precedenza.
Aggiorna manualmente cloudbuild.yaml
Aggiorna manualmente
cloudbuild.yamlaggiungendo 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'Anche quanto segue è valido:
- 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, segui questi passaggi:
Crea un file
cloudbuild.yamlcon le variabili di ambiente impostate 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'] EOMEsegui 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