Connessione sicura alle istanze VM

Questo documento descrive le best practice per una connessione sicura alle istanze di macchine virtuali (VM) Compute Engine, tra cui l'archiviazione delle chiavi host abilitando gli attributi guest e impedire che le VM vengano raggiunte dalla rete internet pubblica.

Prima di iniziare

  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è il processo mediante il quale viene verificata l'identità per l'accesso ai servizi e alle API Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti in Compute Engine nel seguente modo.

    Seleziona la scheda relativa a come prevedi di utilizzare gli esempi in questa pagina:

    Console

    Quando utilizzi la console Google Cloud per accedere ai servizi e alle API di Google Cloud, non devi configurare l'autenticazione.

    gcloud

    1. Installa Google Cloud CLI, quindi initialize eseguendo questo comando:

      gcloud init
    2. Imposta una regione e una zona predefinite.

Archiviazione delle chiavi host mediante abilitazione degli attributi guest

Una chiave host è una coppia di chiavi che identifica un determinato host o macchina. Quando ti connetti a un host remoto, la chiave host viene utilizzata per verificare che ti stai connettendo alla macchina prevista.

Se utilizzi gcloud compute ssh per connetterti alle tue VM Linux, puoi aggiungere un livello di sicurezza memorizzando le chiavi host come attributi guest.

L'archiviazione delle chiavi host SSH come attributi guest migliora la sicurezza delle connessioni grazie alla protezione da vulnerabilità come gli attacchi man in the middle (MITM). All'avvio iniziale di una VM, se gli attributi guest sono abilitati, Compute Engine archivia le chiavi host generate come attributi guest. In seguito, Compute Engine utilizza queste chiavi host archiviate per verificare tutte le connessioni successive alla VM.

Le chiavi host possono essere archiviate come attributi guest nelle seguenti immagini del sistema operativo pubblico:

  • Debian
  • Ubuntu
  • Red Hat Enterprise Linux (RHEL)
  • CentOS
  • SUSE Linux Enterprise Server (SLES)

Per scrivere chiavi host negli attributi guest, devi abilitare gli attributi guest prima di avviare la VM per la prima volta. Puoi abilitare gli attributi guest su alcune VM durante la creazione della VM o sull'intero progetto.

Dopo che hai abilitato gli attributi guest per un progetto o una VM, l'agente del sistema operativo guest pubblica automaticamente la chiave host come attributo guest. Se utilizzi gcloud compute ssh anziché un semplice client SSH, gcloud CLI legge automaticamente gli attributi e aggiorna il file known_hosts alla successiva connessione.

Per archiviare le chiavi host come attributi guest:

  1. Prima di avviare la VM per la prima volta, abilita gli attributi guest su determinate VM durante la creazione della VM o sull'intero progetto.

  2. Connettiti alla VM utilizzando gcloud compute ssh.

    1. Assicurati di avere la versione più recente di Google Cloud CLI:

      gcloud components update
      
    2. Connettiti alla VM:

      gcloud compute ssh --project=PROJECT_ID \
       --zone=ZONE \
       VM_NAME
      

      Sostituisci quanto segue:

      • PROJECT_ID: l'ID del progetto che contiene la VM
      • ZONE: il nome della zona in cui si trova la VM
      • VM_NAME: il nome della VM

      Se hai impostato proprietà predefinite per Google Cloud CLI, puoi omettere i flag --project e --zone da questo comando. Ad esempio:

      gcloud compute ssh VM_NAME
      
    3. Leggi il messaggio di avvio. Ad esempio, un sistema operativo Debian potrebbe visualizzare il seguente messaggio:

      Writing 3 keys to YOUR_HOME_DIRECTORY/.ssh/google_compute_known_hosts
      Linux host-key-2 4.9.0-9-amd64 #1 SMP Debian 4.9.168-1+deb9u3 (2019-06-16) x86_64
      

Per confermare che le chiavi host siano archiviate come attributi guest per questa VM, esamina i valori delle chiavi host per verificare che le chiavi SSH siano scritte negli attributi guest per la VM (opzione 1) oppure verifica la presenza di chiavi host sulla porta seriale (opzione 2):

Opzione 1: esamina le coppie chiave-valore host

Puoi utilizzare Google Cloud CLI per verificare che le chiavi SSH siano scritte negli attributi guest:

gcloud compute instances get-guest-attributes VM_NAME \
  --query-path="hostkeys/" \
  --zone=ZONE

Sostituisci quanto segue:

  • VM_NAME: il nome della VM
  • ZONE: il nome della zona in cui si trova la VM

L'output è simile al seguente:

NAMESPACE  KEY                  VALUE
hostkeys   ecdsa-sha2-nistp256  AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBJAGpTm
                                V3mFxBTHK1NIu9a7kVQWaHsZVaFUsqF8cLxQRQ+N96/Djiiuz1tucHQ8vBTJI=
hostkeys   ssh-ed25519          AAAAC3NzaC1lZDI1NTE5AAAAIM/WYBn3jIEW5t3BZumx0X/Htm61J6S9FcU8L
hostkeys   ssh-rsa              AAAAB3NzaC1yc2EAAAADAQABAAABAQDU3jReR/MoSttlWYfauW6qEqS2dhe5
                                Zdd3guYk2H7ZyxblNuP56nOl/IMuniVmsFa9v8W6MExViu6G5Cy4iIesot09
                                1hsgkG0U7sbWrXM10PQ8pnpI3B5arplCiEMhRtXy64rlW3Nx156bLdcxv5l+
                                7Unu4IviKlY43uqqwSyTv+V8q4ThpQ9dNbk1Gg838+KzazljzHahtbIaE1rm
                                I0L1lUqKiKLSLKuBgrI2Y/WSuqvqGEz+bMH7Ri4ht+7sAwykph6FbOgKqoBI
                                hVWBo38/Na/gEuvtmgULUwK+xy9zWg9k8k/Qtihc6El9GD9y

Opzione 2: controlla la porta seriale

  1. Visualizza l'output della porta seriale.
  2. Seleziona la porta di serie 1.
  3. Cerca il seguente messaggio:

    INFO Wrote ssh-rsa host key to guest attributes

    Se l'immagine utilizza un sistema operativo supportato, ma l'impostazione degli attributi guest non è stata abilitata prima del primo avvio della VM, potrebbe essere visualizzato il seguente messaggio:

    Unable to write ssh-rsa host key to guest attributes

    Ciò significa che le chiavi host non vengono archiviate come attributi guest per questa VM. Se vuoi archiviare le chiavi host per le VM aggiuntive che prevedi di creare, abilita gli attributi guest prima del primo avvio della VM.

Impedire che le VM vengano raggiunte dalla rete internet pubblica

Durante lo sviluppo di progetti in Compute Engine, esistono vari scenari in cui vuoi impedire che le VM vengano raggiunte dalla rete internet pubblica:

  • I servizi web sono ancora in fase di sviluppo e non sono pronti per essere esposti a utenti esterni perché hanno funzionalità incomplete o non sono ancora state configurate con HTTPS.
  • La VM potrebbe fornire servizi progettati per essere utilizzati solo da altre VM nel progetto.
  • Le VM devono essere raggiungibili solo tramite opzioni di interconnessione dedicate da uffici o data center aziendali.

Anche quando un servizio è intenzionalmente rivolto a internet, è importante che la comunicazione con il servizio sia limitata ai gruppi di utenti di destinazione e avvenga su canali sicuri, come SSH o HTTPS, per proteggere le informazioni sensibili.

Questo articolo illustra diversi metodi per proteggere le comunicazioni con VM con indirizzi IP esterni e VM senza indirizzi IP esterni. Che tu proteggi o meno le comunicazioni con questi metodi, Google Cloud consente sempre la comunicazione tra un'istanza VM e il server di metadati corrispondente. Per ulteriori informazioni, consulta la sezione Traffico sempre consentito.

protezione dei servizi su macchine con indirizzi IP esterni

Quando le VM hanno un indirizzo IP pubblico, è importante che solo i servizi e il traffico che intendi esporre siano raggiungibili e, per quelli esposti, tutte le informazioni sensibili siano protette in transito. Esistono diversi metodi per proteggere i servizi sulle VM con indirizzi IP esterni descritti in questo documento, tra cui firewall, HTTPS e SSL, il port forwarding su SSH e il proxy SOCKS su SSH.

Firewall

La prima linea di difesa è limitare chi può raggiungere la VM utilizzando i firewall. Creando regole firewall, puoi limitare tutto il traffico a una rete o usare macchine di destinazione su un determinato insieme di porte a indirizzi IP di origine specifici.

I firewall non sono una soluzione autonoma. La limitazione del traffico a IP di origine specifici non protegge informazioni sensibili come credenziali di accesso, comandi che creano o eliminano risorse o file o log. Quando esegui un servizio web su una macchina accessibile al pubblico, ad esempio una VM di Compute Engine con un IP esterno, devi criptare tutte le comunicazioni tra l'host e la VM di cui è stato eseguito il deployment per garantire un'adeguata sicurezza.

Inoltre, i firewall non sono sempre la soluzione appropriata. Ad esempio, i firewall non sono l'ideale per gli ambienti di sviluppo che non hanno indirizzi IP statici, come i laptop in roaming.

HTTPS e SSL

Per i sistemi web di produzione, devi configurare HTTPS/SSL. HTTPS/SSL può essere impostato impostando una VM per terminare HTTPS o configurando il bilanciamento del carico HTTPS. HTTPS/SSL comporta una certa complessità iniziale e richiede l'esecuzione delle seguenti attività:

Port forwarding su SSH

Puoi utilizzare Google Cloud CLI per avviare un server su una determinata porta locale che inoltri tutto il traffico a un host remoto tramite una connessione SSH.

Innanzitutto, prendi nota della VM e della porta che forniscono il servizio a cui vuoi stabilire una connessione sicura. Quindi, esegui questo comando:

gcloud compute ssh VM_NAME \
    --project PROJECT_ID \
    --zone ZONE \
    -- -NL LOCAL_PORT:localhost:REMOTE_PORT

Sostituisci quanto segue:

  • VM_NAME è il nome della VM a cui vuoi connetterti.
  • PROJECT_ID è il tuo ID progetto Google Cloud.
  • ZONE: la zona in cui è in esecuzione la VM, ad esempio us-central1-a.
  • LOCAL_PORT: la porta locale in ascolto, ad esempio 2222.
  • REMOTE_PORT: la porta remota a cui ti stai connettendo, ad esempio 8888.

Ad esempio, se specifichi una porta locale "2222" e una porta remota "8888" e apri http://localhost:2222/ nel browser, la connessione HTTP utilizza il tunnel SSH che hai creato all'host remoto per connettersi alla VM specificata tramite SSH. La connessione HTTP utilizzerà quindi il tunnel SSH per connettersi alla porta 8888 sulla stessa macchina, ma tramite una connessione SSH protetta e criptata.

Il comando gcloud crea e gestisce una connessione SSH mentre la sessione SSH è attiva. Non appena esci dalla sessione SSH, il port forwarding utilizzando http://VM_NAME:LOCAL_PORT smette di funzionare.

Per creare più di una regola di port forwarding, puoi specificare più regole su una singola riga di comando ripetendo i flag:

gcloud compute ssh VM_NAME \
    --project PROJECT_ID \
    --zone ZONE \
    -- -NL LOCAL_PORT:localhost:REMOTE_PORT \
    -- -NL LOCAL_PORT:localhost:REMOTE_PORT

In alternativa, puoi eseguire un nuovo comando gcloud ogni volta per creare un tunnel separato. Tieni presente che non puoi aggiungere o rimuovere il port forwarding da una connessione esistente senza uscire e ristabilire la connessione da zero.

Proxy SOCKS su SSH

Se vuoi connetterti a una serie di host diversi nel tuo deployment cloud, il modo più semplice per farlo è cambiare il browser ed eseguire le ricerche direttamente dalla rete. Questo approccio consente di utilizzare il nome breve degli host invece di cercare l'indirizzo IP di ciascun host, aprire le porte per ogni servizio o creare un tunnel SSH per ogni coppia host/porta.

L'approccio che utilizzi qui è il seguente:

  1. Configurare un singolo tunnel SSH per uno degli host sulla rete e creare un proxy SOCKS su quell'host.
  2. Cambiare la configurazione del browser per eseguire tutte le ricerche utilizzando l'host proxy SOCKS.

Tieni presente che, poiché esegui il tunneling di tutto il traffico utilizzando quell'host, evita di utilizzare quel browser o quel profilo specifico per navigare sul web perché devi dedicare quella larghezza di banda al tuo servizio cloud. In generale, ti consigliamo di utilizzare un profilo del browser separato e di passare a questo quando necessario.

Avvia il proxy SOCKS

Per avviare il proxy SOCKS, esegui questo comando:

gcloud compute ssh VM_NAME \
    --project PROJECT_ID \
    --zone ZONE
    --ssh-flag="-D" \
    --ssh-flag="LOCAL_PORT" \
    --ssh-flag="-N"

Sostituisci quanto segue:

  • VM_NAME: il nome della VM a cui vuoi connetterti.
  • PROJECT_ID: il tuo ID progetto Google Cloud.
  • ZONE: la zona in cui è in esecuzione la VM, ad esempio us-central1-a.
  • LOCAL_PORT: la porta locale in ascolto, ad esempio 1080.

Tieni presente che, in questo caso, non è necessario specificare una porta remota. Poiché un proxy SOCKS non si associa a una porta remota specifica, qualsiasi connessione che effettui utilizzando il proxy SOCKS verrà risolta relativa all'host a cui ti connetti.

Utilizzando un proxy SOCKS, puoi connetterti a qualsiasi VM che condivide una rete Compute Engine con la tua VM proxy utilizzando il nome breve della VM. Inoltre, puoi connetterti a qualsiasi porta su una determinata VM.

Questo approccio è molto più flessibile del semplice metodo di port forwarding, ma richiede anche di modificare le impostazioni del browser web per utilizzare il proxy.

Quindi, configura Chrome o Firefox per l'utilizzo del proxy.

Chrome

Chrome utilizza le impostazioni proxy a livello di sistema per impostazione predefinita, quindi devi specificare un proxy diverso utilizzando i flag della riga di comando. L'avvio di Chrome per impostazione predefinita crea una VM di un profilo già in esecuzione, quindi per poter eseguire più copie di Chrome contemporaneamente, una che utilizza il proxy e le altre che non lo sono, è necessario un nuovo profilo.

Avvia Chrome utilizzando un nuovo profilo. Verrà creata automaticamente se non esiste.

Linux:

/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

macOS:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

Imposta la porta localhost sullo stesso valore utilizzato nel comando gcloud in precedenza (1080 nel nostro esempio).

Firefox

Prima di modificare queste impostazioni, ti consigliamo di creare un nuovo profilo Firefox. In caso contrario, tutte le VM di Firefox potrebbero utilizzare quell'host come proxy, il che probabilmente non è quello che vuoi.

Dopo aver eseguito Firefox con un profilo separato, puoi configurare il proxy SOCKS:

  1. Apri Preferenze.
  2. Fai clic su Avanzate > Reti > Impostazioni per aprire la finestra di dialogo Impostazioni di connessione.
  3. Scegli l'opzione Configurazione manuale del proxy.
    1. Nella sezione SOCKS Host, compila localhost come host e la porta selezionata quando hai eseguito in precedenza il comando gcloud.
    2. Scegli SOCKS v5.
    3. Seleziona la casella DNS remoto.
    4. Lascia vuote tutte le altre voci.
  4. Fai clic su OK e chiudi la finestra di dialogo Preferenze.

Connessione a VM senza indirizzi IP esterni

Se le VM non hanno indirizzi IP esterni (incluse le VM che fungono da backend per i bilanciatori del carico del proxy SSL e HTTPS), possono essere raggiunte solo da quanto segue:

Puoi eseguire il provisioning delle VM nella tua rete in modo che fungano da inoltro attendibile per le connessioni in entrata, noti anche come bastion host. Inoltre, puoi configurare Cloud NAT per il traffico di rete in uscita o la console seriale interattiva per gestire o risolvere i problemi delle VM senza indirizzi IP esterni.

Bastion host

I bastion host forniscono un punto di ingresso rivolto verso l'esterno in una rete contenente istanze di rete private, come illustrato nel diagramma seguente.

Architettura degli host Bastion che fungono da punto di ingresso rivolto all'esterno per una rete di istanze private.

Questo host può fornire un singolo punto di fortificazione o controllo e può essere avviato e arrestato per abilitare o disabilitare l'SSH in entrata. Utilizzando un bastion host, puoi connetterti a una VM che non ha un indirizzo IP esterno. Questo approccio consente di connetterti a un ambiente di sviluppo o di gestire l'istanza di database per l'applicazione esterna, ad esempio, senza configurare regole firewall aggiuntive.

Un attacco completo di un bastion host non rientra nell'ambito di questo articolo, ma alcuni passaggi iniziali possono includere:

  • Limita l'intervallo CIDR degli IP di origine che possono comunicare con il bastion.
  • Configura le regole firewall per consentire il traffico SSH alle VM private solo dal bastion host.

Per impostazione predefinita, SSH sulle VM è configurato in modo da utilizzare le chiavi private per l'autenticazione. Quando si utilizza un bastion host, si accede prima al bastion host, quindi alla VM privata di destinazione. A causa di questo accesso in due passaggi, e questo è il motivo per cui i bastion host a volte sono chiamati "jump server", dovresti usare l'inoltro ssh anziché memorizzare la chiave privata della macchina di destinazione sul bastion host come modo per raggiungere la macchina di destinazione. Devi farlo anche se utilizzi la stessa coppia di chiavi sia per il bastion che per la VM di destinazione, perché il bastion ha accesso diretto solo alla metà pubblica della coppia di chiavi.

Per scoprire come utilizzare un'istanza bastion host per connetterti ad altre VM sulla tua rete Google Cloud, consulta Connettersi alle VM Linux utilizzando un bastion host.

Per scoprire come utilizzare l'inoltro ssh e altri metodi per connetterti alle VM che non hanno un indirizzo IP esterno, consulta Connessione a VM che non hanno indirizzi IP esterni.

IAP per forwarding TCP

L'uso di SSH con la funzionalità di inoltro TCP di IAP esegue il wrapping di una connessione SSH all'interno di HTTPS. e la funzionalità di inoltro TCP di IAP la invia alla VM remota.

Per scoprire come connetterti a una VM remota con IAP, consulta Connettersi a VM Linux utilizzando Identity-Aware Proxy.

VPN

Cloud VPN ti consente di connettere la rete esistente alla rete Google Cloud utilizzando una connessione IPsec a un dispositivo gateway VPN. Ciò consente il routing diretto del traffico dalle sedi alle interfacce IP private delle VM Compute Engine. Il traffico viene criptato durante il transito su link pubblici a Google.

Per maggiori dettagli sull'impostazione, sulla configurazione e sull'utilizzo della VPN con Compute Engine, consulta la documentazione di Cloud VPN.

Per scoprire come connetterti alle VM sulla tua rete Google Cloud tramite una VPN esistente anziché tramite indirizzi IP esterni delle VM, consulta Connettersi alle VM Linux utilizzando Cloud VPN o Cloud Interconnect.

Traffico in uscita utilizzando Cloud NAT

Quando a una VM non è assegnato un indirizzo IP esterno, non può stabilire connessioni dirette a servizi esterni, compresi altri servizi Google Cloud. Per consentire a queste VM di raggiungere i servizi sulla rete internet pubblica, puoi impostare e configurare Cloud NAT, che può instradare il traffico per conto di qualsiasi VM sulla rete. Non considerare una singola VM ad alta disponibilità o in grado di supportare una velocità effettiva di traffico elevata per più VM.

Accesso interattivo alla console seriale

Quando una VM non ha un indirizzo IP esterno, potrebbe comunque essere necessario interagire con la VM per la risoluzione dei problemi o la manutenzione. La configurazione di un Bastion host, come spiegato in precedenza, è un'opzione, ma potrebbe richiedere una configurazione più lunga rispetto a quella necessaria per le tue esigenze. Se vuoi risolvere i problemi di una VM senza un indirizzo IP esterno, valuta la possibilità di abilitare l'accesso interattivo sulla console seriale, che ti consente di interagire con la console seriale di una VM utilizzando SSH ed eseguire i comandi sulla console seriale.

Per scoprire di più, consulta Interazione con la console seriale.

Bilanciatori del carico del proxy HTTPS e SSL

Le VM che sono backend per bilanciatori del carico HTTPS e del proxy SSL non devono avere indirizzi IP esterni a cui accedere tramite il bilanciatore del carico. L'accesso diretto a queste risorse richiede l'utilizzo dei metodi elencati nella sezione Connessione a VM senza indirizzi IP esterni.

Per saperne di più, leggi la documentazione sul bilanciamento del carico per i bilanciatori del carico.