Crea un deployment con crittografia TLS sulle VM

Questo documento descrive come aggiungere la crittografia TLS a un deployment Spanner Omni su macchine virtuali (VM). Un deployment con funzionalità di sicurezza di rete utilizza Transport Layer Security (TLS) 1.3 per crittografare e autenticare la comunicazione all'interno del deployment e con i relativi client. Spanner Omni fornisce mutual TLS (mTLS) per una maggiore sicurezza, in cui entrambe le parti stabiliscono l'autenticità prima di scambiare dati. mTLS è facoltativo tra il client e il server, ma i server Spanner Omni comunicano tra loro tramite mTLS.

Prima di iniziare

Prima di iniziare, assicurati che il tuo ambiente soddisfi i seguenti requisiti:

  • Assicurati di disporre dell'accesso SSH a ogni macchina del deployment. Questo accesso ti consente di scaricare ed eseguire il programma binario di Spanner Omni.

  • La rete deve consentire la comunicazione TCP sulle porte da 15000 a 15030.

  • Ogni macchina deve disporre di spazio di archiviazione sufficiente per ospitare i dati gestiti dal deployment.

  • Consulta la pagina Requisiti di sistema per assicurarti che la tua configurazione soddisfi i requisiti.

  • Se esegui i file binari sulla piattaforma di virtualizzazione vSphere, disattiva la virtualizzazione TSC. Per farlo, aggiungi l'impostazione monitor_control.virtual_rdtsc = FALSE al file di configurazione .vmx della macchina virtuale.

Passaggio 1: crea un deployment senza crittografia TLS

Segui i passaggi descritti in Crea un deployment di VM Spanner Omni senza crittografia. Verifica che il deployment della VM senza funzionalità di crittografia e sicurezza funzioni correttamente. Questa pagina presuppone che tu abbia creato un deployment regionale con tre zone.

Passaggio 2: genera i certificati

Devi creare tre set di certificati:

Tipo di certificato Descrizione
Certificati API I certificati API contribuiscono a proteggere il server dell'API Spanner.
Certificati server I certificati del server contribuiscono a proteggere la comunicazione tra i server.
Certificati client Gli utenti finali o le applicazioni utilizzano i certificati client per stabilire la propria identità e l'attendibilità con i server Spanner Omni.

Un'autorità di certificazione (CA) emette questi certificati. Spanner Omni fornisce strumenti per creare una CA e tutti e tre i tipi di certificati. Esegui i seguenti passaggi su una delle tue macchine.

Puoi creare questi certificati sulla tua workstation utilizzando l'interfaccia a riga di comando di Spanner Omni e poi trasferire i file dei certificati a ogni server Spanner Omni. Per saperne di più, consulta la Guida rapida all'utilizzo dell'interfaccia a riga di comando di Spanner Omni.

Per generare i certificati, devi completare i seguenti passaggi:

Crea un'autorità di certificazione (CA)

Questa autorità è la CA radice per tutti i certificati client e server che generi nei passaggi seguenti.

spanner certificates create-ca --ca-certificate-directory=certs

La directory certs contiene il certificato CA. Crea una copia di questo certificato da utilizzare come CA per i certificati API.

cp certs/ca.crt certs/ca-api.crt

La directory $HOME/.spanner/private-keys contiene la chiave privata della CA. Esegui il backup e proteggi questa directory. Un utente con accesso alla chiave privata può firmare certificati arbitrari considerati attendibili dai client che considerano attendibile la CA autofirmata. Sebbene tu possa utilizzare la stessa CA per tutti i certificati, è obbligatorio che i certificati API e i certificati client utilizzino la stessa CA. Facoltativamente, puoi creare un'ulteriore CA (o utilizzare una CA attendibile esternamente) per i certificati API. Assicurati di utilizzare la CA corretta nei passaggi seguenti durante la creazione dei certificati. Questo documento utilizza la stessa CA per tutti i tipi di certificati.

Genera certificati server

Generi due tipi di certificati server:

Questa configurazione consente una gestione più flessibile di questi certificati, ad esempio la rotazione dei certificati.

Crea il certificato server Spanner

I server Spanner Omni utilizzano i certificati server per criptare la comunicazione tra loro (comunicazione tra server).

Crea il certificato del server eseguendo il comando seguente. Sostituisci SERVER_LIST con un elenco separato da virgole di nomi di server o suffissi Spanner.

SERVER_NAMES=SERVER_LIST
spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Questo comando crea due file, server.crt e server.key, nella directory certs.

Crea il certificato API

I certificati API criptano le comunicazioni dai sistemi che interagiscono con il deployment. L'utilizzo di certificati separati per l'API e la comunicazione tra server ti consente di gestire e ruotare ogni tipo in modo indipendente.

Crea il certificato API eseguendo questo comando: Sostituisci LB_DNS con il DNS del bilanciatore del carico.

SERVER_NAMES=LB_DNS
spanner certificates create-server --filename-prefix=api --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Questo comando crea altri due file, api.crt e api.key, nella directory certs. Se necessario, puoi utilizzare una CA esterna attendibile per i certificati API.

Distribuisci i certificati a tutti i server

Copia la directory certs in tutti gli altri server del deployment per avviarla con le funzionalità di sicurezza di rete.

scp -r certs REMOTE_HOST:SPANNER_DIR/certs

Passaggio 3: genera i certificati client

Puoi utilizzare i certificati client per autenticare utenti e applicazioni in Spanner. I certificati client abilitano mTLS tra il client e il server.

I certificati client devono essere firmati dalla stessa CA del certificato API e devono contenere un nome utente per l'autorizzazione. Questo esempio utilizza l'utente admin, che è l'utente predefinito per ogni database. Per saperne di più su utenti, ruoli e opzioni di autenticazione, consulta Autenticazione e autorizzazione in Spanner Omni.

USERNAME=admin
spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Questo comando crea i file client.crt e client.key nella directory clientcerts. Invia questi file a qualsiasi macchina che si connette ai server del deployment.

Se prevedi di utilizzare i certificati client con la libreria client Java, devi generare la chiave del certificato in formato PKCS#8. Utilizza il seguente comando:

USERNAME=admin
spanner certificates create-client $USERNAME \
    --output-directory clientcerts \
    --ca-certificate-directory certs \
    --generate-pkcs8-key

Passaggio 4: genera il set di chiavi wrapper

Spanner Omni utilizza un set di chiavi wrapper della chiave di crittografia della chiave (KEK) per criptare le chiavi interne, come le chiavi di crittografia e firma dei token. I server Spanner Omni leggono questo set di chiavi da BASE_DIR/kms/wrapper_key.

Per generare un nuovo file del set di chiavi wrapper utilizzando spanner keys create-keyset, esegui il seguente comando:

spanner keys create-keyset --output-file=kms/wrapper_key

Per impostazione predefinita, spanner keys create-keyset genera una chiave AES256_GCM. Per generare un tipo di chiave diverso, utilizza il flag --key-template con uno dei seguenti valori del tipo di chiave: AES256_GCM, AES128_GCM, AES256_GCM_RAW, CHACHA20_POLY1305 o XCHACHA20_POLY1305.

Distribuisci il set di chiavi wrapper a tutti i server

Copia la directory kms nella directory di base su tutti i server del deployment prima di avviarli:

scp -r kms REMOTE_HOST:BASE_DIR/kms

Passaggio 5: avvia i server

Per avviare i server nel tuo deployment, segui questi passaggi:

  1. Verifica di aver generato i certificati e il set di chiavi wrapper e di averli copiati su tutti i server del tuo deployment.
  2. Crea una directory di base su ogni server per archiviare dati, metadati e log. Se un server deve essere riavviato, specifica la stessa directory di base per garantire la continuità.
  3. Avvia ogni server seguendo le istruzioni per il tipo di deployment nelle sezioni seguenti.

Deployment su un singolo server

Per avviare un deployment su un singolo server con crittografia, crea un file di password per l'utente admin iniziale e avvia il server con i metodi di autenticazione e i certificati supportati.

  1. Crea il file della password con le autorizzazioni impostate su 600 in modo che sia leggibile solo dal proprietario:

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    La password deve soddisfare i seguenti requisiti:

    • Avere una lunghezza compresa tra 8 e 32 caratteri.
    • Almeno un carattere maiuscolo.
    • Almeno un carattere minuscolo.
    • Almeno un numero.
    • Almeno un carattere speciale.
  2. Avvia il singolo server con TLS e l'autenticazione configurati:

    nohup spanner start-single-server \
        --base-dir=BASE_DIR \
        --certificate-directory=${HOME}/.spanner/certs \
        --auth-methods=password,client-certificate \
        --password-protocol=opaque \
        --initial-admin-password-file=admin_password.txt &
    

    All'avvio iniziale, spanner start-single-server imposta i metodi di autenticazione e il protocollo della password supportati e crea l'utente admin iniziale con il ruolo roles/spanner.admin utilizzando il file della password specificato.

Per informazioni sull'interazione con il deployment, consulta Passaggio 8: interagisci con il deployment.

Deployment con scale out

Per i deployment con scale out, avvia il server su ogni macchina. I valori di server-address e zone devono corrispondere ai valori nella configurazione del deployment. La rete deve risolvere server-address. I server utilizzano server-address per la comunicazione interna. Esegui questo comando per avviare il server root:

nohup spanner start \
    --root \
    --server-address=HOST_NAME \
    --zone=ZONE_NAME \
    --base-dir=BASE_DIR \
    --certificate-directory=${HOME}/.spanner/certs &

Il comando seguente mostra un esempio con valori specifici:

nohup spanner start \
    --root \
    --server-address=rootserver1 \
    --zone=us-central-1a \
    --base-dir=./spanbasedir \
    --certificate-directory=${HOME}/.spanner/certs &

Ora che i server sono in esecuzione su ogni macchina, puoi creare il deployment.

Passaggio 6: crea un deployment con crittografia TLS

Per creare il deployment, segui questi passaggi:

  1. Crea un file di password contenente la password per l'utente admin predefinito con le autorizzazioni impostate su 600 (leggibile solo dal proprietario):

    printf '%s' 'PASSWORD' > admin_password.txt
    chmod 600 admin_password.txt
    

    La password deve soddisfare i seguenti requisiti:

    • Avere una lunghezza compresa tra 8 e 32 caratteri.
    • Almeno un carattere maiuscolo.
    • Almeno un carattere minuscolo.
    • Almeno un numero.
    • Almeno un carattere speciale.
  2. Assicurati che deployment.yaml includa i metodi di autenticazione selezionati e il protocollo della password:

    deployment_settings:
      security_settings:
        authentication_methods:
          - AUTHENTICATION_METHOD_PASSWORD
          - AUTHENTICATION_METHOD_CLIENT_CERTIFICATE
        password_authentication_protocol: PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE
    

    Puoi specificare uno o più dei seguenti metodi di autenticazione:

    • AUTHENTICATION_METHOD_PASSWORD: autenticazione con password
    • AUTHENTICATION_METHOD_CLIENT_CERTIFICATE: autenticazione del certificato client

    Puoi specificare il seguente protocollo per le password:

    • PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE: protocollo OPAQUE
  3. Esegui il comando spanner deployment create da uno dei server root per creare il deployment. Specifica la directory di base con il flag --base-dir (utilizzando lo stesso BASE_DIR specificato all'avvio del server root) e fornisci il file della password dell'amministratore con il flag --admin-password-file:

    spanner deployment create \
        --config-file=deployment.yaml \
        --base-dir=BASE_DIR \
        --admin-password-file=admin_password.txt
    

La console di ogni macchina mostra messaggi che indicano che il deployment ora include la crittografia TLS. Tutti i server comunicano tra loro tramite un canale criptato.

(Facoltativo) Passaggio 7: configura un bilanciatore del carico

Per gestire e distribuire il traffico dei client tra i server del tuo deployment, configura un bilanciatore del carico. Assicurati che la configurazione del bilanciatore del carico per il controllo di integrità utilizzi HTTPS anziché HTTP. Utilizza i seguenti dettagli di configurazione:

Parametro Valore
Protocollo TCP
IP backend Gli indirizzi IP dei tuoi server.
Porta 15000 (questa è la porta predefinita. Se hai utilizzato una porta diversa nel flag --server-address, utilizza quella porta.)
URL del controllo di integrità https://IP_ADDRESS:15012/healthz
Strategia di bilanciamento roundrobin (distribuisce le richieste in sequenza tra i server)

Passaggio 8: interagisci con il deployment

Puoi interagire con il deployment di Spanner Omni da qualsiasi VM utilizzando l'interfaccia a riga di comando di Spanner Omni.

Per stabilire una connessione criptata, devi includere il seguente flag in ogni comando:

  • --ca-certificate-file=certs/ca-api.crt

Se hai abilitato mTLS per i client, includi anche il seguente flag con ogni comando:

  • --client-certificate-directory=clientcerts

Per accedere e interagire con il tuo deployment, segui questi passaggi:

  1. Accedi a Spanner Omni

    spanner auth login admin \
        --ca-certificate-file=certs/ca-api.crt \
        --deployment-endpoint=ENDPOINT
    

    Quando richiesto, inserisci la password configurata in admin_password.txt.

    Successfully logged in as "admin"
    
  2. Crea un database

    spanner --deployment-endpoint=ENDPOINT databases create mydb --ca-certificate-file=certs/ca-api.crt
    
    Creating database...done.
    
  3. Apri la shell SQL

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner>
    
  4. Crea una tabella e aggiungi i dati

    spanner> create table names (nameId INT64 NOT NULL, name String(100)) Primary Key (nameId);
    Query OK, 0 rows affected (4.62 sec)
    
    spanner> insert names (nameId, name) values (1, "Jack");
    Query OK, 1 rows affected (0.18 sec)
    
  5. Verifica i dati

    Elenca i database:

    spanner databases list --ca-certificate-file=certs/ca-api.crt
    
    NAME  STATE  VERSION_RETENTION_PERIOD  EARLIEST_VERSION_TIME  KMS_KEY_NAME  ENABLE_DROP_PROTECTION
    mydb  READY  1h                        2025-02-07T12:25:30Z                 false
    

    Recupera i dati dalla tabella:

    spanner sql --database=mydb --ca-certificate-file=certs/ca-api.crt
    
    Connected.
    spanner> show tables;
    +----------------+
    | Tables_in_mydb |
    +----------------+
    | names          |
    +----------------+
    1 rows in set (0.14 sec)
    
    spanner> select * from names;
    +--------+--------+
    | nameId | name   |
    +--------+--------+
    | 1      | Jack   |
    +--------+--------+
    1 rows in set (18.69 msecs)
    

(Facoltativo) Passaggio 9: scala il deployment

Puoi aggiungere server non root a una zona per scalarne la capacità. Per aggiungere un server non root, segui questi passaggi:

  1. Genera un certificato server per il server non root e copia i certificati al suo interno. Per saperne di più, consulta Passaggio 2: genera i certificati.

  2. Copia il keyset wrapper sul server non root. Per saperne di più, consulta il Passaggio 4: genera il set di chiavi wrapper.

  3. Avvia il server non root:

    spanner start \
        --server-address=NON_ROOT_MACHINE \
        --join-servers=ROOT_SERVER1,ROOT_SERVER2,ROOT_SERVER3 \
        --zone=us-central1-a \
        --base-dir=./spandir \
        --certificate-directory=${HOME}/.spanner/certs
    

Passaggi successivi