Cloud SQL med bare privat IP: det Bra, de dårlige og de stygge

data er den nye gullgruven for alle selskaper, og denne skatten må være sikker og beskyttet . Det er derfor i mange år en vanlig god praksis for enhver databaseadministrator er å fjerne all offentlig tilgang til databasen , spesielt den offentlige IP-en og bare gi tilgang fra den private IP-en.
Denne «gyldne» regelen håndheves av alle sikkerhetsteam og de krever det samme mønsteret for enhver skyutplassering.

Cloud SQL-tjenesten , den administrerte databasetjenesten på Google Cloud, lar deg:

Takket være disse funksjonene, kan du håndheve kravene til sikkerhetsteamet .

Men er det et problem når vi jobber da fra i dag for ikke å ha offentlig IP på Cloud SQL-forekomster?

La oss sjekke dette over 3 brukstilfeller:

  1. Compute Engine connectivity
  2. Serverløse tjenester tilkobling
  3. Lokalt miljø tilkobling

Proxy binær i Cloud SQL

Før jeg går dypere inn i brukssakene, vil jeg utføre et raskt fokus på hovedfunksjonen til Cloud SQL-proxy

  • Denne binæren åpner en sikker og ende-til-ende-kryptert tunnel . Oppsummert, selv om databasen din ikke har SSL-sertifikat, blir dataene kryptert under transport.
  • Før tunnelen åpnes, sjekker binæren mot API for IAM-tjeneste hvis gjeldende legitimasjon har tilgang til Cloud SQL-forekomst . Dette er et ekstra sikkerhetslag, i tillegg til standard databaseautentisering med bruker / passord.
  • Tunnelen kan være åpen i en lokal port (TCP-tilkoblingsmodus) eller i en Unix-kontakt (ikke mulig på Windows-miljø)

The Good: Compute Engine connectivity

Fordi dette “private IP-sikkerhetsmønsteret” har blitt for eldre arkitektur (dvs. lokal VM og privat nettverk), er begrensningen perfekt for IaaS-verdenen (dvs. Compute Engine + VPC).
Jeg nevner Compute Engine, men det gjelder også med alle tjenestene som bruker Compute Engine-forekomster: Dataflow, Dataproc, GKE,…

  • Distribuer din VM i samme VPC som Cloud SQL-forekomster privat IP.
  • Bruk Cloud SQL-forekomsten privat IP for å nå den fra appen din som er distribuert på Compute Engine.
  • Åpne de nødvendige brannmurreglene hvis nødvendig.

Det er “bra” !!

Merk: bruk av Cloud SQL-proxy i dette tilfellet kan diskuteres. Det legger til et ekstra sikkerhetslag ved å sjekke autorisasjonen mot IAM-tjenester og den krypterte kommunikasjonen, men også legge til ekstra ventetid og potensielt feilpunkt. Det handler om kompromisser.

The Bad: Serverless services connectivity

Når vi bruker “den nye verden” av skyen, det serverløse paradigmet , tingene er ikke så fine med Cloud Run , Cloud Functions og App Engine .

Faktisk når du distribuerer på serverløse plattformer per definisjon trenger du ikke å administrere serverne , og dermed servere er ikke i VPC . Og dermed er det ikke mulig å nå Cloud SQL private IP koblet til prosjektets VPC.

Hvis du graver deg inn i Cloud Run , Cloud Functions og App Engine , kan du finne hvordan du kobler Cloud SQL-forekomsten til den serverløse tjenesten din takket være en innebygd funksjon:

Legg til Cloud SQL-forekomststilkoblingsnavnet til konfigurasjonen din, og automatisk opprettes en tunnel med forekomstens start.

I virkeligheten er det en forbindelse som er åpnet av Cloud SQL proxy binær i Unix socket-modus . Men denne løsningen fungerer bare hvis Cloud SQL-forekomsten har en offentlig IP .
I tilfelle bare privat IP , og selv om en privat IP-tilkoblingsmodus eksisterer med Cloud SQL proxy , det fungerer ikke!

Koble serverløse tjenester til Cloud SQL private IP

Forhåpentligvis eksisterer en løsning. Du kan klikke på private IP -fanen i Cloud SQL-tilkoblingsveiledningene for dette ( eksempel for Cloud Functions ).

Oppsummert må du:

  • Opprett en serverløs VPC-kontakt , i samme region som den serverløse tjenesten din. Og selvfølgelig koblet til samme VPC som Cloud SQL-forekomsten din.
    Merk at i dag støttes alle regionene av serverløs VPC-kontakt, men det var ikke tilfelle på en stund.
  • Distribuer den serverløse tjenesten din med denne VPC-kontakten , støttet av Cloud Run , Cloud Functions og App Engine
  • I appen din bruker Cloud SQL private IP (i stedet for Unix-kontakten)

Denne løsningen fungerer, men introduserer et nytt nettverkselement , en merkostnad og en mulig nytt feilpunkt i tilkoblingskjeden.

Det er “dårlig” !!

The Ugly: Local environment connectivity

Når du vil spørre databasen din , en gang i produksjon, gjennom din foretrukne database IDE installert på datamaskinen , må du koble ditt lokale miljø til skyen SQL-forekomst, og dermed via den private IP-en.

Fordi Cloud SQL-forekomsten ikke har en offentlig IP, kan du ikke nå den direkte fra Internett (datamaskinen din) og Cloud SQL proxy kan heller ikke . Løsningen her er å lage en bastion vert : en bro-VM mellom omverdenen (offentlig IP) og omverdenen (privat IP).

For dette, opprett en liten Compute Engine-forekomst , en f1-micro for eksempel ( veldig rimelig, mindre enn $ 5 per måned), for å oppnå dette.

Sikkerhetsteamkrav : All VM må ikke ha en offentlig IP. Selvfølgelig er ikke 0.0.0.0/0 brannmurregler tillatt, spesielt ikke på port 22 (ssh)

Bastion-vert uten offentlig IP

Nye begrensninger å håndtere ! Men det er konsekvent: hvis du lukker døren, er det for å la vinduet åpne !!
Så ikke noe problem, Google Cloud tilbyr en flott og enkel løsning for dette: Identity-Aware Proxy (IAP)

Med IAP trenger du bare gi en Google Cloud IAP IP-område

35.235.240.0/20 for å få tilgang til Compute Engine på port 22 i brannmurreglene . Og dermed er ikke nødvendig å åpne 0.0.0.0/0 (hele internett) til nå Compute Engine ssh porten!

Bruk deretter gcloud SDK for å koble til din bastion vert Compute Motorinstans
gcloud compute ssh --zone=
Og magien skjer! Gcloud SDK oppdager automatisk mangelen på offentlig IP til Compute Engine forekomst og åpner automatisk en IAP-tunnel for å koble forekomsten i SSH. Det er usynlig for brukeren!

Påloggingsinformasjonen (her brukerkontoen, men det kan være tjenestekonto) må ha nok tillatelse til å opprette en IAP-tunnel . Rollene er roller / iap.tunnelResourceAccessor for å lage tunnelen og roller / compute.instanceAdmin.v1 for tilgang til VM

Nå er du koblet til bastion-verten, men du har ennå ikke koblet Cloud SQL-forekomsten

IAP-tunneling, SSL-port videresending og Cloud SQL-proxy

Og der starter “stygg” -delen . Vi har to ting å oppnå

  1. Koble bastion-verten til Cloud SQL-forekomsten via den private IP-en
  2. Videresend forespørselen om tilkobling av lokalt miljødatabase til bastion-verten til nå Cloud SQL-forekomsten gjennom Cloud SQL Proxy-tunnel

1. Cloud SQL-forekomststilkobling fra bastion-verten
For dette trenger vi Cloud SQL-proxyen for å åpne en tunnel mellom bastion-verten og Cloud SQL-forekomsten.

Første utgave: Fordi du har ikke en offentlig IP, kan du ikke nå internett!
Du kan velge å lage en Cloud NAT på Bastion-vertens IP-område for beregningsforekomst. Men den enkleste måten er å laste den ned i ditt lokale miljø og deretter til kopier den på bastion-verten . For å oppnå dette kan du bruke denne kommandoen.
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
Fordi du kan åpne en SSH-forbindelse via IAP, kan du også bruke scp protokoll (ssh-kopi) til kopier filer via IAP! Magisk !!

Flott, nå har du binærfilen på Bastion-verten Compute Engine-forekomst, og du ønsker å teste om forbindelsen fungerer . Du kan kjøre kommandoene

#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

Du finner connection_name på siden i Cloud SQL-forekomsten

Andre utgave: det fungerer ikke! Og det er mange grunner!

  • Hvis du opprettet din bastion-vert Compute Engine med standardparametrene , spesielt API-omfangsdelen, har du ikke nok omfang til å nå Cloud SQL API-ene.
    For å løse dette må du stoppe Compute Engine , redigere den og tilpasse omfanget
  • Når Cloud SQL-tunnelen er opprettet, vil IAM-tillatelser for gjeldende legitimasjon (her Compute Engine credentials ) er merket . Compute Engine-tjenestekontoen kunne ikke ha nok tillatelser.
    For å løse dette må du være sikker på at minimale roller tildeles på tjenestekontoen: Cloud SQL client, Cloud SQL editor eller Cloud SQL admin
    Compute Engine standard tjenestekonto har roller / editor rolle. For bredt, men nok for vårt brukstilfelle.
  • Endelig, når du ber om et Google Cloud API, blir det bedt om offentlig DNS . Det oppstår når Cloud SQL proxy ber om Cloud SQL API eller IAM-tjenesten når tunnelen er opprettet. Og fordi bastion-verten Compute Engine ikke har en offentlig IP, kan den nå internett og googleapis.com offentlig DNS.
    For å løse dette har du to løsninger.Enten konfigurer en Cloud NAT som foreslått før, eller bruk en vanskelig funksjon i Google Cloud VPC: Tillat Bastion Host Compute Engines current subnet å ringe den private

    googleapis.com DNS . For å oppnå dette, gå til VPC, velg riktig delnett og rediger det. Velg så On for alternativknappen Privat Google Access, og lagre.

Flott !! Nå kan Bastion Host Compute Engine bruke Cloud SQL-proxy for å åpne en tunnel fra den lokale porten 3306 til Cloud SQL-forekomsten, gjennom den private IP-adressen.

2. Videresend lokalmiljøtrafikk til Cloud SQL-forekomst
For å oppnå dette, bruker vi ikke gcloud ssh innebygd funksjon, men en alternativ løsning . I tillegg til en direkte forbindelse med ssh til Compute Instances, tillater gcloud SDK å lage en tunnel på alle porter .

Så la oss lage en tunnel på port 22 på bastion-verten Beregn motorforekomst og definer en vilkårlig lokal port (her 4226)

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

Flott, en tunnel er åpen, og vi kan bruke den til å koble bastion-verten Compute Engine-forekomst i ssh.

La tunnelen åpne og kjøre i en terminal og åpne en ny.

Nå, la oss koble til ssh til den . I en kommando vil du oppnå flere obligatoriske ting for å opprette forbindelsen :

  • Opprett en portoverføring fra ditt lokale miljø til bastion-verten beregningsmotor
    -L 3306:localhost:3306
    “min lokale port 3306 videresendes på mål-VM (her bastion-verten) for å nå porten 3306 åpnet på localhost (dvs. mål-VM) ”
  • Gjenbruk ssh-nøkkelen opprettet automatisk av Google under den første ssh forbindelse til bastion vert Compute Engine (eller scp). Denne private nøkkelen er lagret i home katalogen til den nåværende brukeren ~/.ssh
    -i ~/.ssh/google_compute_engine
  • Åpne en ssh -forbindelse gjennom eksisterende IAP-tunnel i localhost -miljøet og videresender ssh trafikk fra den lokale porten 4226
    -p 4226 localhost
  • Når du er koblet til bastion vert Compute Engine, du vil kjøre Cloud SQL-proxyen for å lage tunnelen til Cloud SQL-forekomsten , på porten 3306. For dette, kjør kommandoen du vil ha på fjernkontrollen (bastion-verten) etter en --
    -- /tmp/cloud_sql_proxy instances==tcp:3306

Og sette alt dette sammen

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

Nå har du det! Bruk din favoritt database IDE, koble den til localhost:3306 og logg på databasen din med brukeren / passordet.

Wow !! Alt dette for å kunne oppfylle et sikkerhetsmønster ! Her et skjema over hva vi har bygget

Det er “stygg” !!

Ekstra bivirkning

Bruk av Cloud SQL med privat IP legger bare til forbehold . Faktisk opprettes en peering mellom VPC for prosjektet og Cloud SQL-nettverket (administrert av Google Cloud).
Og peering kommer med to begrensninger:

Dette siste punktet er veldig viktig og kan være en blokkerer hvis du vil nå databaseforekomsten fra et annet prosjekt . Fra VPC for et annet prosjekt, vil du lage en peering med prosjektet som har Cloud SQL-forekomsten å nå, gjennom den private IP-en.

Men på grunn av begrensningen for transitivitet kan du t: Cloud SQL private IP blir ikke sett fra VPC for det andre prosjektet.
Løsningen her er å lage en VPN for å peere de 2 VPCene .
Det er euh… “styggeste” ??

En ekstra bivirkning er inhabilitet for App Script-apper til å bruke Cloud SQL-forekomster hvis ingen offentlig IP er definert.

«Smart» sikkerhetsmønster betyr noe

Sikkerhetsspørsmål og eksisterende mønstre for databaser fungerer bra … i arven verden.
Nå, med Cloud SQL og Cloud SQL proxy, finnes flere sikkerhetslag som ugyldiggjør de gamle mønstrene.

Hva er problemet med å ha en offentlig IP hvis ingen IP-områder er tillatt for å koble til den ?

Det er definisjonen av en brannmurregel i den eldre verden, er det ikke ikke det? Nekt alle IP-er for å få tilgang til dette området / IP der databasene mine er

Sikkerhetsteam bekymring : Hvordan være sikker på at ikke noe IP-område er tillatt?

Dette spørsmålet er legitimt og det er derfor du kan håndheve en organisasjonspolicy ( Begrens Autoriserte nettverk på SQL SQL-forekomster ) til forhindrer tillegg av offentlig IP-rekkevidde på Cloud SQL-forekomster , og dette, hele virksomheten.

Til slutt unngår å tillate en offentlig IP på Cloud SQL-forekomster mye løsning og rare design å håndtere, og uten å redusere sikkerhetsnivået.
Dessuten er den opprettede tunnelen kryptert og sikrer et høyt sikkerhetsnivå og konfidensialitet.

Skyen endrer paradigmene (se Beyond Corp ), og sikkerhetsmønsteret må oppdateres for å overholde dem.
Smarte sikkerhetsmønstre er bedre enn eldre sikkerhetsmønstre!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *