Creazione di attestazioni con Voucher

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

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:

  1. Configura Voucher Server in Cloud Run.
  2. Configura il client Voucher.
  3. 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

  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 dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

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

    Abilita le API

  5. Installa Google Cloud CLI.
  6. Per inizializzare l'interfaccia a riga di comando gcloud, esegui il comando seguente:

    gcloud init
  7. Nella pagina del selettore dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  8. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

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

    Abilita le API

  10. Installa Google Cloud CLI.
  11. Per inizializzare l'interfaccia a riga di comando gcloud, esegui il comando seguente:

    gcloud init
  12. 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.
  13. Specifica il tuo 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 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.

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

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

  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 di 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}"
    

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.

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

    1. 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}.
    2. Salva il file come tutorials/cloudrun/config.toml.

  3. 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 su high. 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 impostazioni fail-on, consulta la sezione Fail-On: errore relativo alle vulnerabilità.

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

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

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

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

  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 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}
    
  4. 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.

  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 di Voucher snakeoil:

    Console

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

    2. In Google Cloud Console, 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 dati non elaborati.

    5. Cerca snakeoil usando il browser.

      Il risultato è 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. 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.

  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 di Voucher snakeoil:

    Console

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

    2. In Google Cloud Console, 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 dati non elaborati.

    5. Cerca snakeoil usando il browser.

      Il risultato è 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. 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