Cloud SQL solo con IP privato: il Il buono, il brutto e il cattivo

I dati sono la nuova miniera doro di tutte le società e questo tesoro deve essere tenuti al sicuro e protetti . Ecco perché, per molti anni, una buona pratica comune di qualsiasi amministratore di database è rimuovere tutti gli accessi pubblici al database , in particolare lIP pubblico e a concedere laccesso solo dallIP privato.
Questa regola “doro” viene applicata da tutti team di sicurezza e richiedono lo stesso schema per qualsiasi distribuzione cloud.

Il servizio Cloud SQL , il servizio di database gestito su Google Cloud, ti consente di:

Grazie a queste funzionalità, puoi far rispettare i requisiti del team di sicurezza .

Ma è un problema quando lavoriamo da di giorno in giorno per non avere un IP pubblico sulle istanze Cloud SQL?

Controlliamo questo in 3 casi duso:

  1. Compute Engine connettività
  2. Servizi serverless connettività
  3. Ambiente locale connettività

Binario proxy Cloud SQL

Prima di approfondire i casi duso, vorrei concentrarmi rapidamente sulla funzione principale di Proxy Cloud SQL

  • Questo binario apre un tunnel crittografato end-to-end sicuro . In sintesi, anche se il tuo database non dispone del certificato SSL, i dati vengono crittografati in transito.
  • Prima di aprire il tunnel, il binario controlla API del servizio IAM se la credenziale corrente è autorizzata ad accedere allistanza Cloud SQL . Questo è un ulteriore livello di sicurezza, oltre allautenticazione del database standard tramite utente / password.
  • Il tunnel può essere aperto su una porta locale (modalità di connessione TCP) o su un socket Unix (non possibile su Ambiente Windows)

Vantaggio: connettività Compute Engine

Perché questo “modello di protezione IP privato” è stato costruito per larchitettura legacy (ovvero VM in loco e rete privata), il vincolo si adatta perfettamente al mondo IaaS (ovvero Compute Engine + VPC).
Cito Compute Engine, ma vale anche per tutti i servizi che utilizzano istanze di Compute Engine: Dataflow, Dataproc, GKE, …

  • Distribuisci la tua VM nel stesso VPC dellIP privato delle istanze Cloud SQL.
  • Utilizza lIP privato dellistanza Cloud SQL per raggiungerla dalla tua app distribuita su Compute Engine.
  • Apri le regole del firewall richieste se necessario.

Questo è “buono” !!

Nota: lutilizzo del proxy Cloud SQL in questo caso può essere discusso. Aggiunge un ulteriore livello di sicurezza controllando lautorizzazione rispetto ai servizi IAM e alla comunicazione crittografata, ma aggiunge anche ulteriore latenza e potenziale punto di errore. È una questione di compromessi.

Contro: connettività dei servizi senza server

Quando usiamo il “nuovo mondo” del Cloud, il paradigma serverless , le cose non sono così belle con Cloud Run , Cloud Functions e App Engine .

Infatti, quando esegui il deployment su piattaforme serverless , per definizione, non è necessario che tu gestisca i server e quindi i server non sono nel tuo VPC . Pertanto, non è possibile, immediatamente, raggiungere lIP privato di Cloud SQL collegato al VPC del progetto.

Se approfondisci Cloud Run , Cloud Functions e App Engine , puoi trovare come connettere la tua istanza Cloud SQL al tuo servizio serverless grazie a una funzionalità integrata:

Aggiungi il nome della connessione dellistanza Cloud SQL alla tua configurazione e automaticamente viene creato un tunnel allavvio dellistanza.

In realtà, è una connessione aperta dal proxy Cloud SQL binario in modalità socket Unix . Ma questa soluzione funziona solo se listanza Cloud SQL ha un IP pubblico .
In caso di solo IP privato e anche se un La modalità di connessione IP privato esiste con il proxy Cloud SQL , non funziona!

Connetti i servizi serverless allIP privato di Cloud SQL

Si spera che esista una soluzione. Puoi fare clic su private IP nei tutorial sulla connessione Cloud SQL per questo ( esempio per Cloud Functions ).

In sintesi, devi:

  • Creare un connettore VPC serverless , nella stessa regione del servizio serverless. E, naturalmente, connesso allo stesso VPC dellistanza Cloud SQL.
    Tieni presente che oggi tutte le regioni sono supportate dal connettore VPC senza server, ma per un po non è stato così.
  • Distribuisci il tuo servizio serverless con questo connettore VPC , supportato da Cloud Run , Cloud Functions e App Engine
  • Nella tua app, utilizza lIP privato di Cloud SQL (invece della connessione socket Unix)

Questa soluzione funziona ma introduce un nuovo elemento di rete , un costo aggiuntivo e un possibile nuovo punto di errore nella catena di connettività.

Questo è “cattivo” !!

Il brutto: connettività dellambiente locale

Quando desideri interrogare il tuo database , a volte in produzione, tramite il tuo IDE di database preferito installato sul tuo computer , devi connettere il tuo ambiente locale al Cloud Istanza SQL, e quindi tramite lIP privato.

Poiché listanza Cloud SQL non ha un IP pubblico, non può raggiungerla direttamente da anche il (il tuo computer) e il proxy Cloud SQL non possono . La soluzione qui è creare un bastion host : una VM bridge tra il mondo esterno (IP pubblico) e il mondo interno (IP privato).

Per questo, crea una piccola istanza Compute Engine , ad esempio f1-micro ( molto conveniente, meno di $ 5 al mese), per raggiungere questo obiettivo.

Requisiti del team di sicurezza : Tutta la VM non deve avere un IP pubblico. Ovviamente, le regole del firewall 0.0.0.0/0 non sono consentite, specialmente sulla porta 22 (ssh)

Host Bastion senza IP pubblico

Nuovi vincoli da gestire ! Ma è coerente: se chiudi la porta, è per farla aprire !!
Quindi nessun problema, Google Cloud offre unottima e facile soluzione per questo: Identity-Aware Proxy (IAP)

Con IAP, devi solo concedere un Google Cloud IAP Intervallo IP

35.235.240.0/20 per accedere a Compute Engine sulla porta 22 delle regole del firewall . Pertanto, non è necessario aprire 0.0.0.0/0 (lintera Internet) per raggiungi la porta ssh di Compute Engine!

Quindi, utilizza gcloud SDK per connetterti al tuo bastion host Compute Istanza del motore
gcloud compute ssh --zone=
E accade la magia! gcloud SDK rileva automaticamente la mancanza di un IP pubblico di Compute Engine istanza e apre automaticamente un tunnel IAP per connettersi in SSH allistanza . È invisibile per lutente!

La credenziale (qui laccount utente, ma potrebbe essere un account di servizio) deve disporre di autorizzazioni sufficienti per creare un tunnel IAP . I ruoli sono roles / iap.tunnelResourceAccessor per creare il tunnel e roles / compute.instanceAdmin.v1 per accedere alla VM

Ora sei connesso al bastion host, ma non hai ancora connesso listanza Cloud SQL

Tunneling IAP, port forwarding SSL e Proxy Cloud SQL

E lì, inizia la parte “ugly” . Abbiamo due cose da raggiungere

  1. Connetti il bastion host allistanza Cloud SQL tramite lIP privato
  2. Inoltra la richiesta di connessione al database dellambiente locale al bastion host a raggiunge listanza Cloud SQL tramite il tunnel proxy Cloud SQL

1. Connettività dellistanza Cloud SQL dal bastion host
Per questo, abbiamo bisogno del proxy Cloud SQL per aprire un tunnel tra il bastion host e listanza Cloud SQL.

Primo problema: Perché non hai un IP pubblico, non puoi raggiungere Internet!
Puoi scegliere di creare un sul tuo bastion host Compute Instance IP range. Tuttavia, il modo più semplice è scaricarlo nel tuo ambiente locale e quindi copialo sul bastion host . Per ottenere ciò, puoi utilizzare questo comando.
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
Poiché puoi aprire una connessione SSH tramite IAP, puoi anche utilizzare scp protocollo (copia ssh) per copiare i file tramite IAP! Magia !!

Ottimo, ora hai il binario sullistanza Compute Engine del bastion host e desidera verificare se la connessione funziona . Puoi eseguire i comandi

#Connect to bastion host
gcloud compute ssh --zone=
#Change the permission of the Cloud SQL proxy binary (do it only once)
chmod +x /tmp/cloud_sql_proxy
#Connect to your Cloud SQL instance
/tmp/cloud_sql_proxy --instances==tcp:3306

Puoi trovare connection_name nella pagina della tua istanza Cloud SQL

Secondo problema: non funziona! E ci sono molte ragioni!

  • Se hai creato il tuo bastion host Compute Engine con i parametri predefiniti , in particolare la parte dellambito API, non hai abbastanza ambito per raggiungere le API Cloud SQL.
    Per risolvere questo problema, devi arrestare il tuo Compute Engine , modificarlo e personalizza gli ambiti
  • Quando viene creato il tunnel Cloud SQL, le autorizzazioni IAM delle credenziali correnti (qui le credenziali Compute Engine ) sono controllate . Laccount di servizio Compute Engine potrebbe non disporre di autorizzazioni sufficienti.
    Per risolvere il problema, assicurati che i ruoli minimi siano concessi allaccount di servizio: Cloud SQL client, Cloud SQL editor o Cloud SQL admin
    Laccount di servizio predefinito di Compute Engine ha ruoli / editor ruolo. Troppo ampio ma sufficiente per il nostro caso duso.
  • Infine, per impostazione predefinita, quando richiedi unAPI di Google Cloud, viene richiesto il DNS pubblico . Si verifica quando il proxy Cloud SQL richiede lAPI Cloud SQL o il servizio IAM quando viene creato il tunnel. Inoltre, poiché il bastion host Compute Engine non ha un IP pubblico, può raggiungere Internet e googleapis.com DNS pubblico.
    Per risolvere questo problema, hai due soluzioni. configura un Cloud NAT come proposto in precedenza oppure utilizza una complicata funzionalità di Google Cloud VPC: Consenti al bastion host Compute Engine la sottorete per chiamare il

    googleapis.com DNS . Per ottenere ciò, vai al tuo VPC, seleziona la sottorete corretta e modificala. Quindi seleziona On per il pulsante di opzione Accesso Google privato e salva.

Fantastico !! Ora il bastion host Compute Engine può utilizzare il proxy Cloud SQL per aprire un tunnel dalla porta locale 3306 allistanza Cloud SQL, tramite lIP privato.

2. Inoltra il traffico dellambiente locale allistanza Cloud SQL
Per ottenere ciò, non utilizzeremo gcloud ssh funzione incorporata ma una soluzione alternativa . Oltre a una connessione diretta con ssh alle istanze di calcolo, gcloud SDK consente di creare un tunnel su qualsiasi porta .

Quindi, creiamo un tunnel sulla porta 22 del bastion host istanza di Compute Engine e definisci una porta locale arbitraria (qui 4226)

gcloud compute start-iap-tunnel  22 \
--zone= --local-host-port=localhost:4226

Ottimo, un tunnel è open e possiamo usarlo per connettere listanza Compute Engine del bastion host in ssh.

Lascia che il tunnel si apra e funzioni in un terminale e apri uno nuovo.

Ora connettiamoci in ssh ad esso . In un comando, raggiungerai diverse cose obbligatorie per stabilire la connessione :

  • Crea un port forwarding dal tuo ambiente locale al bastion host motore di calcolo
    -L 3306:localhost:3306
    “my local port 3306 viene inoltrato sulla VM di destinazione (qui il bastion host) per raggiungere la porta 3306 aperto nella localhost (ovvero la VM di destinazione) “
  • Riutilizza la chiave ssh creata automaticamente da Google durante il primo ssh connessione al bastion host Compute Engine (o scp). Questa chiave privata è archiviata nella home directory dellutente corrente ~/.ssh
    -i ~/.ssh/google_compute_engine
  • Apri un ssh tramite il tunnel IAP esistente nellambiente localhost e inoltrando il ssh traffico dalla porta locale 4226
    -p 4226 localhost
  • Quando è connesso al bastion host Compute Engine, desideri eseguire il proxy Cloud SQL per creare il tunnel allistanza Cloud SQL , sulla porta 3306. Per questo, esegui il comando che desideri sul telecomando (il bastion host) dopo un --
    -- /tmp/cloud_sql_proxy instances==tcp:3306

E metti insieme tutto questo

ssh -L 3306:localhost:3306 \
-i ~/.ssh/google_compute_engine \
-p 4226 localhost \
-- /tmp/cloud_sql_proxy instances==tcp:3306

Ora ce lhai! Utilizza il tuo IDE di database preferito, collegalo a localhost:3306 e accedi al tuo database con lutente / password.

Wow !! Tutto questo per essere in grado di rispettare un modello di sicurezza ! Ecco uno schema di ciò che abbiamo creato

Questo è “ugly” !!

Ulteriore effetto collaterale

Utilizzo di Cloud SQL con un IP privato aggiunge solo avvertenze . Infatti, viene creato un peering tra il VPC del progetto e la rete Cloud SQL (gestita da Google Cloud).
E il peering ha due limitazioni:

Questultimo punto è molto importante e può essere un blocco se desideri raggiungere listanza del database da un altro progetto . Infatti, dal VPC di un altro progetto, vorresti creare un peering con il progetto che ha listanza Cloud SQL da raggiungere, attraverso lIP privato.

Ma, a causa della limitazione della transitività, puoi t: lIP privato di Cloud SQL non viene visto dal VPC dellaltro progetto.
La soluzione qui è creare una VPN per eseguire il peering dei 2 VPC .
È euh … “più brutto” ??

Un ulteriore effetto collaterale è lincapacità per le app App Script di utilizzare istanze Cloud SQL se non è definito alcun IP pubblico.

Il modello di sicurezza “intelligente” è importante

Questione di sicurezza e modelli esistenti per i database funziona alla grande … nel mondo delleredità.
Ora, con Cloud SQL e Cloud SQL proxy, esistono livelli di sicurezza aggiuntivi che annullano i vecchi schemi.

Qual è il problema con un IP pubblico se non sono consentiti intervalli IP per connettersi ad esso ?

È la definizione di una regola firewall nel mondo legacy, non è ” vero? Nega a tutti gli IP di accedere a questo intervallo / IP in cui sono ospitati i miei database

Preoccupazione del team di sicurezza : come essere sicuri che non sia consentito alcun intervallo IP?

Questa domanda è legittima ed è per questo che puoi applica un criterio dellorganizzazione ( Limita Reti autorizzate su istanze Cloud SQL ) per impedire laggiunta di intervalli di indirizzi IP pubblici su istanze Cloud SQL e questo, a livello di azienda.

Alla fine, consentendo un IP pubblico su istanze Cloud SQL evita molte soluzioni alternative e strani design da affrontare e senza diminuire il livello di sicurezza.
Inoltre, il tunnel creato è crittografato e garantisce un elevato livello di sicurezza e riservatezza.

Il cloud cambia i paradigmi (vedere Beyond Corp ) e il modello di sicurezza deve essere aggiornato per rispettarli.
I modelli di sicurezza intelligenti sono migliori dei modelli di sicurezza legacy!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *