Avviare una VM in modo sicuro

Questo documento spiega come attivare l'avvio protetto o un Virtual Trusted Platform Module (vTPM) su un'istanza di macchina virtuale (VM) in Google Distributed Cloud (GDC) con air gap.

Questo documento è rivolto agli sviluppatori dei gruppi di amministratori della piattaforma o di operatori di applicazioni che configurano l'avvio protetto e i vTPM sulle VM in un ambiente GDC. Per saperne di più, consulta la documentazione relativa ai segmenti di pubblico per GDC con air gap.

Informazioni su Avvio protetto

L'avvio protetto è una funzionalità che garantisce che il sistema esegua solo software autentici verificando la firma digitale di tutti i componenti di avvio e interrompendo il processo se la verifica non va a buon fine. Utilizza il firmware Unified Extensible Firmware Interface (UEFI) per gestire i certificati e le chiavi utilizzati dai produttori per firmare il firmware di sistema, i boot loader e i file binari caricati.

A ogni avvio, il firmware UEFI verifica la firma digitale di ogni componente confrontandola con le chiavi approvate archiviate e blocca i componenti non firmati o firmati in modo errato. Per attivare l'avvio protetto nell'istanza VM, devi impostare il campo shieldConfig.bootType della VM su uefi e shieldConfig.enableSecureBoot su true.

Per visualizzare la documentazione ufficiale di UEFI, consulta https://uefi.org/sites/default/files/resources/UEFI_Secure_Boot_in_Modern_Computer_Security_Solutions_2013.pdf.

Informazioni sui Virtual Trusted Platform Module

Un vTPM è un chip di computer virtuale specializzato che protegge le chiavi e i certificati utilizzati per autenticare l'accesso al sistema. Per saperne di più sui vTPM, consulta https://trustedcomputinggroup.org/trusted-platform-module-tpm-summary/.

Puoi anche utilizzare un vTPM per proteggere i secret tramite schermatura o sigillatura. Per saperne di più sullo spazio di archiviazione protetto, consulta https://en.wikipedia.org/wiki/Trusted_Computing#SEALED-STORAGE. Consulta il progetto Go-TPM su GitHub (https://github.com/google/go-tpm) per esempi di linguaggio Go che illustrano come utilizzare un vTPM a questo scopo.

Prima di iniziare

Per utilizzare i comandi dell'interfaccia a riga di comando (CLI) gdcloud, assicurati di aver scaricato, installato e configurato l'interfaccia a riga di comando gdcloud. Tutti i comandi per Distributed Cloud utilizzano l'interfaccia a riga di comando gdcloud o kubectl e richiedono un ambiente del sistema operativo (OS).

Ottieni il percorso del file kubeconfig

Per eseguire i comandi sul server dell'API di gestione, assicurati di disporre delle seguenti risorse:

  1. Accedi e genera il file kubeconfig per il server API di gestione, se non ne hai uno.

  2. Utilizza il percorso del file kubeconfig del server API di gestione per sostituire MANAGEMENT_API_SERVER in queste istruzioni.

Richiedi ruoli IAM

Per ottenere le autorizzazioni necessarie per abilitare l'avvio protetto o vTPM sulla tua VM, chiedi all'amministratore del progetto IAM di concederti il ruolo Amministratore progetto macchina virtuale (project-vm-admin).

Tutti i ruoli delle VM devono essere associati allo spazio dei nomi del progetto in cui si trova la VM. Segui i passaggi per verificare il tuo accesso.

Abilita avvio protetto

Abilita l'avvio protetto per una VM. Segui queste istruzioni per una VM denominata VM_NAME nello spazio dei nomi del progetto (PROJECT_NAMESPACE).

  1. Arresta la VM se è in esecuzione prima di applicare la patch. Se provi ad applicare la patch a shieldConfig mentre la VM è in esecuzione, l'API restituisce un errore Forbidden: Changes to shieldConfig are not allowed while the VM is running. Per istruzioni, vedi Arresta una VM.

  2. Aggiorna la risorsa personalizzata della VM per attivare l'avvio protetto:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        bootType: uefi
        enableSecureBoot: true
    '
    

    Sostituisci le seguenti variabili:

    • MANAGEMENT_API_SERVER: il file kubeconfig per il server API di gestione.
    • PROJECT_NAMESPACE: lo spazio dei nomi del progetto in cui si trova la VM.
    • VM_NAME: il nome della VM.
  3. Dopo aver applicato la patch, avvia la VM seguendo le istruzioni per avviare una VM.

  4. Verifica di aver attivato l'avvio protetto. Stabilisci una connessione SSH alla VM ed esegui questo comando:

    mokutil --sb-state
    

    Se hai attivato correttamente l'avvio protetto, il comando restituisce SecureBoot enabled.

    Se lo strumento mokutil segnala che non hai attivato l'avvio protetto, segui i passaggi descritti nella sezione Risolvi i problemi di configurazione dell'avvio protetto.

Risolvi i problemi di configurazione di Avvio protetto

  1. Apri la risorsa personalizzata della VM in un editor:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    Sostituisci le seguenti variabili:

    • MANAGEMENT_API_SERVER: il file kubeconfig per il server API di gestione.
    • PROJECT_NAMESPACE: lo spazio dei nomi del progetto in cui si trova la VM.
    • VM_NAME: il nome della VM.
  2. Cerca i campi o i valori mancanti, come mostrato nel campo spec in Abilita l'avvio protetto. Questi sono obbligatori.

  3. Se mancano o sono errati, modifica spec per aggiungere i campi mancanti e correggere i valori errati.

  4. Salva il file.

  5. Segui i passaggi descritti in Riavvia la VM.

Se i passaggi precedenti non risolvono il problema, consulta la documentazione corrispondente al sistema operativo (OS) della VM per verificare che la versione del sistema operativo supporti l'avvio protetto.

Abilita vTPM

Abilita vTPM per una VM. Segui queste istruzioni per una VM denominata VM_NAME nello spazio dei nomi del progetto (PROJECT_NAMESPACE).

  1. Arresta la VM se è in esecuzione prima di applicare la patch. Se provi ad applicare la patch a shieldConfig mentre la VM è in esecuzione, l'API restituisce un errore Forbidden: Changes to shieldConfig are not allowed while the VM is running. Per istruzioni, vedi Arresta una VM.

  2. Aggiorna la risorsa personalizzata della VM per attivare vTPM:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      patch virtualmachines.virtualmachine.gdc.goog VM_NAME \
      --type merge --patch $'
    spec:
      shieldConfig:
        enableVtpm: true
    '
    

    Sostituisci le seguenti variabili:

    • MANAGEMENT_API_SERVER: il file kubeconfig per il server API di gestione.
    • PROJECT_NAMESPACE: lo spazio dei nomi del progetto in cui si trova la VM.
    • VM_NAME: il nome della VM.
  3. Dopo aver applicato la patch, avvia la VM seguendo le istruzioni per avviare una VM.

  4. Verifica di aver attivato vTPM. Stabilisci una connessione SSH alla VM ed esegui questo comando:

    dmesg | grep -i tpm
    

    Se hai attivato correttamente vTPM, il comando restituisce il modulo TPM come parte delle tabelle ACPI. L'output è simile al seguente:

    [    7.620985] tpm_tis MSFT0101:00: 2.0 TPM (device-id 0x1, rev-id 1)
    

    Se ACPI tables non mostra il modulo TPM, segui i passaggi nella sezione Risolvi i problemi di configurazione di vTPM.

Risolvi i problemi di configurazione di vTPM

  1. Apri la risorsa personalizzata della VM in un editor:

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT_NAMESPACE \
      edit virtualmachines.virtualmachine.gdc.goog VM_NAME
    

    Sostituisci le seguenti variabili:

    • MANAGEMENT_API_SERVER: il file kubeconfig per il server API di gestione.
    • PROJECT_NAMESPACE: lo spazio dei nomi del progetto in cui si trova la VM.
    • VM_NAME: il nome della VM.
  2. Cerca i campi o i valori mancanti, come mostrato nel campo spec in Attiva vTPM. Questi sono obbligatori.

  3. Se mancano o sono errati, modifica spec per aggiungere i campi mancanti e correggere i valori errati.

  4. Salva il file.

  5. Segui i passaggi descritti in Riavvia la VM.

Se i passaggi precedenti non risolvono il problema, consulta la documentazione corrispondente al sistema operativo (OS) della VM per verificare che la versione del sistema operativo supporti vTPM.