Questa pagina mostra come utilizzare la verifica della firma Sigstore per la convalida continua (CV) di Autorizzazione binaria. Il controllo verifica le firme generate da Sigstore delle immagini container associate ai pod in esecuzione in un cluster GKE in cui è attivata la CV. La differenza principale tra questo controllo e il controllo di attestazione della firma semplice è che il flusso di lavoro di firma Sigstore non utilizza le note di analisi degli elementi per collegare le firme alle immagini. Tutte le firme vengono memorizzate insieme all'immagine che firmano.
Questo controllo supporta solo i repository Artifact Registry.
Costi
Questa guida utilizza i seguenti servizi Google Cloud:
- Autorizzazione binaria, ma CV è disponibile senza costi durante la fase di anteprima
- GKE
- Cloud Key Management Service
- Artifact Registry
Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi.
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:
gcloud services enable binaryauthorization.googleapis.com
cloudkms.googleapis.com container.googleapis.com artifactregistry.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Binary Authorization, Cloud Key Management Service, Google Kubernetes Engine, Artifact Registry APIs:
gcloud services enable binaryauthorization.googleapis.com
cloudkms.googleapis.com container.googleapis.com artifactregistry.googleapis.com - Assicurati che la gcloud CLI sia aggiornata all'ultima versione.
- Installa lo strumento a riga di comando
kubectl
. - Se i criteri di Autorizzazione binaria e i cluster GKE si trovano in progetti diversi, assicurati che Autorizzazione binaria sia abilitata in entrambi i progetti.
- Installa lo strumento a riga di comando
cosign
.
Ruoli obbligatori
Questa sezione mostra come impostare i ruoli per questo controllo.
Panoramica
Se utilizzi tutti i prodotti menzionati in questa guida nello stesso progetto, non devi impostare alcuna autorizzazione. L'Autorizzazione binaria configura i ruoli correttamente quando la attivi. Se esegui i prodotti in progetti diversi, devi impostare i ruoli come descritto in questa sezione.
Per assicurarti che l'agente di servizio di autorizzazione binaria in ogni progetto disponga delle autorizzazioni necessarie per valutare il controllo della firma Sigstore del CV, chiedi all'amministratore di concedere all'agente di servizio di autorizzazione binaria in ogni progetto i seguenti ruoli IAM:
-
Se il progetto del cluster è diverso dal progetto del criterio:
Valutatore criterio di autorizzazione binaria (
roles/binaryauthorization.policyEvaluator
) nel Binary Authorization Service Agent del progetto del cluster -
Se il progetto del repository di immagini è diverso dal progetto delle norme:
Lettore di Artifact Registry (
roles/artifactregistry.reader
) nell'agente di servizio di Autorizzazione binaria del progetto delle norme
Per saperne di più sulla concessione dei ruoli, consulta Gestire l'accesso a progetti, cartelle e organizzazioni.
L'amministratore potrebbe anche essere in grado di assegnare all'agente di servizio di autorizzazione binaria in ogni progetto le autorizzazioni richieste tramite ruoli personalizzati o altri ruoli predefiniti.
Concedi i ruoli utilizzando gcloud CLI
Per assicurarti che l'agente di servizio di autorizzazione binaria in ogni progetto disponga delle autorizzazioni necessarie per valutare il controllo della firma Sigstore del CV, concedi all'agente di servizio di autorizzazione binaria in ogni progetto i seguenti ruoli IAM:
Concedi all'agente di servizio di autorizzazione binaria del progetto cluster l'autorizzazione ad accedere al criterio nel progetto di criteri.
Recupera l'agente di servizio di Autorizzazione binaria del progetto del cluster:
PROJECT_NUMBER=$(gcloud projects list --filter="projectId:CLUSTER_PROJECT_ID" \ --format="value(PROJECT_NUMBER)") CLUSTER_SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
Sostituisci
CLUSTER_PROJECT_ID
con l'ID del progetto del cluster.Consenti a CV di valutare il criterio nel cluster:
gcloud projects add-iam-policy-binding POLICY_PROJECT_ID \ --member="serviceAccount:$CLUSTER_SERVICE_ACCOUNT" \ --role='roles/binaryauthorization.policyEvaluator'
Sostituisci
POLICY_PROJECT_ID
con l'ID del progetto che contiene il criterio.
Consenti all'agente di servizio di Autorizzazione binaria del progetto di criteri di accedere alle firme nel tuo repository:
Ottieni l'agente di servizio di Autorizzazione binaria del progetto di criteri:
PROJECT_NUMBER=$(gcloud projects list \ --filter="projectId:POLICY_PROJECT_ID" \ --format="value(PROJECT_NUMBER)") SERVICE_ACCOUNT="service-$PROJECT_NUMBER@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
Sostituisci
POLICY_PROJECT_ID
con l'ID del progetto che contiene il criterio.Concedi il ruolo:
gcloud projects add-iam-policy-binding REPOSITORY_PROJECT_ID \ --member="serviceAccount:$SERVICE_ACCOUNT" \ --role='roles/artifactregistry.reader'
Sostituisci
REPOSITORY_PROJECT_ID
con l'ID del progetto che contiene il tuo repository.
Crea una coppia di chiavi
In questa sezione crei una coppia di chiavi asimmetriche con l'algoritmo di firma digitale con curva ellittica (ECDSA).
Utilizzi la chiave privata per firmare l'immagine, che crea l'attestazione. Devi includere la chiave pubblica nei criteri della piattaforma. Quando CV controlla l'attestazione, utilizza la chiave pubblica per verificarla.
Puoi utilizzare Cloud Key Management Service (Cloud KMS) o chiavi locali, ma ti consigliamo di utilizzare le chiavi Cloud KMS per la produzione.
Cofirma PKIX Cloud KMS
Configura le variabili di ambiente necessarie per creare la coppia di chiavi. Per farlo, consigliamo di compilare i segnaposto nel seguente comando, e poi di eseguirlo.
KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID KMS_KEYRING_NAME=KMS_KEYRING_NAME KMS_KEY_NAME=KMS_KEY_NAME KMS_KEY_LOCATION=global KMS_KEY_PURPOSE=asymmetric-signing KMS_KEY_ALGORITHM=ec-sign-p256-sha256 KMS_PROTECTION_LEVEL=software KMS_KEY_VERSION=1
Sostituisci quanto segue:
KMS_KEY_PROJECT_ID
: il tuo ID progettoKMS_KEYRING_NAME
: un nome per la raccolta di chiavi Cloud KMSKMS_KEY_NAME
: un nome per la chiave Cloud KMS
Genera la chiave con l'interfaccia a riga di comando Cosign:
cosign generate-key-pair \ --kms gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}
Registra la posizione della chiave pubblica:
Cosign salva automaticamente la chiave pubblica generata come
cosign.pub
nella directory in cui è stato eseguito il comandogenerate-key-pair
. Salva la posizione del file in una variabile per i comandi futuri.PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
PKIX Cloud KMS gcloud
Per creare la coppia di chiavi in Cloud KMS:
Configura le variabili di ambiente necessarie per creare la coppia di chiavi. Per farlo, consigliamo di compilare i segnaposto nel seguente comando, e poi di eseguirlo.
KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID KMS_KEYRING_NAME=KMS_KEYRING_NAME KMS_KEY_NAME=KMS_KEY_NAME KMS_KEY_LOCATION=global KMS_KEY_PURPOSE=asymmetric-signing KMS_KEY_ALGORITHM=ec-sign-p256-sha256 KMS_PROTECTION_LEVEL=software KMS_KEY_VERSION=1
Sostituisci quanto segue:
KMS_KEY_PROJECT_ID
: il tuo ID progettoKMS_KEYRING_NAME
: un nome per la raccolta di chiavi Cloud KMSKMS_KEY_NAME
: un nome per la chiave Cloud KMS
Crea la chiave automatizzata:
gcloud kms keyrings create ${KMS_KEYRING_NAME} \ --location=${KMS_KEY_LOCATION} \ --project=${KMS_KEY_PROJECT_ID}
Crea la chiave:
gcloud kms keys create ${KMS_KEY_NAME} \ --location=${KMS_KEY_LOCATION} \ --keyring=${KMS_KEYRING_NAME} \ --purpose=${KMS_KEY_PURPOSE} \ --default-algorithm=${KMS_KEY_ALGORITHM} \ --protection-level=${KMS_PROTECTION_LEVEL} \ --project=${KMS_KEY_PROJECT_ID}
Esporta il materiale della chiave pubblica in un file:
PUBLIC_KEY_FILE="$(pwd)/cosign.pub" gcloud kms keys versions get-public-key 1 \ --key=${KMS_KEY_NAME} \ --keyring=${KMS_KEYRING_NAME} \ --location=${KMS_KEY_LOCATION} \ --output-file=${PUBLIC_KEY_FILE} \ --project=${KMS_KEY_PROJECT_ID}
Chiave locale
Per creare la coppia di chiavi localmente:
cosign generate-key-pair
PUBLIC_KEY_FILE="$(pwd)/cosign.pub"
PRIVATE_KEY_FILE="$(pwd)/cosign.key"
Crea il criterio della piattaforma
Per creare il criterio della piattaforma CV con un controllo della firma Sigstore, segui questi passaggi:
Crea il file dei criteri della piattaforma di controllo delle firme Sigstore:
cat > POLICY_PATH <<EOF gkePolicy: checkSets: - checks: - displayName: sigstore-signature-check sigstoreSignatureCheck: sigstoreAuthorities: - displayName: sigstore-authority publicKeySet: publicKeys: publicKeyPem: | $(awk '{printf " %s\n", $0}' ${PUBLIC_KEY_FILE}) EOF
Sostituisci
POLICY_PATH
con il percorso del file delle norme.Crea il criterio della piattaforma:
Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:
- POLICY_ID: un ID criteri della piattaforma scelto da te. Se il criterio si trova in un altro progetto, puoi utilizzare il nome completo della risorsa:
projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID
. - POLICY_PATH: un percorso al file delle norme.
- POLICY_PROJECT_ID: l'ID del progetto di norme.
Esegui il seguente comando:
Linux, macOS o Cloud Shell
gcloud beta container binauthz policy create POLICY_ID \ --platform=gke \ --policy-file=POLICY_PATH \ --project=POLICY_PROJECT_ID
Windows (PowerShell)
gcloud beta container binauthz policy create POLICY_ID ` --platform=gke ` --policy-file=POLICY_PATH ` --project=POLICY_PROJECT_ID
Windows (cmd.exe)
gcloud beta container binauthz policy create POLICY_ID ^ --platform=gke ^ --policy-file=POLICY_PATH ^ --project=POLICY_PROJECT_ID
- POLICY_ID: un ID criteri della piattaforma scelto da te. Se il criterio si trova in un altro progetto, puoi utilizzare il nome completo della risorsa:
Attiva CV
Puoi creare un nuovo cluster o aggiornarne uno esistente per utilizzare il monitoraggio dei CV con i criteri della piattaforma basati su controlli.
Crea un cluster che utilizza il monitoraggio CV
In questa sezione crei un cluster che utilizza solo il monitoraggio dei CV con criteri della piattaforma basati su controlli.
Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:
CLUSTER_NAME
: un nome di cluster.LOCATION
: la località, ad esempious-central1
oasia-south1
.POLICY_PROJECT_ID
: l'ID del progetto in cui è archiviato il criterio.POLICY_ID
: l'ID criterio.CLUSTER_PROJECT_ID
: l'ID progetto del cluster.
Esegui il seguente comando:
Linux, macOS o Cloud Shell
gcloud beta container clusters create CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows (PowerShell)
gcloud beta container clusters create CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows (cmd.exe)
gcloud beta container clusters create CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
Crea un cluster che utilizza il monitoraggio dell'applicazione e del CV
In questa sezione crei un cluster che utilizza sia l'applicazione dei criteri project-singleton sia il monitoraggio dei CV con criteri della piattaforma basati su controlli:
Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:
CLUSTER_NAME
: un nome di cluster.LOCATION
: la località, ad esempious-central1
oasia-south1
.POLICY_PROJECT_ID
: l'ID del progetto in cui è archiviato il criterio.POLICY_ID
: l'ID criterio.CLUSTER_PROJECT_ID
: l'ID progetto del cluster.
Esegui il seguente comando:
Linux, macOS o Cloud Shell
gcloud beta container clusters create CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows (PowerShell)
gcloud beta container clusters create CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows (cmd.exe)
gcloud beta container clusters create CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
Aggiorna un cluster per utilizzare il monitoraggio CV
In questa sezione aggiorni un cluster in modo da utilizzare il monitoraggio dei video con solo criteri della piattaforma basati su controlli. Se nel cluster è già attivata l'applicazione dei criteri relativi ai progetti singoli, l'esecuzione di questo comando la disattiva. Ti consigliamo invece di aggiornare il cluster con l'applicazione forzata e il monitoraggio dei CV abilitati.
Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:
CLUSTER_NAME
: il nome del clusterLOCATION
: la località, ad esempious-central1
oasia-south1
POLICY_PROJECT_ID
: l'ID del progetto in cui è archiviato il criterioPOLICY_ID
: l'ID criterioCLUSTER_PROJECT_ID
: l'ID progetto del cluster
Esegui il seguente comando:
Linux, macOS o Cloud Shell
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows (PowerShell)
gcloud beta container clusters update CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows (cmd.exe)
gcloud beta container clusters update CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
Aggiornare un cluster per utilizzare il monitoraggio dell'applicazione e del CV
In questa sezione, aggiorni un cluster in modo da utilizzare sia l'applicazione dei criteri per progetti singoli sia il monitoraggio dei CV con criteri della piattaforma basati su controlli.
Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:
CLUSTER_NAME
: un nome di clusterLOCATION
: la località, ad esempious-central1
oasia-south1
POLICY_PROJECT_ID
: l'ID del progetto in cui è archiviato il criterioPOLICY_ID
: l'ID criterioCLUSTER_PROJECT_ID
: l'ID progetto del cluster
Esegui il seguente comando:
Linux, macOS o Cloud Shell
gcloud beta container clusters update CLUSTER_NAME \ --location=LOCATION \ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE \ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \ --project=CLUSTER_PROJECT_ID
Windows (PowerShell)
gcloud beta container clusters update CLUSTER_NAME ` --location=LOCATION ` --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ` --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ` --project=CLUSTER_PROJECT_ID
Windows (cmd.exe)
gcloud beta container clusters update CLUSTER_NAME ^ --location=LOCATION ^ --binauthz-evaluation-mode=POLICY_BINDINGS_AND_PROJECT_SINGLETON_POLICY_ENFORCE ^ --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID ^ --project=CLUSTER_PROJECT_ID
Testare il CV
In questa sezione, esegui il test del CV eseguendo il deployment di un'immagine firmata. In questo caso, il controllo della firma Sigstore del CV verifica la firma e non genera voce di log.
Quindi tenti di eseguire il deployment di un'immagine non firmata diversa. In questo caso, il controllo del CV non riesce a trovare una firma valida e registra la violazione in Cloud Logging.
Firmare un'immagine
Per soddisfare il controllo, l'immagine deve avere una firma valida. Per creare la firma:
Crea le variabili utilizzate per firmare l'immagine:
IMAGE_PATH=IMAGE_PATH IMAGE_DIGEST=sha256:IMAGE_DIGEST_SHA IMAGE_TO_SIGN="${IMAGE_PATH}@${IMAGE_DIGEST}"
Sostituisci quanto segue:
IMAGE_PATH
: il percorso dell'immagineIMAGE_DIGEST_SHA
: l'hash SHA del digest dell'immagine
Firma l'immagine ed esegui il push della firma in Artifact Registry:
PKIX Cloud KMS
Firma l'immagine con una chiave ospitata in Cloud KMS ed esegui il push della firma in Artifact Registry:
cosign sign \ --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \ ${IMAGE_TO_SIGN}
Chiave locale
Firma l'immagine con una chiave privata locale ed esegui il push della firma in Artifact Registry.
cosign sign --key ${PRIVATE_KEY_FILE} ${IMAGE_TO_SIGN}
Rispondi al prompt di cofirma:
Dopo aver eseguito il comando
cosign sign
, Cosign ti chiede se vuoi caricare la firma nel log della trasparenza Rekor. Rispondiy
on
ai prompt. Per saperne di più su Rekor, consulta la documentazione di Rekor.
Verificare manualmente la firma
Per verificare manualmente la firma, procedi nel seguente modo:
Assicurati che la firma esista in Artifact Registry:
Console Google Cloud
Vai alla pagina Artifact Registry nella console Google Cloud.
Nell'elenco dei repository, fai clic sul nome del repository contenente l'immagine.
Fai clic sul nome dell'immagine che hai firmato.
Individua l'elemento contenente la firma. Questo articolo ha il tag:
sha256-[image digest].sig
. Deve essere presente un solo elemento con il tag.Fai clic su Manifest.
Dovresti vedere un file in formato JSON con vari campi. Ogni firma si trova in un elemento dell'elenco
layers
, nella mappaannotations
. Le firme si trovano nella chiavedev.cosignproject.cosign/signature
.Di seguito è riportato un esempio di manifest:
{ "schemaVersion": 2, "mediaType": "application/vnd.oci.image.manifest.v1+json", "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "size": SIZE_OF_LAYERS, "digest": "DIGEST_OF_LAYERS" }, "layers": [ { "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json", "size": SIZE_OF_ANNOTATIONS, "digest": "DIGEST_OF_ANNOTATIONS", "annotations": { "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE", "dev.sigstore.cosign/bundle": "BUNDLE" } } ] }
Il manifest di esempio include quanto segue:
SIZE_OF_LAYERS
: dimensioni dell'arraylayers
in byteDIGEST_OF_LAYERS
: il digest dell'arraylayers
SIZE_OF_ANNOTATIONS
: dimensioni del dizionarioannotations
in byteDIGEST_OF_ANNOTATIONS
: digest del dizionarioannotations
BASE64_SIGNATURE
: la firma non elaborata codificata in formato Base64. Questa è la firma che verrà utilizzata per la verificaBUNDLE
: metadati specifici di Sigstore
Ulteriori dettagli sul formato manifest sono disponibili nella specifica della firma di cofirma di Sigstore.
Riga di comando
Trova l'elemento corretto:
Elenca gli elementi archiviati con l'immagine:
gcloud artifacts docker tags list ${IMAGE_PATH}
Un esempio di output è il seguente:
Listing items under project PROJECT_ID, location REPOSITORY_LOCATION, repository REPOSITORY_NAME. TAG IMAGE DIGEST latest us-east1-docker.pkg.dev/my-project/my-repo/my-image sha256:abc123 sha256-abc123.sig us-east1-docker.pkg.dev/my-project/my-repo/my-image sha256:def456
Nell'output, l'elemento con il tag
sha256-abc123.sig
contiene la firma nel relativo manifest.Recupera il manifest
Per ottenere il manifest dell'elemento con il tag
sha256-IMAGE_DIGEST_SHA.sig
, esegui il seguente comando:curl -X GET -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "X-Goog-User-Project: REPOSITORY_PROJECT_ID" \ "https://REPOSITORY_LOCATION-docker.pkg.dev/v2/REPOSITORY_PROJECT_ID/REPOSITORY_NAME/IMAGE_NAME/manifests/sha256-IMAGE_DIGEST_SHA.sig"
Sostituisci quanto segue:
REPOSITORY_PROJECT_ID
: l'ID del progetto che contiene il repositoryREPOSITORY_LOCATION
: la posizione del repositoryREPOSITORY_NAME
: il nome del repositoryIMAGE_NAME
: il nome dell'immagine
Dovresti vedere un file in formato JSON con vari campi. Ogni firma si trova in un elemento dell'elenco
layers
, nella mappaannotations
. Le firme si trovano nella chiavedev.cosignproject.cosign/signature
.Di seguito è riportato un esempio di manifest:
{ "schemaVersion": 2, "mediaType": "application/vnd.oci.image.manifest.v1+json", "config": { "mediaType": "application/vnd.oci.image.config.v1+json", "size": SIZE_OF_LAYERS, "digest": "DIGEST_OF_LAYERS" }, "layers": [ { "mediaType": "application/vnd.dev.cosign.simplesigning.v1+json", "size": SIZE_OF_ANNOTATIONS, "digest": "DIGEST_OF_ANNOTATIONS", "annotations": { "dev.cosignproject.cosign/signature": "BASE64_SIGNATURE", "dev.sigstore.cosign/bundle": "BUNDLE" } } ] }
Il manifest di esempio include quanto segue:
SIZE_OF_LAYERS
: dimensioni dell'arraylayers
in byteDIGEST_OF_LAYERS
: il digest dell'arraylayers
SIZE_OF_ANNOTATIONS
: dimensioni del dizionarioannotations
in byteDIGEST_OF_ANNOTATIONS
: digest del dizionarioannotations
BASE64_SIGNATURE
: la firma non elaborata codificata in formato Base64. Questa è la firma che verrà utilizzata per la verificaBUNDLE
: metadati specifici di Sigstore
Ulteriori dettagli sul formato manifest sono disponibili nella specifica della firma di cofirma di Sigstore.
Verifica manualmente la firma:
Utilizza
cosign verify
per verificare la firma caricata:PKIX Cloud KMS
cosign verify --key gcpkms://projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME} \ ${IMAGE_PATH}@${IMAGE_DIGEST}
Chiave locale
cosign verify --key {PUBLIC_KEY_FILE} ${IMAGE_PATH}@${IMAGE_DIGEST}
L'output del comando indica
The signatures were verified against the specified public key
se la verifica è andata a buon fine.
Esegui il deployment dell'immagine firmata
Per eseguire il deployment di un'immagine firmata:
Configura
kubectl
:gcloud container clusters get-credentials CLUSTER_NAME \ --location=LOCATION \ --project=CLUSTER_PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del clusterLOCATION
: la posizione del clusterCLUSTER_PROJECT_ID
: l'ID progetto del cluster
Esegui il deployment di un'immagine e verificalo in base al criterio di Autorizzazione binaria:
kubectl run hello-app-signed --image=${IMAGE_PATH}@${IMAGE_DIGEST}
È stato eseguito il deployment del pod. Poiché l'immagine è firmata, CV non produce voci di log relative a questo pod.
Esegui il deployment di un'immagine non firmata
In questa sezione esegui il deployment di un'immagine non firmata.
Poiché le norme richiedono le firme e questa immagine non ne ha una, la CV registra regolarmente la violazione durante l'esecuzione del contenitore.
Per eseguire il deployment dell'immagine, esegui il seguente comando:
kubectl run hello-app-unsigned \
--image=UNSIGNED_IMAGE_PATH@UNSIGNED_IMAGE_DIGEST
È stato eseguito il deployment del pod. Poiché l'immagine non ha un'attestazione, la CV genera record di log durante l'esecuzione del pod.
Visualizza i log per le voci del CV
Puoi cercare le voci di Cloud Logging per trovare errori di configurazione del CV e violazioni della convalida dei criteri della piattaforma CV.
CV registra gli errori e le violazioni in Cloud Logging entro 24 ore. Di solito puoi visualizzare le voci entro poche ore.
Visualizzare i log degli errori di configurazione del CV
Per visualizzare i log degli errori di configurazione del CV, esegui il seguente comando:
gcloud logging read \
--order="desc" \
--freshness=7d \
--project=CLUSTER_PROJECT_ID \
'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "configErrorEvent"'
Il seguente output mostra un errore di configurazione in cui non viene trovato un criterio della piattaforma CV:
{
"insertId": "141d4f10-72ea-4a43-b3ec-a03da623de42",
"jsonPayload": {
"@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent",
"configErrorEvent": {
"description": "Cannot monitor cluster 'us-central1-c.my-cluster': Resource projects/123456789/platforms/gke/policies/my-policy does not exist."
}
},
"resource": {
"type": "k8s_cluster",
"labels": {
"cluster_name": "my-cluster",
"location": "us-central1-c",
"project_id": "my-project"
}
},
"timestamp": "2024-05-28T15:31:03.999566Z",
"severity": "WARNING",
"logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
"receiveTimestamp": "2024-05-28T16:30:56.304108670Z"
}
Visualizzare le violazioni della convalida delle norme della piattaforma CV
Se nessuna immagine viola i criteri della piattaforma che hai attivato, non vengono visualizzate voci nei log.
Per visualizzare le voci di log del CV degli ultimi sette giorni, esegui il seguente comando:
gcloud logging read \
--order="desc" \
--freshness=7d \
--project=CLUSTER_PROJECT_ID \
'logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation" "policyName"'
Sostituisci CLUSTER_PROJECT_ID
con l'ID del progetto del cluster.
Tipi di controlli
I log CV controllano le informazioni sulle violazioni in checkResults
. Nella voce, il valore checkType
indica il controllo. I valori per ogni controllo sono
come segue:
ImageFreshnessCheck
SigstoreSignatureCheck
SimpleSigningAttestationCheck
SlsaCheck
TrustedDirectoryCheck
VulnerabilityCheck
Log di esempio
L'esempio seguente di voce di log CV descrive un'immagine non conforme che viola un controllo della directory attendibile:
{
"insertId": "637c2de7-0000-2b64-b671-24058876bb74",
"jsonPayload": {
"podEvent": {
"endTime": "2022-11-22T01:14:30.430151Z",
"policyName": "projects/123456789/platforms/gke/policies/my-policy",
"images": [
{
"result": "DENY",
"checkResults": [
{
"explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
"checkSetName": "My check set",
"checkSetIndex": "0",
"checkName": "My trusted directory check",
"verdict": "NON_CONFORMANT",
"checkType": "TrustedDirectoryCheck",
"checkIndex": "0"
}
],
"image": "gcr.io/my-project/hello-app:latest"
}
],
"verdict": "VIOLATES_POLICY",
"podNamespace": "default",
"deployTime": "2022-11-22T01:06:53Z",
"pod": "hello-app"
},
"@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
},
"resource": {
"type": "k8s_cluster",
"labels": {
"project_id": "my-project",
"location": "us-central1-a",
"cluster_name": "my-test-cluster"
}
},
"timestamp": "2022-11-22T01:44:28.729881832Z",
"severity": "WARNING",
"logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
"receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}
Esegui la pulizia
Questa sezione descrive come ripulire il monitoraggio dei CV configurato in precedenza in questa guida.
Puoi disattivare il monitoraggio CV o sia l'Autorizzazione binaria sia il monitoraggio CV nel tuo cluster.
Disattivare Autorizzazione binaria in un cluster
Per disattivare l'applicazione sia di CV sia di Autorizzazione binaria nel tuo cluster, esegui il seguente comando:
gcloud beta container clusters update CLUSTER_NAME \
--binauthz-evaluation-mode=DISABLED \
--location=LOCATION \
--project=CLUSTER_PROJECT_ID
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del clusterLOCATION
: la posizione del clusterCLUSTER_PROJECT_ID
: l'ID progetto del cluster
Disattivare il monitoraggio dei criteri basato su controlli in un cluster
Per disattivare la verifica con criteri basati su controlli nel cluster e riattivare l'applicazione utilizzando il criterio di applicazione di Autorizzazione binaria, esegui il seguente comando:
gcloud beta container clusters update CLUSTER_NAME \
--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
--location=LOCATION \
--project="CLUSTER_PROJECT_ID"
Sostituisci quanto segue:
CLUSTER_NAME
: il nome del clusterLOCATION
: la posizione del clusterCLUSTER_PROJECT_ID
: l'ID progetto del cluster
Tieni presente che --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE
è equivalente al flag precedente --enable-binauthz
.
Elimina il criterio
Per eliminare il criterio, esegui il seguente comando. Non è necessario eliminare il criterio della piattaforma basato su controlli per disattivare il controllo dei criteri basato su controlli.
gcloud beta container binauthz policy delete POLICY_ID \
--platform=gke \
--project="POLICY_PROJECT_ID"
Sostituisci quanto segue:
POLICY_ID
: l'ID del criterioPOLICY_PROJECT_ID
: l'ID progetto del criterio
Passaggi successivi
- Utilizzare il controllo dell'aggiornamento delle immagini
- Utilizzare il semplice controllo di attestazione della firma
- Utilizzare il controllo delle firme di Sigstore
- Utilizzare il controllo SLSA
- Utilizzare il controllo della directory attendibile
- Utilizzare il controllo delle vulnerabilità
- Visualizzare i log delle conversioni