Creazione di attestazioni con Voucher

Questo tutorial descrive come configurare e utilizzare Voucher per creare attestazioni di Autorizzazione binaria.

Panoramica del coupon

Voucher è uno strumento open source che esegue una suite di controlli sulle immagini container prima di creare attestations di Autorizzazione binaria per le immagini. Il voucher ha un componente client e un componente server. Esegui Voucher Client come passaggio aggiuntivo nella pipeline di build, dopo il passaggio che crea l'immagine. Quando viene eseguito il passaggio di creazione del client coupon, l'immagine viene inviata al server coupon, che esegue i controlli. Puoi definire i controlli eseguiti da Voucher e altri criteri nel file di configurazione del server dei coupon.

Questo tutorial mostra come utilizzare il controllo snakeoil del coupon per testare le vulnerabilità nelle immagini. Puoi abilitare 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 scendono al di sotto della soglia, il server voucher crea l'attestazione di Autorizzazione binaria per l'immagine. Se una delle vulnerabilità identificate soddisfa o supera la soglia, il server voucher 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:

  1. Configura il server voucher in Cloud Run.
  2. Configura il client voucher.
  3. Utilizza Voucher in pipeline di build di esempio.

Costi

Questa guida utilizza i seguenti prodotti Google Cloud.

  • Container Registry
  • Artifact 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

  1. 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.
  2. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.

    Abilita le API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  8. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  9. Abilita le API Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management.

    Abilita le API

  10. Installa Google Cloud CLI.
  11. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  12. Ti consigliamo di configurare Autorizzazione binaria con Google Kubernetes Engine. Questo tutorial descrive come creare un'attestazione. Per utilizzare l'applicazione forzata in fase di deployment per verificare l'attestazione ed eseguire il deployment dell'immagine associata, è necessario configurare Autorizzazione binaria. Assicurati di configurare il criterio in modo da richiedere le attestazioni. Puoi configurare il criterio nella console Google Cloud o dalla riga di comando.
  13. Specifica il progetto Google Cloud in una variabile di ambiente.

      export PROJECT_ID=PROJECT_ID
    

    Sostituisci PROJECT_ID con l'ID progetto.

  14. Imposta l'ID progetto per i comandi gcloud:

    gcloud config set project ${PROJECT_ID}

  15. Specifica il numero del progetto in una variabile di ambiente per i passaggi futuri:

    export PROJECT_NUMBER=$(gcloud projects describe "${PROJECT_ID}" \
      --format='value(project_number)')

Configura server coupon

Nei passaggi seguenti puoi configurare il server dei coupon.

Crea una chiave di firma di Cloud Key Management Service

In questa sezione creerai la chiave utilizzata dal server dei coupon per creare un'attestazione di Autorizzazione binaria.

  1. Crea un keyring:

    gcloud kms keyrings create KEY_RING\
       --location global
    

    Sostituisci KEY_RING con il nome di un keyring, ad esempio voucher-key-ring.

  2. 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.

  3. Archivia l'ID risorsa della versione della chiave Cloud Key Management Service:

    export KMS_RESOURCE_ID=projects/$PROJECT_ID/locations/global/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    
  4. Concedi il ruolo cloudkms.signer all'account di servizio del motore di runtime di Compute Engine.

    In questo passaggio, concederai il ruolo cloudkms.signer all'account di servizio che esegue il server voucher. In questo modo Voucher Server può firmare le attestazioni con le chiavi di Cloud Key Management Service. Per farlo, esegui questo comando:

    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
    

Creazione della nota Artifact Analysis

In questa sezione creerai la nota.

  1. Memorizza l'ID nota:

    export NOTE_ID=snakeoil
    
  2. Memorizza l'URI della nota:

    export NOTE_URI=projects/$PROJECT_ID/notes/$NOTE_ID
    
  3. Crea payload della richiesta:

    cat > /tmp/note_payload.json << EOM
    {
      "name": "${NOTE_URI}",
      "attestation": {
        "hint": {
          "human_readable_name": "voucher note for snakeoil check"
        }
      }
    }
    EOM
    
  4. 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}"
    

Creare e configurare il server dei coupon

In questa configurazione da eseguire una sola volta, riceverai, configurerai e crei l'immagine del server dei coupon. quindi lo archivi in Container Registry.

  1. Clona il repository dei coupon:

    git clone https://github.com/grafeas/voucher.git
    cd voucher/
    

    Questo repository contiene:

    • Codice sorgente per creare il tuo server voucher.
    • Codice sorgente per creare Voucher Client.
    • Esempi che dimostrano l'utilizzo di un coupon.
  2. Aggiorna il file di configurazione del server voucher.

    Linux

    Crea il file di configurazione del server coupon da un modello, sostituendo e con i valori che hai definito sopra. 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

    1. Modifica il file tutorials/cloudrun/config.toml.template.

      • Sostituisci <PROJECT_ID> con il valore in ${PROJECT_ID}.
      • Sostituisci <KMS_KEY_NAME> con il valore in ${KMS_RESOURCE_ID}.
    2. Salva il file come tutorials/cloudrun/config.toml.

  3. Visualizza il file di configurazione del server voucher:

    cat tutorials/cloudrun/config.toml
    

    Verrà visualizzato un output contenente i seguenti elementi:

    failon = "high"
    

    Tieni presente che nel file di configurazione l'opzione failon è impostata su high. Questa impostazione configura il server voucher in modo che esegua un controllo delle vulnerabilità su un'immagine. Se l'immagine contiene vulnerabilità con gravità HIGH, il controllo non riesce e il server voucher non crea l'attestazione di Autorizzazione binaria. Per maggiori informazioni sulle impostazioni di fail-on, consulta Fail-On: errore sulle vulnerabilità.

  4. Crea e carica l'immagine container del server dei coupon:

    In questa sezione eseguirai la pipeline di Cloud Build che crea l'immagine del container Voucher Server. La build carica anche l'immagine del server coupon su gcr.io/$PROJECT_ID/voucher-server.

    gcloud  builds submit --config ./tutorials/cloudrun/cloudbuild-server.yaml
    

Esegui il deployment di un server voucher su Cloud Run

  1. Seleziona una regione.

    Per visualizzare un elenco delle regioni disponibili, vedi Visualizzare un elenco delle regioni disponibili. Crea una variabile per archiviare la regione selezionata:

    export REGION=REGION
    

    Sostituisci REGION con il nome della regione in cui prevedi di eseguire il deployment del server coupon.

  2. Esegui il deployment del server Voucher su Cloud Run.

    gcloud run deploy --image gcr.io/${PROJECT_ID}/voucher-server \
      --platform managed voucher-server \
      --region ${REGION} \
      --no-allow-unauthenticated
    

    Vedrai un output 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
    
  3. Memorizza l'URL del servizio del server dei coupon:

    export SERVER_SERVICE_URL=$(gcloud run services describe voucher-server --platform managed --region ${REGION} --format='value(status.url)')
    

Configura cliente voucher

Nei passaggi seguenti puoi configurare il client voucher.

  1. Crea l'account di servizio chiamante per il client voucher:

    gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
    

    Sostituisci INVOKER_ACCOUNT_NAME con un nome per l'account di servizio del chiamante, ad esempio voucher-invoker.

  2. Specifica l'account di servizio:

    export INVOKER_SERVICE_ACCOUNT=INVOKER_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
    
  3. Concedi il ruolo run.invoker all'account di servizio callout per il progetto.

    Concedi all'account di servizio del chiamante l'autorizzazione per richiamare il server coupon 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}
    
  4. Concedi il ruolo iam.serviceAccountTokenCreator all'account di servizio dell'invoker per Cloud Build.

    In questa sezione, concedi l'autorizzazione all'account di servizio Cloud Build per simulare l'account di servizio dell'invoker in modo che il client di Voucher abbia l'autorizzazione a inviare richieste al server dei coupon 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
    

Usa il voucher per verificare la presenza di vulnerabilità nelle immagini

In questa sezione eseguirai due pipeline Cloud Build di esempio. In entrambe le pipeline, crei un'immagine e poi utilizzi il voucher per verificare la presenza di eventuali vulnerabilità.

Caso di errore

In questa sezione, la pipeline di build di esempio non riesce a creare un'attestazione. L'immagine basata su Debian 9 contiene almeno una vulnerabilità di gravità HIGH. L'opzione fail-on nel server dei coupon config.toml è impostata in modo da non superare le vulnerabilità con gravità HIGH. In questo caso, il server coupon non crea un'attestazione di Autorizzazione binaria.

  1. 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
    
  2. Cerca nel log dell'ultima build i risultati del coupon snakeoil:

    Console

    1. Prendi nota dell'ID dell'ultima build.

    2. Nella console Google Cloud, vai alla pagina Cronologia build.

      Vai alla cronologia build

    3. In Build, fai clic sull'elemento che contiene i primi caratteri dell'ID build.

    4. Fai clic su Visualizza non elaborati.

    5. Cerca snakeoil utilizzando il browser.

      Vedrai un output simile al seguente:

      "name":"snakeoil","error":"vulnerable to 14 vulnerabilities"
      

    gcloud

    1. Salva l'ID della build:

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Cerca nel log di build inserendo il seguente comando:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      L'output sarà simile al seguente:

      "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 al di sotto della soglia fail-on quindi il controllo supera la pipeline crea l'attestazione.

  1. 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
    
  2. Cerca nel log dell'ultima build i risultati del coupon snakeoil:

    Console

    1. Prendi nota dell'ID dell'ultima build.

    2. Nella console Google Cloud, vai alla pagina Cronologia build.

      Vai alla cronologia build

    3. In Build, fai clic sull'elemento che contiene i primi caratteri dell'ID build.

    4. Fai clic su Visualizza non elaborati.

    5. Cerca snakeoil utilizzando il browser.

      Vedrai un output simile al seguente:

      "name":"snakeoil","success":true,"attested":true
      

    gcloud

    1. Salva l'ID build dell'ultima build:

      export BUILD_ID=$(gcloud builds list --limit=1 --format="value('ID')")
      
    2. Cerca nel log di build inserendo il seguente comando:

       gcloud builds log ${BUILD_ID} | grep "snakeoil"
      

      L'output sarà simile al seguente:

      "name":"snakeoil","success":true,"attested":true
      

Esegui la pulizia

Per eseguire la pulizia delle risorse utilizzate in questo documento, puoi eliminare il progetto come segue:

gcloud projects delete ${PROJECT_ID}

Crea un attestatore

Per creare un criterio che richieda le attestazioni create utilizzando il metodo descritto in questa guida, devi prima creare un attestatore.

Per creare un attestatore:

  1. Recupera il materiale della chiave pubblica dalla chiave Cloud KMS che hai creato in precedenza in questa guida:

    gcloud kms keys versions get-public-key 1 \
    --key KEY_NAME \
    --keyring KEY_RING \
    --location global \
    --output-file OUTPUT_PATH
    
    • KEY_NAME: il nome della chiave
    • KEY_RING: il nome del keyring
    • OUTPUT_PATH: un percorso file, ad esempio my-key.pem
  2. Crea un attestatore utilizzando il materiale della chiave pubblica nel file e la nota che hai creato in precedenza in questa guida. Puoi creare un attestatore tramite la console Google Cloud o gcloud CLI.

  3. Crea un criterio che richiede attestazioni e fornisci l'attestatore che hai creato in questa sezione. Puoi creare un criterio tramite la console Google Cloud o gcloud CLI.

Crea un'attestazione

Per creare un'attestazione utilizzando l'attestatore, vedi Creare un'attestazione utilizzando Cloud KMS.

Passaggi successivi