Questo tutorial descrive come configurare e utilizzare Voucher per creare attestazioni Binary Authorization.
Panoramica di Voucher
Voucher è uno strumento open source che esegue una suite di controlli sulle immagini container prima di creare attestati di Autorizzazione binaria per le immagini. Coupon ha un client e un componente Server. Esegui il client Voucher come passaggio aggiuntivo all'interno della pipeline di build, dopo quello durante la creazione dell'immagine. Durante il passaggio di build del client Voucher, invia l'immagine a Voucher Server, che esegue i controlli. Puoi definire i controlli eseguiti da Voucher, insieme ad altri criteri, nel file di configurazione di Vooucher Server.
Questo tutorial mostra come utilizzare il controllo Voucher snakeoil
per testare le vulnerabilità nelle immagini. Puoi attivare il controllo nel file di configurazione impostando l'opzione fail-on
su una soglia di vulnerabilità, come mostrato più avanti in questo tutorial.
Al termine del controllo snakeoil
, se tutte le vulnerabilità identificate
rientrano al di sotto della soglia, Voucher Server crea l'attestato Autorizzazione binaria
per l'immagine. Se una delle vulnerabilità identificate soddisfa o supera la soglia, Voucher Server non crea un'attestazione.
Al momento del deployment dell'immagine container, senza un'attestazione verificata, l'applicazione forzata di Autorizzazione binaria non consente il deployment dell'immagine.
Obiettivi
In questa guida:
- Configura Voucher Server in Cloud Run.
- Configura il client Voucher.
- Usa Voucher in esempi di pipeline di build.
Costi
Questa guida si basa sui seguenti prodotti Google Cloud.
- Container Registry
- Container Analysis
- Cloud Build
- Cloud Key Management Service
- Cloud Run
Utilizza il Calcolatore prezzi per generare una stima dei costi in base all'utilizzo previsto.
Prima di iniziare
- Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
-
Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.
-
Abilita le API Cloud Build, Container Registry, Container Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.
- Installa Google Cloud CLI.
-
Per inizializzare l'interfaccia a riga di comando gcloud, esegui il comando seguente:
gcloud init
-
Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.
-
Abilita le API Cloud Build, Container Registry, Container Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.
- Installa Google Cloud CLI.
-
Per inizializzare l'interfaccia a riga di comando gcloud, esegui il comando seguente:
gcloud init
- Ti consigliamo di configurare Autorizzazione binaria con Google Kubernetes Engine. Questo tutorial descrive come creare un'attestazione. Per utilizzare l'applicazione al momento del deployment per verificare l'attestazione ed eseguire il deployment dell'immagine associata, devi configurare l'autorizzazione binaria. Assicurati di configurare il criterio in modo che richiedi le attestazioni. Puoi configurare il criterio in Google Cloud Console o nella riga di comando.
-
Specifica il tuo progetto Google Cloud in una variabile di ambiente.
export PROJECT_ID=PROJECT_ID
Sostituisci PROJECT_ID con l'ID progetto.
-
Imposta l'ID progetto per i comandi
gcloud
:gcloud config set project ${PROJECT_ID}
-
Specifica il numero di progetto in una variabile di ambiente per i passaggi successivi:
export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" \ --format='value(project_number)')
Configura server Voucher
Nei passaggi seguenti puoi configurare il Voucher Server.
Crea una chiave di firma di Cloud Key Management Service
In questa sezione creerai la chiave utilizzata da Voucher Server per creare un'attestazione di autorizzazione binaria.
Crea un keyring:
gcloud kms keyrings create KEY_RING\ --location global
Sostituisci KEY_RING con un nome per il keyring, ad esempio
voucher-key-ring
.Crea una chiave di firma:
gcloud kms keys create KEY_NAME \ --keyring KEY_RING \ --location global \ --purpose "asymmetric-signing" \ --default-algorithm "rsa-sign-pkcs1-4096-sha512"
Sostituisci KEY_NAME con il nome di una chiave, ad esempio
voucher-key
.Archivia la ID risorsa della versione del token di Cloud Key Management Service:
export KMS_RESOURCE_ID=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
Concedi il ruolo
cloudkms.signer
all'account di servizio del motore di runtime Compute Engine.In questo passaggio, concederai il ruolo
cloudkms.signer
all'account di servizio che esegue Voucher Server. Ciò consente a Voucher Server di fissare le attestazioni con le chiavi di Cloud Key Management Service. Per farlo, esegui il comando seguente:gcloud kms keys add-iam-policy-binding\ KEY_NAME --keyring=KEY_RING\ --location=global\ --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com\ --role=roles/cloudkms.signer
Creare la nota Container Analysis
In questa sezione creerai la nota.
Memorizza l'ID nota:
export NOTE_ID=snakeoil
Memorizza l'URI della nota:
export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
Crea payload di richiesta:
cat > /tmp/note_payload.json << EOM { "name": "${NOTE_URI}", "attestation": { "hint": { "human_readable_name": "voucher note for snakeoil check" } } } EOM
Crea la nota:
curl -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $(gcloud --project ${PROJECT_ID} auth print-access-token)" \ -H "x-goog-user-project: ${PROJECT_ID}" \ --data-binary @/tmp/note_payload.json \ "https://containeranalysis.googleapis.com/v1/projects/${PROJECT_ID}/notes/?noteId=${NOTE_ID}"
Creazione e configurazione di un Voucher Server
In questa configurazione una tantum puoi ottenere, configurare e creare l'immagine di Voucher Server. Puoi quindi archiviarlo in Container Registry.
Clona il repository di Voucher:
git clone https://github.com/grafeas/voucher.git cd voucher/
Questo repository contiene:
- Codice sorgente per creare il Voucher Server.
- Codice sorgente per creare il client Voucher.
- Esempi che dimostrano l'utilizzo di Voucher.
Aggiorna il file di configurazione del server Voucher.
Linux
Crea il file di configurazione di Voucher Server da un modello, sostituendo
e con i valori definiti in precedenza. Per farlo, esegui questo comando: cat tutorials/cloudrun/config.toml.template \ | sed -e "s?<PROJECT_ID>?${PROJECT_ID}?g" \ | sed -e "s?<KMS_KEY_NAME>?${KMS_RESOURCE_ID}?g" \ > tutorials/cloudrun/config.toml
Altro sistema operativo
Modifica il file
tutorials/cloudrun/config.toml.template
.- Sostituisci
<PROJECT_ID>
con il valore specificato nell'attributo${PROJECT_ID}
. - Sostituisci
<KMS_KEY_NAME>
con il valore specificato nell'attributo${KMS_RESOURCE_ID}
.
- Sostituisci
Salva il file come
tutorials/cloudrun/config.toml
.
Visualizzare il file di configurazione di Voucher Server:
cat tutorials/cloudrun/config.toml
Viene visualizzato un output contenente i seguenti elementi:
failon = "high"
Tieni presente che nel file di configurazione, l'opzione
failon
è impostata suhigh
. Questa impostazione configura Voucher Server per l'esecuzione di un controllo delle vulnerabilità su un'immagine. Se l'immagine contiene vulnerabilità con gravitàHIGH
, il controllo non riesce e Voucher Server non crea l'attestato di Autorizzazione binaria. Per maggiori informazioni sulle impostazionifail-on
, consulta la sezione Fail-On: errore relativo alle vulnerabilità.Crea e carica l'immagine del container del Voucher Server:
In questa sezione esegui la pipeline di Cloud Build che crea l'immagine del container Voucher Server. La build carica anche l'immagine del Voucher Server su gcr.io/$PROJECT_ID/voucher-server.
gcloud builds submit --config ./tutorials/cloudrun/cloudbuild-server.yaml
Deployment di Voucher Server su Cloud Run
Seleziona un'area geografica.
Per visualizzare un elenco delle aree geografiche disponibili, vedi Visualizzare un elenco delle aree geografiche disponibili. Crea una variabile per archiviare l'area geografica selezionata:
export REGION=REGION
Sostituisci REGION con il nome dell'area geografica in cui prevedi di eseguire il deployment del tuo Voucher Server.
Esegui il deployment del Voucher Server su Cloud Run.
gcloud run deploy --image gcr.io/${PROJECT_ID}/voucher-server \ --platform managed voucher-server \ --region ${REGION} \ --no-allow-unauthenticated
Il risultato è simile al seguente:
Service [voucher-server] revision [voucher-server-00001-caw] has been deployed and is serving 100 percent of traffic. Service URL: https://voucher-server-4wjtm2amga-uc.a.run.app
Memorizza l'URL del servizio Voucher Server:
export SERVER_SERVICE_URL=$(gcloud run services describe voucher-server --platform managed --region ${REGION} --format='value(status.url)')
Configura client coupon
Nei passaggi seguenti puoi configurare il coupon Voucher.
Crea l'account di servizio dell'invoker per il client Voucher:
gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
Sostituisci INVOKER_ACCOUNT_NAME con un nome per l'account di servizio dell'invoker, ad esempio
voucher-invoker
.Specifica l'account di servizio:
export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
Concedi il ruolo
run.invoker
all'account di servizio dell'operatore per il tuo progetto.Concedi all'account di servizio del chiamante l'autorizzazione per richiamare il Voucher Server su Cloud Run. Per farlo, inserisci il seguente comando:
gcloud run services add-iam-policy-binding voucher-server \ --member serviceAccount:$INVOKER_SERVICE_ACCOUNT \ --role roles/run.invoker \ --platform managed \ --region ${REGION}
Concedi il ruolo
iam.serviceAccountTokenCreator
all'account di servizio invoker per Cloud Build.In questa sezione, concedi all'account di servizio Cloud Build l'autorizzazione per impersonare l'account di servizio invoker in modo che il client Voucher abbia l'autorizzazione per inviare richieste a Voucher Server durante la build. Per farlo, inserisci il seguente comando:
gcloud iam service-accounts add-iam-policy-binding $INVOKER_SERVICE_ACCOUNT \ --member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
Utilizzare Voucher per verificare la presenza di vulnerabilità nelle immagini
In questa sezione eseguirai due pipeline di Cloud Build di esempio. In entrambe le pipeline, puoi creare un'immagine e utilizzare Voucher per controllare le vulnerabilità.
Richiesta non riuscita
In questa sezione la pipeline di build di esempio non crea un'attestazione.
L'immagine che crei basata su Debian 9 contiene almeno una vulnerabilità di gravità HIGH
. L'opzione fail-on
nel Voucher Server config.toml
è impostata per non riuscire sulle vulnerabilità di gravità HIGH
. In questo caso,
Voucher Server non crea un'attestazione di Autorizzazione binaria.
Esegui la pipeline di build:
gcloud builds submit \ --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT \ --config=tutorials/cloudrun/examples/cloudbuild-bad.yaml tutorials/cloudrun/examples
Cerca nel log dell'ultima build i risultati di Voucher
snakeoil
:Console
Prendi nota dell'ID dell'ultima build.
In Google Cloud Console, vai alla pagina Cronologia build.
In Build, fai clic sull'elemento che contiene i primi caratteri dell'ID build.
Fai clic su Visualizza dati non elaborati.
Cerca
snakeoil
usando il browser.Il risultato è simile al seguente:
"name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
gcloud
Salva l'ID della build:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
Per cercare nel log della build, inserisci questo comando:
gcloud builds log ${BUILD_ID} | grep "snakeoil"
L'output ha il seguente aspetto:
"name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
Caso di successo
In questa sezione, la pipeline di build di esempio riesce a creare un'attestazione.
Tutte le vulnerabilità identificate sono classificate in modo inferiore alla soglia di fail-on
, in modo che il controllo supera la pipeline e crei l'attestazione.
Esegui la pipeline:
gcloud builds submit\ --substitutions=_SERVICE_URL=$SERVER_SERVICE_URL,_SERVICE_ACCOUNT=$INVOKER_SERVICE_ACCOUNT\ --config=tutorials/cloudrun/examples/cloudbuild-good.yaml tutorials/cloudrun/examples
Cerca nel log dell'ultima build i risultati di Voucher
snakeoil
:Console
Prendi nota dell'ID dell'ultima build.
In Google Cloud Console, vai alla pagina Cronologia build.
In Build, fai clic sull'elemento che contiene i primi caratteri dell'ID build.
Fai clic su Visualizza dati non elaborati.
Cerca
snakeoil
usando il browser.Il risultato è simile al seguente:
"name":"snakeoil","success":true,"attested":true
gcloud
Salva l'ID build dell'ultima build:
export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
Per cercare nel log della build, inserisci questo comando:
gcloud builds log ${BUILD_ID} | grep "snakeoil"
L'output ha il seguente aspetto:
"name":"snakeoil","success":true,"attested":true
Esegui la pulizia
Per pulire le risorse utilizzate in questo documento, puoi eliminare il progetto nel seguente modo:
gcloud projects delete ${PROJECT_ID}
Passaggi successivi
- Configura il criterio di autorizzazione binaria per richiedere attestazioni utilizzando lo strumento a riga di comando o Google Cloud Console.
- Crea l'autorizzazione binaria dell'attestatore da utilizzare per verificare l'attestazione al momento del deployment utilizzando lo strumento a riga di comando o Google Cloud Console.
- Visualizza la documentazione di GitHub su GitHub.
- Scopri di più sull'autorizzazione binaria.
- Scopri di più su Container Analysis e sulla scansione delle vulnerabilità.
- Scopri di più su Cloud Key Management Service.