Cloud SQL med kun privat IP: det Godt, det dårlige og det grimme

data er den nye guldgruve for alle virksomheder, og denne skat skal holdes sikker og beskyttet . Derfor er en almindelig god praksis for enhver databaseadministrator i mange år at fjerne al offentlig adgang til databasen , især den offentlige IP og til kun give adgang fra den private IP.
Denne “gyldne” regel håndhæves af alle sikkerhedsteam, og de kræver det samme mønster for enhver skyinstallation.

Cloud SQL-tjeneste , den administrerede databasetjeneste på Google Cloud, giver dig mulighed for at:

Takket være disse funktioner kan du håndhæve kravene til sikkerhedsteamet .

Men er det et problem, når vi arbejder da y-to-day for ikke at have offentlig IP i Cloud SQL-forekomster?

Lad os kontrollere dette over 3 brugssager:

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

Cloud SQL proxy binær

Før jeg går dybere ind i brugssagerne, vil jeg gerne udføre et hurtigt fokus på hovedfunktionen i Cloud SQL-proxy

  • Denne binære åbner en sikker og ende-til-ende krypteret tunnel . Sammenfattende, selvom din database ikke har SSL-certifikat, krypteres dataene under transit.
  • Før tunnelen åbnes, kontrollerer binær mod IAM-service-API, hvis den aktuelle legitimationsoplysninger er autoriseret til at få adgang til Cloud SQL-forekomsten . Dette er et ekstra lag af sikkerhed ud over standarddatabaseautentificering med bruger / adgangskode.
  • Tunnelen kan være åben i en lokal port (TCP-forbindelsestilstand) eller i et Unix-stik (ikke muligt på Windows-miljø)

The Good: Compute Engine connectivity

Fordi dette “private IP-sikkerhedsmønster” er blevet til ældre arkitektur (dvs. lokalt VM og privat netværk) passer begrænsningen perfekt til IaaS-verdenen (dvs. Compute Engine + VPC).
Jeg nævner Compute Engine, men det gælder også med alle de tjenester, der bruger Compute Engine-forekomster: Dataflow, Dataproc, GKE,…

  • Implementér din VM i samme VPC som Cloud SQL-forekomsterne private IP.
  • Brug Cloud SQL-instansen private IP til at nå den fra din app, der er implementeret på Compute Engine.
  • Åbn de krævede firewallregler, hvis nødvendigt.

Det er “godt” !!

Bemærk: brugen af ​​Cloud SQL-proxy i dette tilfælde kan diskuteres. Det tilføjer et ekstra sikkerhedslag ved at kontrollere godkendelsen mod IAM-tjenester og den krypterede kommunikation, men tilføjer også yderligere latenstid og potentielt fejlpunkt. Det drejer sig om kompromiser.

Det dårlige: Tilslutning af serverløse tjenester

Når vi bruger “den nye verden” af skyen, det serverløse paradigme , tingene er ikke så pæne med Cloud Run , Cloudfunktioner og App Engine .

Faktisk når du implementerer på serverløse platforme pr. definition behøver du ikke at administrere serverne , og dermed er servere findes ikke i din VPC . Og således er det ikke muligt uden for boksen at nå Cloud SQL private IP forbundet til dit projekts VPC.

Hvis du graver ind i Cloud Run , Cloud-funktioner og App Engine , du kan finde hvordan du forbinder din Cloud SQL-forekomst til din serverløse service takket være en indbygget funktion:

Tilføj Cloud SQL-instansens forbindelsesnavn til din konfiguration, og der oprettes automatisk en tunnel med start af forekomsten.

I virkeligheden er det en forbindelse åbnet af Cloud SQL proxy binær i Unix-sokkeltilstand . Men denne løsning fungerer kun, hvis Cloud SQL-forekomsten har en offentlig IP .
I tilfælde af kun privat IP , og selv hvis en privat IP-forbindelsestilstand findes med Cloud SQL-proxy , den fungerer ikke!

Forbind de serverløse tjenester til Cloud SQL private IP

Forhåbentlig findes der en løsning. Du kan klikke på private IP i Cloud SQL-forbindelsesvejledningerne til dette ( eksempel til Cloud-funktioner ).

Sammenfattende skal du:

  • Opret en serverløs VPC-stik , i samme region som din serverløse service. Og selvfølgelig forbundet til den samme VPC som din Cloud SQL-forekomst.
    Bemærk, at i dag understøttes alle regioner af et serverløst VPC-stik, men det var ikke tilfældet i et stykke tid.
  • Implementér din serverløse service med dette VPC-stik , understøttet af Cloud Run , Cloud-funktioner og App Engine
  • I din app bruger Cloud SQL private IP (i stedet for Unix-stikket-forbindelsen)

Denne løsning fungerer, men introducerer et nyt netværkselement , et ekstra omkostninger og en mulig nyt fejlpunkt i forbindelseskæden.

Det er “dårlig” !!

The Ugly: Local environment connectivity

Når du vil spørge din database , engang i produktion gennem din foretrukne database IDE installeret på din computer , skal du forbinde dit lokale miljø til skyen SQL-forekomst og dermed via den private IP.

Fordi Cloud SQL-forekomsten ikke har en offentlig IP, kan du ikke nå den direkte fra Internettet (din computer) og Cloud SQL-proxy kan heller ikke . Løsningen her er at oprette en bastion vært : en bro-VM mellem omverdenen (offentlig IP) og den indre verden (privat IP).

Til dette skal oprette en lille Compute Engine-forekomst , en f1-mikro for eksempel ( meget overkommelig, mindre end $ 5 pr. måned) for at opnå dette.

Krav til sikkerhedsteam : Alt VM må ikke have en offentlig IP. Naturligvis er 0.0.0.0/0 firewallregler ikke tilladt, især på port 22 (ssh)

Bastion-vært uden offentlig IP

Nye begrænsninger at håndtere ! Men det er konsekvent: hvis du lukker døren, er det for at lade vinduet åbne !!
Så intet problem, Google Cloud tilbyder en fantastisk og nem løsning til dette: Identity-Aware Proxy (IAP)

Med IAP behøver du kun give en Google Cloud IAP IP-rækkevidde

35.235.240.0/20 for at få adgang til din Compute Engine på port 22 i dine firewallregler . Og således er ikke nødvendigt at åbne 0.0.0.0/0 (hele internettet) til nå Compute Engine ssh porten!

Brug derefter gcloud SDK til at oprette forbindelse til din bastion vært Compute Motorinstans
gcloud compute ssh --zone=
Og magien sker! Gcloud SDK registrerer automatisk manglen på offentlig IP til computermotoren forekomst og åbner automatisk en IAP-tunnel for i SSH at forbinde forekomsten . Det er usynligt for brugeren!

Legitimationsoplysningerne (her brugerkontoen, men det kan være en servicekonto) skal have tilstrækkelig tilladelse til at oprette en IAP-tunnel . Rollerne er roller / iap.tunnelResourceAccessor til at oprette tunnelen og roller / compute.instanceAdmin.v1 for adgang til VM

Nu er du tilsluttet bastion-værten, men du har endnu ikke tilsluttet Cloud SQL-forekomsten

IAP-tunnel, SSL-portvideresendelse og Cloud SQL-proxy

Og der starter “grim” . Vi har to ting at opnå

  1. Forbind bastion-værten til Cloud SQL-forekomsten via den private IP
  2. Videresend den lokale miljødatabaseforbindelsesanmodning til bastionsværten til nå Cloud SQL-forekomsten gennem Cloud SQL Proxy-tunnel

1. Cloud SQL-forekomststilslutning fra bastion-vært
Til dette har vi brug for Cloud SQL-proxyen for at åbne en tunnel mellem bastion-værten og Cloud SQL-instansen.

Første nummer: Fordi du har ikke en offentlig IP, kan du ikke nå internettet!
Du kan vælge oprette en Cloud NAT på din IP-rækkevidde for bastionsværten. Men den nemmeste måde er at downloade det i dit lokale miljø og derefter til kopier det på bastionsværten . For at opnå dette kan du bruge denne kommando.
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
Fordi du kan åbne en SSH-forbindelse via IAP, kan du også bruge scp protokol (ssh-kopi) til kopier filer via IAP! Magisk !!

Fantastisk, nu har du binærprogrammet i Bastion Host Compute Engine-forekomsten, og du vil teste, om forbindelsen fungerer . Du kan køre kommandoerne

#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 kan finde connection_name på siden i din Cloud SQL-instans

Andet nummer: det virker ikke! Og der er mange grunde!

  • Hvis du oprettede din bastion vært Compute Engine med standardparametrene , især API-omfangsdelen, har du ikke nok omfang til at nå Cloud SQL APIerne.
    For at løse dette skal du stoppe din Compute Engine , redigere den og tilpas rækkevidden
  • Når Cloud SQL-tunnelen oprettes, er IAM-tilladelser for de aktuelle legitimationsoplysninger (her Compute Engine credentials ) er markeret . Compute Engine-servicekontoen kunne ikke have nok tilladelser.
    For at løse dette skal du sørge for, at minimale roller tildeles på servicekontoen: Cloud SQL client, Cloud SQL editor eller Cloud SQL admin
    Compute Engine standardtjenestekonto har roller / editor rolle. For bred, men nok til vores brugssag.
  • Endelig, når du beder om en Google Cloud API, bliver den offentlige DNS anmodet . Det sker, når Cloud SQL-proxy anmoder Cloud SQL API eller IAM-tjenesten, når tunnelen oprettes. Og fordi bastionsværten Compute Engine ikke har en offentlig IP, kan den nå internettet og googleapis.com offentlig DNS.
    For at løse dette har du 2 løsninger.Enten opsæt en Cloud NAT som foreslået før, eller brug en vanskelig funktion i Google Cloud VPC: Tillad bastion vært Compute Engines aktuelle subnet at kalde den private

    googleapis.com DNS . For at opnå dette skal du gå til din VPC, vælge det rigtige undernet og redigere det. Vælg derefter On til alternativknappen Privat Google Access, og gem.

Fantastisk !! Nu kan bastion vært Compute Engine bruge Cloud SQL proxy til at åbne en tunnel fra den lokale port 3306 til Cloud SQL-forekomsten, gennem den private IP.

2. Videresend lokalmiljøtrafik til Cloud SQL-forekomst
For at opnå dette bruger vi ikke gcloud ssh indbygget funktion, men en alternativ løsning . Ud over en direkte forbindelse med ssh til Compute Instances tillader gcloud SDK at oprette en tunnel på alle porte .

Så lad os oprette en tunnel på port 22 i bastionsværten Beregn motorforekomst og definer en vilkårlig lokal port (her 4226)

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

Fantastisk, en tunnel er åben, og vi kan bruge den til at forbinde bastion-værten Compute Engine-forekomst i ssh.

Lad tunnelen åbne og køre i en terminal og åben en ny.

Nu, lad os oprette forbindelse i ssh til det . I en kommando vil du opnå flere obligatoriske ting for at oprette forbindelsen :

  • Opret en portvideresendelse fra dit lokale miljø til bastionsværten beregningsmotor
    -L 3306:localhost:3306
    “min lokale port 3306 videresendes på mål-VM (her bastion-værten) for at nå porten 3306 åbnet på localhost (dvs. mål-VM) ”
  • Genbrug ssh-nøglen oprettet automatisk af Google under den første ssh forbindelse til Bastion Host Compute Engine (eller scp). Denne private nøgle er gemt i home -mappen for den aktuelle bruger ~/.ssh
    -i ~/.ssh/google_compute_engine
  • Åbn en ssh -forbindelse gennem den eksisterende IAP-tunnel localhost -miljøet og videresender ssh trafik fra den lokale port 4226
    -p 4226 localhost
  • Når der er forbindelse til Bastion Host Compute Engine, du vil køre Cloud SQL-proxyen for at oprette tunnelen til Cloud SQL-forekomsten på porten 3306. Til dette skal du køre den kommando, du ønsker på fjernbetjeningen (bastion-værten) efter en --
    -- /tmp/cloud_sql_proxy instances==tcp:3306

Og læg alt dette sammen

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

Nu har du det! Brug din yndlingsdatabase IDE, tilslut den til localhost:3306 og log ind på din database med brugeren / adgangskoden.

Wow !! Alt dette for at kunne overholde et sikkerhedsmønster ! Her et skema over, hvad vi har bygget

Det er “grimt” !!

Yderligere bivirkning

Brug af Cloud SQL med en privat IP tilføjer kun advarsler . Faktisk oprettes en peering mellem projektets VPC og Cloud SQL-netværket (administreret af Google Cloud).
Og peering kommer med to begrænsninger:

Dette seneste punkt er meget vigtigt, og kan være en blokering, hvis du vil nå databaseinstansen fra et andet projekt . Fra VPC for et andet projekt vil du faktisk oprette en peering med det projekt, som Cloud SQL-forekomsten skal nå gennem den private IP.

Men på grund af begrænsningen af ​​transitivitet kan du t: Cloud SQL private IP ses ikke fra VPC i det andet projekt.
Løsningen her er at opretter en VPN til at peer de 2 VPCer .
Det er euh… “ugliest” ??

En yderligere bivirkning er manglende evne til, at App Script-apps kan bruge Cloud SQL-forekomster, hvis der ikke er defineret nogen offentlig IP.

“Smart” sikkerhedsmønster betyder noget

Sikkerhedsspørgsmål og de eksisterende mønstre for databaser arbejde godt … i den arvede verden.
Nu findes der med Cloud SQL og Cloud SQL-proxy yderligere sikkerhedslag, der annullerer de gamle mønstre.

Hvad er problemet med at have en offentlig IP, hvis ingen IP-intervaller er tilladt til at oprette forbindelse til den ?

Det er definitionen af ​​en firewallregel i den ældre verden, er det ikke ikke det? Afvis alle IPer for at få adgang til dette interval / IP, hvor mine databaser er hostet

Sikkerhedsteam bekymring : Hvordan kan jeg være sikker på, at intet IP-interval er tilladt?

Dette spørgsmål er legitimt, og det er derfor, du kan håndhæve en organisationspolitik ( Begræns Autoriserede netværk på Cloud SQL-forekomster ) til forhindrer tilføjelser af det offentlige IP-interval på Cloud SQL-forekomster , og dette, hele virksomheden.

Til sidst undgår en offentlig IP på Cloud SQL-forekomster en masse løsning og mærkelige designs at håndtere og uden at mindske sikkerhedsniveauet.
Desuden er den oprettede tunnel krypteret og sikrer et højt sikkerhedsniveau og fortrolighed.

Skyen ændrer paradigmerne (se Beyond Corp ), og sikkerhedsmønsteret skal opdateres for at overholde dem.
Smarte sikkerhedsmønstre er bedre end ældre sikkerhedsmønstre!

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *