Connessione sicura alle istanze VM


Questo documento descrive le best practice per connettersi in modo sicuro a Compute Engine di macchine virtuali (VM), tra cui l'archiviazione di chiavi host mediante l'abilitazione di attributi guest ed impedire che le VM siano raggiunte dalla rete internet pubblica.

Prima di iniziare

  • Se non l'hai ancora fatto, configura l'autenticazione. L'autenticazione è la procedura mediante la quale la tua identità viene verificata per l'accesso alle API e ai servizi Google Cloud. Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti su Compute Engine come segue.

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.

Memorizzare le chiavi host attivando gli attributi guest

Una chiave host è una coppia di chiavi che identifica un particolare host o una determinata macchina. Quando connettiti a un host remoto, la chiave host viene utilizzata per verificare che ti connetti 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 contribuendo alla protezione da vulnerabilità quali 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 questi le 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 le chiavi host negli attributi guest, devi attivare gli attributi guest prima di avviare la VM per la prima volta. Puoi attivare gli attributi guest su VM selezionate durante la loro creazione o sull'intero progetto.

Dopo aver attivato gli attributi guest per un progetto o una VM, l'agente del sistema operativo guest pubblica automaticamente la chiave host come attributo guest. Se utilizzigcloud compute ssh anziché un normale client SSH, l'interfaccia a riga di comando gcloud legge automaticamente gli attributi e aggiorna il fileknown_hosts alla successiva connessione.

Per archiviare le chiavi host come attributi guest, completa i seguenti passaggi:

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

  2. Connettiti alla VM utilizzando gcloud compute ssh.

    1. Assicurati di avere installato 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 La VM si trova
      • VM_NAME: il nome della VM

      Se disponi impostare le proprietà predefinite per Google Cloud CLI, puoi omettere --project e --zone da questo comando. Ad esempio:

      gcloud compute ssh VM_NAME
      
    3. Esamina il messaggio di avvio. Ad esempio, un sistema operativo Debian visualizza 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 verificare che le chiavi host siano memorizzate come attributi guest per questa VM, esamina i valori delle chiavi host per verificare che le chiavi SSH vengano scritte negli attributi guest della VM (opzione 1) o controlla la presenza di chiavi host nella porta seriale (opzione 2):

Opzione 1: esamina le coppie chiave-valore dell'host

Puoi utilizzare Google Cloud CLI per verificare che le chiavi SSH vengano 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 localizzato

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 Porta seriale 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 attivata prima del primo avvio della VM, potresti visualizzare 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 questo VM. Se vuoi archiviare le chiavi host per VM aggiuntive creare, attivare gli attributi guest prima del primo avvio VM.

Impedire che le VM vengano raggiunte dalla rete internet pubblica

Quando sviluppi progetti su Compute Engine, esistono diversi scenari in cui vuoi impedire che le VM vengano raggiunte dall'internet pubblico:

  • I servizi web sono ancora in fase di sviluppo e non sono pronti per essere esposti a utenti esterni perché presentano una funzione incompleta o non ancora configurate con HTTPS.
  • La VM potrebbe fornire servizi progettati per essere utilizzati solo da altre VM del progetto.
  • Le VM devono essere raggiunte solo tramite opzioni di interconnessione dedicata uffici o data center aziendali.

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

Questo articolo illustra diversi metodi per proteggere le comunicazioni con le VM con indirizzi IP esterni e le VM senza indirizzi IP esterni. Se proteggi o meno per le comunicazioni con questi metodi, Google Cloud consente sempre tra un'istanza VM e la sua server di metadati corrispondente. Per ulteriori informazioni, vedi traffico sempre consentito.

Protezione dei servizi su macchine con indirizzi IP esterni

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

Firewall

La prima linea di difesa è quella di limitare gli utenti che possono raggiungere la VM utilizzando firewall. Creando regole firewall, puoi limitare tutto il traffico a una rete o alle macchine di destinazione su un determinato insieme di porte ad indirizzi IP di origine specifici.

I firewall non sono una soluzione autonoma. La limitazione del traffico a IP di origine specifici non protegge le informazioni sensibili, come le credenziali di accesso, i comandi che creano o distruggono risorse o file o i log. Quando esegui un servizio web su un computer accessibile pubblicamente, ad esempio una VM Compute Engine con un IP esterno, devi crittografa 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: firewall non sono ideali per gli ambienti di sviluppo che non dispongono di Indirizzi IP, ad esempio laptop in roaming.

HTTPS e SSL

Per i sistemi web di produzione, devi configurare HTTPS/SSL. Il protocollo HTTPS/SSL può essere configurando una VM per terminare HTTPS o configurando Bilanciamento del carico HTTPS. HTTPS/SSL comporta una certa complessità iniziale, che richiedono l'esecuzione delle seguenti attività:

Port forwarding tramite SSH

Puoi utilizzare lo Google Cloud CLI per avviare un server su una determinata porta locale che inoltra tutto il traffico a un l'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 seguente 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 su cui stai ascoltando, ad esempio, 2222.
  • REMOTE_PORT: la porta remota a cui ti connetti, ad esempio 8888.

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

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 ogni volta un nuovo comando gcloud per creare in un tunnel separato. Tieni presente che non puoi aggiungere o rimuovere il port forwarding da una connessione esistente senza uscire e ristabilire la connessione partendo da zero.

Proxy SOCKS tramite SSH

Se vuoi connetterti a più host diversi nel tuo cloud il deployment, il modo più semplice per farlo è cambiare il browser direttamente dal tuo network. Questo approccio consente di utilizzare il nome breve degli host invece di cercare l'indirizzo IP dell'host, aprendo le porte per ogni servizio o creando un tunnel SSH per ogni coppia host/porta.

L'approccio che utilizzi qui è il seguente:

  1. Configura un singolo tunnel SSH su uno degli host della rete e crea un proxy SOCKS su quell'host.
  2. Cambiare la configurazione del browser in modo da eseguire tutte le ricerche utilizzando il proxy SOCKS .

Tieni presente che, poiché stai utilizzando il tunnel per tutto il traffico che utilizza l'host, evita di utilizzare quel browser o quel profilo specifico per navigare sul web perché devi dedicare la larghezza di banda al tuo servizio cloud. In generale, potresti voler utilizzare un profilo del browser separato e passare a questo profilo se 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 su cui stai ascoltando, ad esempio, 1080.

Tieni presente che, in questo caso, non è necessario specificare una porta remota. Poiché un Il proxy SOCKS non si associa a una porta remota specifica, a nessuna connessione che crei utilizzando il proxy SOCKS verrà risolto in relazione all'host che colleghi a.

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 nel browser web per utilizzare proxy.

Successivamente, configura Chrome o Firefox in modo che utilizzi il proxy.

Chrome

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

Avvia Chrome utilizzando un nuovo profilo. Verrà creata automaticamente inesistente.

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 che hai utilizzato nella gcloud (nel nostro esempio 1080).

Firefox

Prima di modificare queste impostazioni, ti consigliamo di crea un nuovo profilo Firefox. In caso contrario, tutte le VM di Firefox utilizzeranno l'host come proxy, cosa che probabilmente non vuoi.

Quando Firefox è in esecuzione con un profilo separato, puoi configurare le SOCKS proxy:

  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 Host SOCKS, inserisci localhost come host e la porta selezionata quando hai eseguito il comando gcloud in precedenza.
    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 alle VM senza indirizzi IP esterni

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

Puoi eseguire il provisioning delle VM nella tua rete per come relè attendibili per le connessioni in entrata, noti anche come bastion host. Inoltre, puoi configurare un Cloud NAT per il traffico di rete in uscita o impostare la console seriale interattiva per gestire o risolvere i problemi delle VM senza indirizzi IP esterni.

Bastion host

Bastion host fornire un punto di ingresso rivolto all'esterno in una rete contenente di rete, come illustrato nel diagramma seguente.

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

Questo host può rappresentare un unico punto di fortificazione o controllo e può essere avviato e interrotto per attivare o disattivare l'SSH in entrata. Utilizzando un bastion host, puoi connetterti a una VM che non dispone di un indirizzo IP esterno. Questo approccio ti consente di connetterti a un ambiente di sviluppo Gestire l'istanza di database per l'applicazione esterna, ad esempio, senza per configurare regole firewall aggiuntive.

L'hardening 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 del firewall per consentire il traffico SSH solo alle VM private il bastion host.

Per impostazione predefinita, SSH sulle VM è configurato per utilizzare le chiavi private per l'autenticazione. Quando utilizzi un bastion host, devi prima accedere al bastion host, e poi nella VM privata di destinazione. A causa di questo accesso in due passaggi, perché gli host bastione sono a volte chiamati "server di jump", devi utilizzare ssh inoltro anziché memorizzare la chiave privata della macchina di destinazione su l'host bastione per raggiungere la macchina di destinazione. È necessario eseguire questa operazione anche se utilizzi la stessa coppia di chiavi sia per le VM bastion che per quelle di destinazione il bastion ha accesso diretto soltanto alla metà pubblica della coppia di chiavi.

Scoprire come utilizzare un'istanza bastion host per connettersi ad altre VM la tua rete Google Cloud, vedi Connettiti alle VM Linux utilizzando un bastion host.

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

IAP per l'inoltro TCP

L'utilizzo di SSH con la funzionalità di inoltro TCP di IAP consente di delimitare una connessione SSH all'interno di HTTPS. la funzione di inoltro TCP di IAP invia quindi alla VM remota.

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

VPN

Cloud VPN ti consente di connettere la tua rete esistente alla rete Google Cloud utilizzando una connessione IPsec a un dispositivo gateway VPN. In questo modo, il traffico viene indirizzato direttamente dalle tue sedi alle interfacce IP private delle VM Compute Engine. Il traffico è criptato così come è mezzi pubblici su link pubblici a Google.

Per informazioni dettagliate su come impostare, configurare e utilizzare la 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 gli indirizzi IP esterni delle VM, leggi Connettersi alle VM Linux utilizzando Cloud VPN o Cloud Interconnect.

Traffico in uscita con Cloud NAT

Quando a una VM non è assegnato un indirizzo IP esterno, non può connessioni dirette a servizi esterni, inclusi altri servizi Google Cloud i servizi di machine learning. Per consentire a queste VM di raggiungere i servizi sulla rete internet pubblica, puoi impostare e configurare Cloud NAT, che può instradare per conto di qualsiasi VM sulla rete. Non considerare una singola VM come altamente disponibile o in grado di supportare un elevato throughput del traffico per più VM.

Accesso interattivo alla console seriale

Quando una VM non ha un indirizzo IP esterno, potresti comunque dover interagire con la VM per la risoluzione dei problemi o la manutenzione. La configurazione di un host Bastion, come discusso in precedenza, è un'opzione, ma potrebbe richiedere una configurazione più complessa rispetto alle tue esigenze. Se vuoi risolvere i problemi di una VM senza un indirizzo IP esterno, ti consigliamo di abilitare l'accesso interattivo alla console seriale, che ti consente di interagire con la console seriale di una VM utilizzando SSH ed eseguire 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 fungono da backend per i bilanciatori del carico del proxy SSL e HTTPS non devono avere indirizzi IP esterni per essere accessibili tramite il bilanciatore del carico. A per accedere direttamente a queste risorse richiede l'uso dei metodi elencati nella sezione Connessione a VM senza indirizzi IP esterni

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