In questa pagina vengono descritti i passaggi per creare un'Autorizzazione binaria attestazione.
Puoi utilizzare le attestazioni per autorizzare il deployment di immagini container specifiche su come Google Kubernetes Engine (GKE) e Cloud Run. Per utilizzare le attestazioni, devi richiedere le attestazioni nella regola appropriata del tuo criterio.
Una singola attestazione può autorizzare immagini identiche archiviate in più posizioni diverse o registri diversi, ad esempio Artifact Registry, Container Registry o un Container Registry esterno.
Al momento del deployment, Autorizzazione binaria utilizza gli attacchi per verificare le attestazioni.
Per configurare Autorizzazione binaria su Cloud Run, GKE, Google Distributed Cloud e Cloud Service Mesh, consulta Configurazione in base alla piattaforma e seleziona la tua piattaforma.
Utenti di GKE: per un tutorial end-to-end che descrive l'applicazione forzata basata sull'attestazione utilizzando Autorizzazione binaria e Google Kubernetes Engine (GKE), vedi Iniziare a utilizzare lo strumento a riga di comando. Introduzione all'utilizzo della console Google Cloud.
Prima di iniziare
La panoramica delle attestazioni fornisce i passaggi da completare prima di creare un'attestazione.
Crea attestatori utilizzando la console Google Cloud Google Cloud CLI, o l'API REST.
Configura l'ambiente
Specifica gli ID progetto:
ATTESTOR_PROJECT_ID=ATTESTOR_PROJECT_ID ATTESTATION_PROJECT_ID=ATTESTATION_PROJECT_ID
Sostituisci quanto segue:
- ATTESTOR_PROJECT_ID: il nome del progetto in cui stanno memorizzando gli attestatori
- ATTESTATION_PROJECT_ID: il nome del progetto in cui archivia le tue attestazioni
Se vuoi che l'attestazione venga creata nello stesso progetto degli attestatori, usano lo stesso ID progetto per entrambe le variabili. Per un tutorial end-to-end dimostra la separazione dei compiti tra progetti diversi, vedi Configurazione per più progetti.
Specifica il nome dell'attestatore e le informazioni sull'immagine:
ATTESTOR_NAME=ATTESTOR_NAME IMAGE_PATH=IMAGE_PATH IMAGE_DIGEST=IMAGE_DIGEST IMAGE_TO_ATTEST="${IMAGE_PATH}@${IMAGE_DIGEST}"
Sostituisci quanto segue:
- ATTESTOR_NAME: il nome dell'attestatore, ad esempio
build-secure
oprod-qa
. IMAGE_PATH: un URI che rappresenta il percorso di un'immagine. Sebbene l’URI deve comprendere un nome di dominio e un’immagine, non deve fanno riferimento a un'immagine reale. Non è possibile accedere alle immagini durante l'attestazione per la creazione di contenuti. Di seguito sono riportati alcuni esempi di percorsi delle immagini:
us-docker.pkg.dev/google-samples/containers/gke/hello-app
gcr.io/example-project/quickstart-image
example.com/hello-app
.
IMAGE_DIGEST: il digest del file manifest dell'immagine. Ad esempio,
sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567
il digest immagine associato all'esempio Percorso immagineus-docker.pkg.dev/google-samples/containers/gke/hello-app
. Per scoprire come ottenere il digest di un'immagine in Artifact Registry, vedi Gestione delle immagini; per un'immagine in Container Registry, consulta Elenco delle versioni di un'immagine.
- ATTESTOR_NAME: il nome dell'attestatore, ad esempio
Concedi ruoli Identity and Access Management
Per creare attestazioni, devi concedere quanto segue Ruoli Identity and Access Management (IAM) per l'identità che crea l'attestatore, come segue:
roles/containeranalysis.notes.attacher
sulla risorsa nota associata a l'attestatore.roles/containeranalysis.occurrences.editor
nel progetto di attestazione risorsa.
Crei un'attestazione basata su un attestatore. L'attestatore è associato a una nota Artifact Analysis. crea un'attestazione a sua volta crea un'occorrenza Artifact Analysis e la collega alla nota.
Scopri di più su Concedere l'accesso.
Scopri come creare un'attestazione in Cloud Build consulta Creazione di attestazioni mediante Kritis Signer.
Crea un'attestazione
Crea un'attestazione utilizzando una chiave archiviata in locale
Per creare un'attestazione firmata con una chiave locale:
Crea un file di payload per la firma:
gcloud
Per creare il file del payload per la firma, inserisci il seguente comando:
gcloud container binauthz create-signature-payload \ --artifact-url="${IMAGE_TO_ATTEST}" > /tmp/generated_payload.json
Il file di payload in formato JSON è simile al seguente output:
{ "critical": { "identity": { "docker-reference": "us-docker.pkg.dev/google-samples/containers/gke/hello-app" }, "image": { "docker-manifest-digest": "sha256:37e5287945774f27b418ce567cd77f4bbc9ef44a1bcd1a2312369f31f9cce567" }, "type": "Google cloud binauthz container signature" } }
API REST
Crea un file di payload denominato
/tmp/generated_payload.json
utilizzando le variabili di ambiente impostate in precedenza in questo documento:cat > /tmp/generated_payload.json << EOM { "critical": { "identity": { "docker-reference": "${IMAGE_PATH}" }, "image": { "docker-manifest-digest": "${IMAGE_DIGEST}" }, "type": "Google cloud binauthz container signature" } } EOM
Firma il payload con la tua chiave privata per generare un file di firma.
Questa guida utilizza le Algoritmo di firma digitale con curva ellittica (ECDSA) l'algoritmo per la firma. Puoi anche usare l'algoritmo RSA. Per maggiori informazioni informazioni sugli algoritmi di firma, vedi Scopi e algoritmi principali. Questa guida utilizza anche in Public-Key Infrastructure (X.509) (PKIX). Puoi anche usare PGP.
PRIVATE_KEY_FILE=PRIVATE_KEY_FILE openssl dgst -sha256 -sign ${PRIVATE_KEY_FILE} /tmp/generated_payload.json > /tmp/ec_signature
Sostituisci PRIVATE_KEY_FILE con il percorso della chiave privata che hai generato al momento della creazione dell'attestatore.
Recupera l'ID della chiave pubblica.
Puoi recuperare l'ID della chiave pubblica dall'attestatore inserendo il parametro seguente comando:
PUBLIC_KEY_ID=$(gcloud container binauthz attestors describe ${ATTESTOR_NAME} \ --format='value(userOwnedGrafeasNote.publicKeys[0].id)')
Crea l'attestazione:
gcloud
Per creare e convalidare l'attestazione, inserisci quanto segue:
gcloud container binauthz attestations create \ --project="${ATTESTATION_PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}" \ --signature-file=/tmp/ec_signature \ --public-key-id="${PUBLIC_KEY_ID}" \ --validate
Il flag
validate
controlla che l'attestazione possa essere verificata dal configurato nel criterio.Nota:l'ID chiave può essere qualsiasi stringa.
API REST
Per creare l'attestazione:
Recupera l'attestatore associato al l'attestazione ed estrae l'ID della chiave pubblica archiviata:
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors/"
Autorizzazione binaria restituisce un oggetto JSON simile al seguente:
{ "name": "projects/example-project/attestors/test-attestor", "userOwnedGrafeasNote": { "noteReference": "projects/example-project/notes/test-attestor", "publicKeys": [ { "id": "ni:///sha-256;EwVxs8fNUAHq9FI2AMfh8WNIXVBuuTMeGtPH72U-I70", "pkixPublicKey": { "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXnpuYEfvLl1kj4fjxViFRwY1a+zC\n5qzlf9LJIK+rnjq42tiKGyyXMbnZKJiYPPdMDGyltnkrABnztg2jJ48aYQ==\n-----END PUBLIC KEY-----\n", "signatureAlgorithm": "ECDSA_P256_SHA256" } } ], "delegationServiceAccountEmail": "service-363451293945@gcp-sa-binaryauthorization.iam.gserviceaccount.com" }, "updateTime": "2019-06-26T16:58:33.977438Z" }
La chiave pubblica è disponibile nel campo
id
.Crea un file JSON in
/tmp/attestation.json
che descrive l'attestazione:cat > /tmp/attestation.json << EOM { "resourceUri": "${IMAGE_TO_ATTEST}", "note_name": "${NOTE_URI}", "attestation": { "serialized_payload": "$(base64 --wrap=0 /tmp/generated_payload.json)", "signatures": [ { "public_key_id": "${PUBLIC_KEY_ID}", "signature": "$(base64 --wrap=0 /tmp/ec_signature)" } ] } } EOM
Crea l'attestazione:
curl -X POST \ -H "Content-Type: application/json" \ -H "X-Goog-User-Project: ${ATTESTATION_PROJECT_ID}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --data-binary @/tmp/attestation.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTATION_PROJECT_ID}/occurrences/"
Crea un'attestazione utilizzando Cloud KMS
Per creare un'attestazione utilizzando Cloud Key Management Service:
Crea le variabili di ambiente:
KMS_KEY_PROJECT_ID=KMS_KEY_PROJECT_ID KMS_KEY_LOCATION=KMS_KEY_LOCATION KMS_KEYRING_NAME=KMS_KEYRING_NAME KMS_KEY_NAME=KMS_KEY_NAME KMS_KEY_VERSION=KMS_KEY_VERSION
Sostituisci quanto segue:
- KMS_KEY_PROJECT_ID: l'ID del progetto in cui Le chiavi di Cloud Key Management Service sono archiviate
- KMS_KEY_LOCATION: la posizione della chiave (
global
è l'impostazione predefinita) - KMS_KEYRING_NAME: il nome del keyring
- KMS_KEY_NAME: il nome della chiave
- KMS_KEY_VERSION: la versione della chiave
Firma e crea l'attestazione:
gcloud
Inserisci questo comando:
gcloud beta container binauthz attestations sign-and-create \ --project="${ATTESTATION_PROJECT_ID}" \ --artifact-url="${IMAGE_TO_ATTEST}" \ --attestor="${ATTESTOR_NAME}" \ --attestor-project="${ATTESTOR_PROJECT_ID}" \ --keyversion-project="${KMS_KEY_PROJECT_ID}" \ --keyversion-location="${KMS_KEY_LOCATION}" \ --keyversion-keyring="${KMS_KEYRING_NAME}" \ --keyversion-key="${KMS_KEY_NAME}" \ --keyversion="${KMS_KEY_VERSION}"
API REST
Crea un file di payload denominato
/tmp/generated_payload.json
utilizzando variabili di ambiente impostate sopra:cat > /tmp/generated_payload.json << EOM { "critical": { "identity": { "docker-reference": "${IMAGE_PATH}" }, "image": { "docker-manifest-digest": "${IMAGE_DIGEST}" }, "type": "Google cloud binauthz container signature" } } EOM
Firma il file del payload:
curl \ --header "Content-Type: application/json" \ --header "Authorization: Bearer $(gcloud auth print-access-token)" \ --header "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ --data '{"digest": {"DIGEST_ALGORITHM": "'$(openssl dgst -sha256 -binary /tmp/generated_payload.json | openssl base64)'" }}' \ https://cloudkms.googleapis.com/v1/projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}/cryptoKeyVersions/${KMS_KEY_VERSION}:asymmetricSign?alt=json
Sostituisci DIGEST_ALGORITHM con l'algoritmo per il digest l'input. Gli esempi in questa guida utilizzano un digest
sha256
. Puoi utilizzare la modalitàsha256
,sha384
osha512
.In questo esempio, l'output è simile al seguente:
{ "signature": "<var>SIGNATURE</var>": "996305066", "name": "projects/<var>KMS_KEY_PROJECT_ID</var>/locations/<var>KMS_KEY_LOCATION</var>/keyRings/<var>KMS_KEYRING_NAME</var>/cryptoKeys/<var>KMS_KEY_NAME</var>/cryptoKeyVersions/<var>KMS_KEY_VERSION</var>" }
In questo output, SIGNATURE è la firma con codifica Base64 del file payload.
Archivia la firma in una variabile di ambiente:
PAYLOAD_SIGNATURE=PAYLOAD_SIGNATURE
Recupera l'attestatore per conto di cui stai firmando il l'attestazione ed estrarre l'ID della chiave pubblica archiviati e l'ID nota:
curl \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors/"
Autorizzazione binaria restituisce un oggetto JSON simile al seguente:
{ "name": "projects/example-project/attestors/test-attestor", "userOwnedGrafeasNote": { "noteReference": "projects/example-project/notes/test-attestor", "publicKeys": [ { "id": "ni:///sha-256;EwVxs8fNUAHq9FI2AMfh8WNIXVBuuTMeGtPH72U-I70", "pkixPublicKey": { "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEXnpuYEfvLl1kj4fjxViFRwY1a+zC\n5qzlf9LJIK+rnjq42tiKGyyXMbnZKJiYPPdMDGyltnkrABnztg2jJ48aYQ==\n-----END PUBLIC KEY-----\n", "signatureAlgorithm": "ECDSA_P256_SHA256" } } ], "delegationServiceAccountEmail": "service-363451293945@gcp-sa-binaryauthorization.iam.gserviceaccount.com" }, "updateTime": "2019-06-26T16:58:33.977438Z" }
Puoi trovare l'ID della chiave pubblica nel campo
id
e l'ID nota in nel camponoteReference
.Archivia l'ID della chiave pubblica in una variabile di ambiente:
PUBLIC_KEY_ID="PUBLIC_KEY_ID" NOTE_URI="NOTE_URI"
Sostituisci quanto segue:
- PUBLIC_KEY_ID: l'ID della chiave pubblica dell'attestatore.
- NOTE_URI: l'URI di Artifact Analysis nota associata all'attestatore.
Crea un file JSON in
/tmp/attestation.json
che descrive l'attestazione:cat > /tmp/attestation.json << EOM { "resourceUri": "${IMAGE_TO_ATTEST}", "note_name": "${NOTE_URI}", "attestation": { "serialized_payload": "$(base64 --wrap=0 /tmp/generated_payload.json)", "signatures": [ { "public_key_id": "${PUBLIC_KEY_ID}", "signature": "${PAYLOAD_SIGNATURE}" } ] } } EOM
Crea l'attestazione:
curl -X POST \ -H "Content-Type: application/json" \ -H "X-Goog-User-Project: ${ATTESTATION_PROJECT_ID}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ --data-binary @/tmp/attestation.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTATION_PROJECT_ID}/occurrences/"
Hai creato l'attestazione.
Verifica che l'attestazione sia stata creata
Per verificare che l'attestazione sia stata creata, puoi elencare le attestazioni associate con l'immagine.
gcloud
Per recuperare un elenco di attestazioni, inserisci il comando seguente:
gcloud container binauthz attestations list\ --project="${ATTESTATION_PROJECT_ID}"\ --attestor="projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}"\ --artifact-url="${IMAGE_TO_ATTEST}"
API REST
Per richiedere un elenco di attestazioni, inserisci il seguente comando:
curl -X GET \ -H "Content-Type: application/json" \ -H "X-Goog-User-Project: ${ATTESTOR_PROJECT_ID}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}/occurrences?filter=resourceUrl%3D%22https%3A%2F%2F$(jq -rn --arg x ${IMAGE_TO_ATTEST} '$x|@uri')%22
Se sono presenti molte attestazioni, la risposta potrebbe contenere un valore nextPageToken
valore. In questo caso, puoi recuperare la pagina successiva di risultati ripetendo
la richiesta, aggiungendo un parametro di query pageToken
, come segue:
NEXT_PAGE_TOKEN=NEXT_PAGE_TOKEN curl -X GET \ -H "Content-Type: application/json" \ -H "X-Goog-User-Project: ${ATTESTOR_PROJECT_ID}" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}/occurrences?filter=resourceUrl%3D%22https%3A%2F%2F$(jq -rn --arg x ${IMAGE_TO_ATTEST} '$x|@uri')%22&pageToken=${NEXT_PAGE_TOKEN}
Sostituisci NEXT_PAGE_TOKEN con il valore nextPageToken
in
la risposta dalla richiesta precedente.
Se il campo nextPageToken
è vuoto, significa che non ci sono altri risultati.
Elimina l'attestazione
Prima di eliminare l'attestazione:
Comprendi le implicazioni dell'eliminazione. Eliminazione di un'attestazione alla fine blocca le immagini container associate all'attestazione dal deployment.
Arresta tutti i container in esecuzione associati alle attestazioni che intendi eliminare.
Elimina tutte le copie delle attestazioni ovunque si trovino, ad esempio le attestazioni nei repository Artifact Registry e Artifact Analysis.
Assicurati che il deployment delle immagini interessate sia effettivamente bloccato di eseguire nuovamente il deployment.
Per eliminare un'attestazione, esegui questi comandi:
Elenca le attestazioni:
gcloud container binauthz attestations list \ --attestor-project=${ATTESTOR_PROJECT_ID} \ --attestor=${ATTESTOR_NAME}
L'attestazione contiene un ID occorrenza. L'output è simile seguenti:
projects/ATTESTOR_PROJECT_ID/occurrences/OCCURRENCE_ID
Salva l'ID occorrenza.
Salva l'ID occorrenza dell'attestazione che vuoi eliminare.
OCCURRENCE_ID=OCCURRENCE_ID
Elimina l'attestazione:
curl -H "Authorization: Bearer $(gcloud auth print-access-token)" -X DELETE \ https://containeranalysis.googleapis.com/v1beta1/projects/${ATTESTATION_PROJECT_ID}/occurrences/${OCCURRENCE_ID}
Verifica che le attestazioni siano state eliminate elencando di nuovo le attestazioni.
Passaggi successivi
- Scopri di più sulla separazione dei compiti e sui ruoli di Identity and Access Management.
- Implementa la separazione dei compiti in questa configurazione multiprogetto (GKE) tutorial di Google Cloud.
- Eseguire il deployment di un'immagine container (GKE) in un cluster in cui è abilitata Autorizzazione binaria.
- Esegui il deployment di un'immagine container (Cloud Run) in un cluster in cui è abilitata Autorizzazione binaria.