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 le attestazioni di Autorizzazione binaria per le immagini. Il coupon ha un componente client e un componente server. Esegui Voucher Client come passaggio aggiuntivo nella pipeline di compilazione, dopo il passaggio che genera l'immagine. Quando viene eseguito il passaggio di compilazione del cliente del coupon, l'immagine viene inviata al server del coupon, che esegue i controlli. Puoi definire quali controlli vengono eseguiti da Voucher, insieme ad altri criteri, nel file di configurazione del server Voucher.

Questo tutorial mostra come utilizzare il controllo snakeoilCoupon per verificare la presenza di vulnerabilità nelle immagini. Attiva 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'attestazione di autorizzazione binaria per l'immagine. Se una delle vulnerabilità identificate raggiunge o supera la soglia, il server dei coupon non crea un'attestazione.

Al momento del deployment dell'immagine del contenitore, senza un'attestazione verificata, l'agente di applicazione dell'autorizzazione binaria non consente il deployment dell'immagine.

Obiettivi

In questa guida imparerai a:

  1. Configura il server dei coupon in Cloud Run.
  2. Configura il client coupon.
  3. Utilizza il coupon nelle pipeline di compilazione 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. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build, Container Registry, Artifact Analysis, Cloud KMS, Cloud Run, and Identity and Access Management APIs.

    Enable the APIs

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init
  12. Ti consigliamo di configurare l'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, è necessario configurare Autorizzazione binaria. Assicurati di configurare il criterio in modo da richiedere le attestazioni. Puoi configurare il criterio nella console Google Cloud o nella 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)')

Configurare il server dei coupon

Nei passaggi che seguono viene configurato il server dei coupon.

Creare una chiave di firma di Cloud Key Management Service

In questa sezione crei la chiave utilizzata da Voucher Server per creare un'attestazione di Autorizzazione binaria.

  1. Crea una chiave automatizzata:

    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. Memorizza l'ID risorsa della versione della chiave di 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, concedi il ruolo cloudkms.signer all'account di servizio che esegue Voucher Server. 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
    

Crea la nota di Artifact Analysis

In questa sezione crei 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 il 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}"
    

Crea e configura il server Voucher

In questa configurazione una tantum, ottieni, configuri e crei l'immagine del server dei coupon. e poi la memorizzi in Container Registry.

  1. Clona il repository Voucher:

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

    Questo repository contiene:

    • Codice sorgente per la creazione di Voucher Server.
    • Codice sorgente per la creazione del client Voucher.
    • Esempi che mostrano l'utilizzo di Voucher.
  2. Aggiorna il file di configurazione del server dei coupon.

    Linux

    Crea il file di configurazione del server dei coupon da un modello, sostituendo e con i valori definiti sopra. Per farlo, esegui il seguente 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 di Voucher Server:

    cat tutorials/cloudrun/config.toml
    

    Viene visualizzato un output contenente quanto segue:

    failon = "high"
    

    Tieni presente che nel file di configurazione l'opzione failon è impostata su high. Questa impostazione configura il server dei coupon per eseguire un controllo delle vulnerabilità su un'immagine. Se l'immagine contiene vulnerabilità con gravità HIGH, il controllo non va a buon fine e Voucher Server non crea l'attestazione di Autorizzazione binaria. Per ulteriori informazioni sulle impostazioni fail-on, consulta Fail-On: errore in caso di vulnerabilità.

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

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

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

Esegui il deployment del server Voucher su Cloud Run

  1. Seleziona una regione.

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

    export REGION=REGION
    

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

  2. Esegui il deployment di Voucher Server su Cloud Run.

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

    Viene visualizzato 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)')
    

Configurare il client per i coupon

Nei passaggi che seguono viene configurato il client Voucher.

  1. Crea l'account di servizio invocatore per il client Voucher:

    gcloud iam service-accounts create INVOKER_ACCOUNT_NAME
    

    Sostituisci INVOKER_ACCOUNT_NAME con un nome per l'account di servizio invocante, 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 invocatore per il tuo progetto.

    Concedi all'account di servizio invocatore l'autorizzazione per invocare il server dei 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 invocatore per Cloud Build.

    In questa sezione, concedi all'account di servizio Cloud Build l'autorizzazione per impersonare l'account di servizio dell'invoker in modo che il client dei coupon abbia l'autorizzazione per inviare richieste al server dei coupon durante la compilazione. 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 il coupon per verificare la presenza di vulnerabilità nelle immagini

In questa sezione esegui due pipeline Cloud Build di esempio. In entrambe le pipeline, crei un'immagine e poi utilizzi Voucher per verificarne la presenza di vulnerabilità.

Caso di errore

In questa sezione, la pipeline di compilazione di esempio non riesce a creare un'attestazione. L'immagine che crei, basata su Debian 9, contiene almeno una vulnerabilità di gravità HIGH. L'opzione fail-on nel server dei coupon config.toml è impostata per non riuscire in caso di vulnerabilità con gravità HIGH. In questo caso, Voucher Server non crea un'attestazione di Autorizzazione binaria.

  1. Esegui la pipeline di compilazione:

    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 compilazione i risultati relativi al coupon snakeoil:

    Console

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

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

      Vai alla cronologia build

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

    4. Fai clic su Visualizza messaggio non elaborato.

    5. Cerca snakeoil utilizzando il browser.

      Viene visualizzato un output simile al seguente:

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

    gcloud

    1. Salva l'ID build dalla build:

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

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

      L'output è il seguente:

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

Caso di successo

In questa sezione, la pipeline di compilazione di esempio riesce a creare un'attestazione. Poiché tutte le vulnerabilità identificate sono classificate come inferiori alla soglia fail-on , il controllo supera la pipeline e viene creata 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 compilazione i risultati relativi al coupon snakeoil:

    Console

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

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

      Vai alla cronologia build

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

    4. Fai clic su Visualizza messaggio non elaborato.

    5. Cerca snakeoil utilizzando il browser.

      Viene visualizzato 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 compilazione inserendo il seguente comando:

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

      L'output è il seguente:

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

Esegui la pulizia

Per eliminare le 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 della chiave automatizzata
    • 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 richieda le attestazioni e fornisci l'attestatore che hai creato in questa sezione. Puoi creare un criterio tramite la console Google Cloud o la CLI gcloud.

Creare un'attestazione

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

Passaggi successivi