In questa pagina viene spiegato come creare un attestatore personalizzato in Autorizzazione binaria utilizzando l'API REST.
In alternativa, puoi eseguire questi passaggi anche utilizzando Google Cloud CLI o la consoleGoogle Cloud . Questa attività fa parte della configurazione di Autorizzazione binaria.
Utenti di Cloud Build: potete utilizzare l'attestatore built-by-cloud-build per eseguire il deployment solo delle immagini create da Cloud Build.
Panoramica
Un attestatore è una risorsa Google Cloud utilizzata da Autorizzazione binaria per verificare un'attestazione. Per saperne di più sulle attestazioni, consulta la panoramica di Autorizzazione binaria.
Per creare un attestatore, devi:
- Crea una nota in Artifact Analysis per archiviare i metadati attendibili utilizzati nel processo di attestazione.
- Configura una coppia di chiavi PKIX (Public-Key Infrastructure (X.509)) che può essere utilizzata per verificare l'identità dell'attestatore. (Le coppie di chiavi asimmetriche generate da Cloud Key Management Service (Cloud KMS) sono in formato compatibile con PKIX). Puoi anche utilizzare coppie di chiavi PGP anziché chiavi PKIX.
- Crea l'attestatore in Autorizzazione binaria e associa la nota e la chiave pubblica che hai creato.
In una configurazione con un singolo progetto, crei l'attestatore nello stesso progetto Google Cloud in cui configuri la policydi Autorizzazione binaria. In una configurazione multiprogetto, è molto probabile che tu abbia un progetto di deployment in cui è configurata la policy e un progetto attestatore separato in cui sono archiviati gli attestatori.
Prima di iniziare
Imposta il progetto predefinito
Imposta il progetto Google Cloud predefinito, se non l'hai ancora fatto:
PROJECT_ID=PROJECT_ID
gcloud config set project ${PROJECT_ID}
Configura l'ambiente
Configura le variabili di ambiente per archiviare i nomi e i numeri dei progetti:
DEPLOYER_PROJECT_ID=${PROJECT_ID}
DEPLOYER_PROJECT_NUMBER="$(
gcloud projects describe "${DEPLOYER_PROJECT_ID}" \
--format="value(projectNumber)"
)"
ATTESTOR_PROJECT_ID=${PROJECT_ID}
ATTESTOR_PROJECT_NUMBER="$(
gcloud projects describe "${ATTESTOR_PROJECT_ID}" \
--format="value(projectNumber)"
)"
Se il progetto dell'attestatore e quello del deployer sono lo stesso progetto, utilizza lo stesso ID progetto per entrambe le variabili.
Devi anche ottenere i nomi dei account di servizio per i progetti:
DEPLOYER_SERVICE_ACCOUNT="service-${DEPLOYER_PROJECT_NUMBER}@gcp-sa-binaryauthorization."
ATTESTOR_SERVICE_ACCOUNT="service-${ATTESTOR_PROJECT_NUMBER}@gcp-sa-binaryauthorization."
Crea una nota Artifact Analysis
Autorizzazione binaria utilizza Artifact Analysis per archiviare i metadati attendibili utilizzati nel processo di autorizzazione. Per ogni attestatore che crei, devi creare una nota Artifact Analysis. Ogni attestazione viene archiviata come occorrenza di questa nota.
Per creare una nota Artifact Analysis:
Configura le variabili di ambiente per archiviare l'ID della nota e una descrizione leggibile:
NOTE_ID=NOTE_ID NOTE_URI="projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}" DESCRIPTION=DESCRIPTIONSostituisci quanto segue:
- NOTE_ID è il nome interno della nota in caratteri alfanumerici senza spazi (ad esempio,
test-attestor-note) - NOTE_URI è il percorso completo della risorsa nota
- DESCRIPTION è un nome visualizzato leggibile per la nota
(ad esempio,
Test Attestor Note)
- NOTE_ID è il nome interno della nota in caratteri alfanumerici senza spazi (ad esempio,
In un editor di testo, crea un file JSON in
/tmp/note_payload.jsonche descriva la nota di Artifact Analysis:cat > /tmp/note_payload.json << EOM { "name": "${NOTE_URI}", "attestation": { "hint": { "human_readable_name": "${DESCRIPTION}" } } } EOMCrea la nota inviando una richiesta HTTP all'API REST Artifact Analysis:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ --data-binary @/tmp/note_payload.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/?noteId=${NOTE_ID}"
Per verificare che la nota sia stata creata correttamente, esegui questo comando:
curl \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \
"https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/"
Imposta le autorizzazioni per la nota
Devi anche impostare le autorizzazioni sulla nota Artifact Analysis che hai creato in modo che sia accessibile al account di servizio del progetto dell'attestatore. Per farlo, aggiorna la policy IAM per la nota in modo da assegnare il ruolo containeranalysis.notes.occurrences.viewer all'account.
Per impostare le autorizzazioni:
Genera un file JSON contenente le informazioni necessarie per impostare la policy IAM sulla nota:
cat > /tmp/iam_request.json << EOM { 'resource': '${NOTE_URI}', 'policy': { 'bindings': [ { 'role': 'roles/containeranalysis.notes.occurrences.viewer', 'members': [ 'serviceAccount:${ATTESTOR_SERVICE_ACCOUNT}' ] } ] } } EOMAggiungi il account di servizio e i ruoli di accesso richiesti alla policy IAM per la nota che hai creato:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ --data-binary @/tmp/iam_request.json \ "https://containeranalysis.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/notes/${NOTE_ID}:setIamPolicy"
Configura le chiavi di crittografia
Autorizzazione binaria ti consente di utilizzare le chiavi PKIX per verificare in modo sicuro l'identità del firmatario che ha creato un'attestazione. In questo modo, solo le parti verificate possono autorizzare un'immagine container. In alternativa a PKIX, puoi anche utilizzare le chiavi PGP.
Crea una coppia di chiavi PKIX
Autorizzazione binaria consente di utilizzare coppie di chiavi PKIX asimmetriche per verificare un'attestazione. La coppia di chiavi è composta da una chiave privata, che il firmatario utilizza per firmare digitalmente le attestazioni, e da una chiave pubblica, che aggiungi all'attestatore. In seguito, l'applicazione di Autorizzazione binaria utilizza la chiave pubblica nell'attestatore per verificare che l'attestazione sia stata creata dal firmatario.
In questa guida, per generare una coppia di chiavi PKIX viene utilizzato l'algoritmo ECDSA (Elliptic Curve Digital Signature Algorithm) consigliato. Puoi anche utilizzare le chiavi RSA o PGP per la firma. Per saperne di più sugli algoritmi di firma, consulta Scopi e algoritmi delle chiavi.
Le coppie di chiavi asimmetriche generate e archiviate in Cloud KMS sono conformi al formato PKIX. Per creare una chiave Cloud KMS da utilizzare con Autorizzazione binaria, consulta Creazione di chiavi asimmetriche. Assicurati di scegliere Firma asimmetrica come scopo della chiave quando la crei.
PKIX (Cloud KMS)
Per creare la coppia di chiavi in Cloud KMS, segui questi passaggi:
Per configurare le variabili di ambiente necessarie per creare la coppia di chiavi, esegui questi comandi:
KMS_KEY_PROJECT_ID=
KMS_KEY_PROJECT_IDKMS_KEY_LOCATION=KMS_KEY_LOCATIONKMS_KEYRING_NAME=KMS_KEYRING_NAMEKMS_KEY_NAME=KMS_KEY_NAMEKMS_KEY_VERSION=KMS_KEY_VERSIONKMS_KEY_PURPOSE=asymmetric-signing KMS_KEY_ALGORITHM=KMS_KEY_ALGORITHMKMS_PROTECTION_LEVEL=KMS_PROTECTION_LEVELSostituisci quanto segue:
KMS_KEY_PROJECT_ID: l'ID del progetto in cui sono archiviate le chiavi.KMS_KEY_LOCATION: la posizione della chiaveKMS_KEYRING_NAME: il nome delle chiavi automatizzateKMS_KEY_NAME: il nome della chiaveKMS_KEY_VERSION: la versione della chiaveKMS_KEY_ALGORITHM: l'algoritmo;ec-sign-p256-sha256è consigliatoKMS_PROTECTION_LEVEL: il livello di protezione, ad esempiosoftware
Per creare il keyring, esegui questo comando:
gcloud kms keyrings create ${KMS_KEYRING_NAME} \ --location ${KMS_KEY_LOCATION}Per creare la chiave, esegui questo comando:
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}
PKIX (chiave locale)
Per generare una nuova coppia di chiavi PKIX asimmetriche locali e archiviarla in un file:
Genera la chiave:
PRIVATE_KEY_FILE="/tmp/ec_private.pem" openssl ecparam -genkey -name prime256v1 -noout -out ${PRIVATE_KEY_FILE}Poiché questo file contiene sia una chiave pubblica che una chiave privata, devi estrarre la chiave pubblica in un file separato per poterla aggiungere all'attestatore:
PUBLIC_KEY_FILE="/tmp/ec_public.pem" openssl ec -in ${PRIVATE_KEY_FILE} -pubout -out ${PUBLIC_KEY_FILE}
Crea l'attestatore
Il passaggio successivo consiste nel creare l'attestatore in Autorizzazione binaria con la nota Artifact Analysis associata. Devi anche aggiungere la chiave pubblica crittografica.
Per creare l'attestatore:
Configura una variabile di ambiente per archiviare il nome dell'attestatore come definito in Autorizzazione binaria:
ATTESTOR_NAME=ATTESTOR_NAME
dove ATTESTOR_NAME è il nome dell'attestatore che vuoi creare (ad esempio
build-secureoprod-qa).Crea l'attestatore e collega la chiave di sicurezza pubblica:
PKIX (Cloud KMS)
Configura variabili di ambiente aggiuntive per archiviare le informazioni sulla coppia di chiavi Cloud KMS per la chiamata all'API Autorizzazione binaria.
KMS_CRYPTO_KEY_URI="projects/${KMS_KEY_PROJECT_ID}/locations/${KMS_KEY_LOCATION}/keyRings/${KMS_KEYRING_NAME}/cryptoKeys/${KMS_KEY_NAME}" KMS_CRYPTO_KEY_VERSION_URI="${KMS_CRYPTO_KEY_URI}/cryptoKeyVersions/${KMS_KEY_VERSION}" KMS_KEY_ID="//cloudkms.googleapis.com/v1/${KMS_CRYPTO_KEY_VERSION_URI}"Scarica il file della chiave pubblica da Cloud KMS e salvalo in un file denominato
/tmp/kms_public_key.pemnel tuo sistema locale.Genera un file JSON contenente le informazioni necessarie per creare l'attestatore:
cat > /tmp/attestor.json << EOM { "userOwnedDrydockNote": { "noteReference": "${NOTE_URI}", "publicKeys": { "id": "${KMS_KEY_ID}", "pkixPublicKey": { "signatureAlgorithm": "${KMS_KEY_ALGORITHM}", "publicKeyPem": $( \ python < /tmp/kms_public_key.pem \ -c 'import json, sys; print(json.dumps(sys.stdin.read()))' \ ) } } } } EOMCrea l'attestatore:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "X-Goog-User-Project: ${ATTESTOR_PROJECT_ID}" \ --data-binary @/tmp/attestor.json \ "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors?attestorId=${ATTESTOR_NAME}"
PKIX (chiave locale)
Genera un file JSON contenente le informazioni necessarie per creare l'attestatore:
cat > /tmp/attestor.json << EOM { "userOwnedGrafeasNote": { "noteReference": "${NOTE_URI}", "publicKeys": { "pkixPublicKey": { "signatureAlgorithm": "ecdsa_p256_sha256", "publicKeyPem": $( \ python < ${PUBLIC_KEY_FILE} \ -c 'import json, sys; print(json.dumps(sys.stdin.read()))' \ ) } } } } EOMCrea l'attestatore:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "X-Goog-User-Project: ${ATTESTOR_PROJECT_ID}" \ --data-binary @/tmp/attestor.json \ "https://binaryauthorization.googleapis.com/v1/projects/${ATTESTOR_PROJECT_ID}/attestors?attestorId=${ATTESTOR_NAME}"
Aggiungi un'associazione di ruoli IAM per il progetto del deployer all'attestatore. Questo ruolo viene utilizzato da Autorizzazione binaria quando valuta una policy per determinare se il progetto dispone delle autorizzazioni per accedere all'attestatore di riferimento.
Genera un file JSON contenente le informazioni necessarie per impostare la policy IAM sull'attestatore:
cat > /tmp/iam_request.json << EOM { 'resource': 'projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}', 'policy': { 'bindings': [ { 'role': 'roles/binaryauthorization.attestorsVerifier', 'members': [ 'serviceAccount:${DEPLOYER_SERVICE_ACCOUNT}' ] } ] } } EOMAggiungi il account di servizio e i ruoli di accesso richiesti alla policy IAM per la nota che hai creato:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "x-goog-user-project: ${ATTESTOR_PROJECT_ID}" \ --data-binary @/tmp/iam_request.json \ "https://binaryauthorization.googleapis.com/v1beta1/projects/${ATTESTOR_PROJECT_ID}/attestors/${ATTESTOR_NAME}:setIamPolicy"Se ricevi un errore
service account not foundquando concedi il ruolo IAM, potresti dover creare manualmente l'agente di servizio.
Verifica che l'attestatore sia stato creato
Per verificare che l'attestatore sia stato creato, esegui questo comando:
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/"
Passaggi successivi
- Scopri come creare attestazioni per l'attestatore.
- Aggiorna la policy di Autorizzazione binaria in modo che richieda le attestazioni utilizzando la consoleGoogle Cloud , Google Cloud CLI e l'API REST.