Cloud SQL met alleen privé-IP: de Goed, het slechte en het lelijke

De gegevens zijn de nieuwe goudmijn van alle bedrijven, en deze schat moet wees veilig en beschermd . Daarom is het jarenlang een goede gewoonte van een databasebeheerder om alle openbare toegang tot de database te verwijderen , vooral het openbare IP-adres en om alleen toegang te verlenen vanaf het privé-IP-adres.
Deze “gouden” regel wordt door iedereen afgedwongen beveiligingsteams en ze hebben hetzelfde patroon nodig voor elke cloudimplementatie.

Cloud SQL-service , de beheerde databaseservice op Google Cloud, stelt u in staat om:

Dankzij deze functies kunt u de vereisten van het beveiligingsteam afdwingen .

Maar is het een probleem als we da y-to-day om geen openbaar IP-adres te hebben op Cloud SQL-instanties?

Laten we dit eens bekijken over drie gebruiksscenarios:

  1. Compute Engine connectiviteit
  2. Serverloze services connectiviteit
  3. Lokale omgeving connectiviteit

Cloud SQL-proxy binair

Voordat ik dieper inga op de gebruiksscenarios, wil ik eerst even kijken naar het belangrijkste kenmerk van Cloud SQL-proxy

  • Dit binaire bestand opent een veilige en end-to-end gecodeerde tunnel . Samengevat, zelfs als uw database geen SSL-certificaat heeft, worden de gegevens tijdens de overdracht versleuteld.
  • Voordat de tunnel wordt geopend, controleert het binaire bestand tegen de IAM-service-API als de huidige inloggegevens zijn geautoriseerd voor toegang tot de Cloud SQL-instantie . Dit is een extra beveiligingslaag, naast de standaard databaseverificatie door gebruiker / wachtwoord.
  • De tunnel kan open zijn op een lokale poort (TCP-verbindingsmodus) of op een Unix-socket (niet mogelijk op Windows-omgeving)

Het goede: Compute Engine-connectiviteit

Omdat dit “privé-IP-beveiligingspatroon” is gebouwd voor legacy-architectuur (dwz lokale VM en privénetwerk) past de beperking perfect bij de IaaS-wereld (dwz Compute Engine + VPC).
Ik noem Compute Engine, maar het is ook waar voor alle services die Compute Engine-instanties gebruiken: Dataflow, Dataproc, GKE,…

  • Implementeer uw VM in de dezelfde VPC als het privé-IP-adres van de Cloud SQL-instantie.
  • Gebruik het privé-IP-adres van de Cloud SQL-instantie om deze te bereiken vanuit uw app die is geïmplementeerd op Compute Engine.
  • Open de vereiste firewallregels als nodig.

Dat is “goed” !!

Let op: het gebruik van Cloud SQL proxy kan in dit geval worden besproken. Het voegt een extra beveiligingslaag toe door de autorisatie te vergelijken met IAM-services en de gecodeerde communicatie, maar voegt ook extra latentie en mogelijk storingspunt toe. Het is een kwestie van afwegingen.

Het slechte: serverloze services-connectiviteit

Wanneer we de “nieuwe wereld” gebruiken van de Cloud, het serverloze paradigma , de dingen zijn niet zo leuk met Cloud Run , Cloud Functions en App Engine .

Inderdaad, wanneer u implementeert op serverloze platforms , u hoeft per definitie de servers niet te beheren, en dus de servers bevinden zich niet in uw VPC . En dus is het niet standaard mogelijk om het privé-IP-adres van Cloud SQL te bereiken dat is verbonden met de VPC van uw project.

Als u zich verdiept in Cloud Run , Cloud-functies en App Engine , vindt u hoe u uw Cloud SQL-instantie verbindt met uw serverloze service dankzij een ingebouwde functie:

Voeg de verbindingsnaam van de Cloud SQL-instantie toe aan uw configuratie en er wordt automatisch een tunnel gemaakt wanneer de instantie wordt gestart.

In werkelijkheid is het een verbinding die wordt geopend door Cloud SQL-proxy binair in Unix-socket-modus . Maar deze oplossing werkt alleen als de Cloud SQL-instantie een openbaar IP-adres heeft .
In het geval van alleen privé-IP , en zelfs als een privé-IP-verbindingsmodus bestaat met Cloud SQL-proxy , deze werkt niet!

Verbind de serverloze services met het privé-IP-adres van Cloud SQL

Hopelijk bestaat er een oplossing. U kunt klikken op de private IP in de Cloud SQL-verbindingshandleidingen hiervoor ( voorbeeld voor Cloud Functions ).

Samengevat:

  • Maak een serverloze VPC-connector , in dezelfde regio als uw serverloze service. En natuurlijk verbonden met dezelfde VPC als uw Cloud SQL-instantie.
    Houd er rekening mee dat tegenwoordig alle regios worden ondersteund door een serverloze VPC-connector, maar dat was een tijdje niet het geval.
  • Implementeer uw serverloze service met deze VPC-connector , ondersteund door Cloud Run , Cloud Functions en App Engine
  • gebruik in uw app het privé-IP-adres van Cloud SQL (in plaats van de Unix-socketverbinding)

Deze oplossing werkt, maar introduceert een nieuw netwerkelement , een extra kosten en een mogelijk nieuw foutpunt in de connectiviteitsketen.

Dat is “slecht” !!

The Ugly: Local environment connectivity

Wanneer u uw database wilt opvragen , ergens in productie, via uw favoriete database-IDE geïnstalleerd op uw computer , u moet uw lokale omgeving verbinden met de cloud SQL-instantie, en dus via het privé-IP-adres.

Omdat de Cloud SQL-instantie geen openbaar IP-adres heeft, kunt u deze niet rechtstreeks bereiken vanaf internet (uw computer) en Cloud SQL-proxy kunnen ook niet . De oplossing hier is om een bastion host : een brug-VM tussen de buitenwereld (openbaar IP) en de binnenwereld (privé IP).

Maak hiervoor een kleine Compute Engine-instantie , een f1-micro bijvoorbeeld ( zeer betaalbaar, minder dan $ 5 per maand), om dit te bereiken.

Vereiste beveiligingsteam : Alle virtuele machines mogen geen openbaar IP-adres hebben. Natuurlijk zijn 0.0.0.0/0 firewall regels niet toegestaan, vooral niet op poort 22 (ssh)

Bastion host zonder openbaar IP

Nieuwe beperkingen om mee om te gaan ! Maar het is consistent: als je de deur sluit, is het om het raam open te laten !!
Dus geen probleem, Google Cloud biedt hiervoor een geweldige en gemakkelijke oplossing: Identity-Aware Proxy (IAP)

Met IAP hoeft u alleen een Google Cloud IAP te verlenen IP-bereik

35.235.240.0/20 voor toegang tot uw Compute Engine op poort 22 in uw firewallregels . En dus is het niet nodig om 0.0.0.0/0 (het hele internet) te openen bereik de Compute Engine ssh poort!

Gebruik vervolgens de gcloud-SDK om verbinding te maken met uw bastionhost Compute Engine-instantie
gcloud compute ssh --zone=
En de magie gebeurt! De gcloud SDK detecteert automatisch het ontbreken van een openbaar IP-adres van de Compute Engine instantie en opent automatisch een IAP-tunnel om in SSH verbinding te maken met de instantie . Het is onzichtbaar voor de gebruiker!

De referentie (hier het gebruikersaccount, maar het kan een serviceaccount zijn) moet voldoende toestemming hebben om een ​​IAP-tunnel te maken . De rollen zijn rolls / iap.tunnelResourceAccessor om de tunnel te maken , en rollen / compute.instanceAdmin.v1 om toegang te krijgen tot de VM

Nu ben je verbonden met de bastionhost, maar je hebt nog geen verbinding gemaakt met de Cloud SQL-instantie

IAP-tunneling, SSL-poortdoorschakeling en Cloud SQL-proxy

En daar begint het gedeelte “lelijk” . We hebben twee dingen te bereiken

  1. Verbind de bastionhost met de Cloud SQL-instantie via het privé-IP-adres
  2. Stuur het verbindingsverzoek van de lokale omgeving door naar de bastionhost naar bereik de Cloud SQL-instantie via Cloud SQL Proxy-tunnel

1. Connectiviteit met Cloud SQL-instantie van bastionhost
Hiervoor hebben we de Cloud SQL-proxy nodig om een ​​tunnel te openen tussen de bastionhost en de Cloud SQL-instantie.

Eerste probleem: Omdat u geen openbaar IP-adres hebben, u kunt het internet niet bereiken!
U kunt ervoor kiezen om een Cloud NAT op uw bastionhost Compute Instance IP-bereik. Maar de gemakkelijkste manier is om het te downloaden in uw lokale omgeving en vervolgens naar kopieer het naar de bastionhost . Om dit te bereiken, kunt u deze opdracht gebruiken.
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
Omdat je een SSH-verbinding kunt openen via IAP, kun je ook scp protocol (ssh-kopie) naar kopieer bestanden via IAP! Magie !!

Geweldig, nu heb je het binaire bestand op de Compute Engine-instantie van de bastionhost en je bent wil testen of de verbinding werkt . U kunt de opdrachten

#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

U kunt de connection_name op de pagina van uw Cloud SQL-instantie

Tweede probleem: het werkt niet! En er zijn veel redenen!

  • Als u uw bastionhost Compute Engine heeft gemaakt met de standaardparameters , met name het gedeelte API-bereik, heeft u onvoldoende bereik om de Cloud SQL-APIs te bereiken.
    Om dit op te lossen, moet u uw Compute Engine stoppen , deze bewerken en pas de bereiken aan
  • Wanneer de Cloud SQL-tunnel is gemaakt, worden de IAM-machtigingen van de huidige inloggegevens (hier zijn de Compute Engine-inloggegevens ) aangevinkt . Het Compute Engine-serviceaccount heeft mogelijk niet voldoende rechten.
    Om dit op te lossen, moet u ervoor zorgen dat de minimale rollen zijn toegekend aan het serviceaccount: Cloud SQL client, Cloud SQL editor of Cloud SQL admin
    Compute Engine-standaardserviceaccount heeft rollen / editor rol. Te breed, maar genoeg voor ons gebruik.
  • Ten slotte wordt standaard de openbare DNS gevraagd wanneer u een Google Cloud API aanvraagt. . Het treedt op wanneer de Cloud SQL-proxy de Cloud SQL API of de IAM-service aanvraagt ​​wanneer de tunnel wordt gemaakt. En omdat de bastionhost Compute Engine geen openbaar IP-adres heeft, kan deze het internet bereiken en de googleapis.com openbare DNS.
    Om dit op te lossen, heb je 2 oplossingen. stel een Cloud NAT in zoals eerder voorgesteld, of gebruik een lastige functie van Google Cloud VPC: Sta het huidige subnet toe van de bastionhost Compute Engine om de privé

    googleapis.com DNS . Om dit te bereiken, gaat u naar uw VPC, selecteert u het juiste subnet en bewerkt u het. Selecteer vervolgens On voor het Private Google Access-keuzerondje en sla op.

Geweldig !! Nu kan de bastionhost Compute Engine Cloud SQL-proxy gebruiken om een ​​tunnel te openen van de lokale poort 3306 naar de Cloud SQL-instantie, via het privé-IP-adres.

2. Stuur lokaal omgevingsverkeer door naar Cloud SQL-instantie
Om dit te bereiken gebruiken we de gcloud ssh ingebouwde functie maar een alternatieve oplossing . Naast een directe verbinding met ssh naar rekeninstanties, kunt u met gcloud SDK een tunnel maken op alle poorten .

Laten we dus een tunnel maken op poort 22 van de bastionhost Compute Engine-instantie en definieer een willekeurige lokale poort (hier 4226)

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

Geweldig, een tunnel is open en we kunnen het gebruiken om de Compute Engine-instantie van de bastionhost te verbinden in ssh.

Laat de tunnel openen en draaien in een terminal en openen een nieuwe.

Nu, laten we verbinding maken in ssh ernaar . Met één commando, zult u verschillende verplichte dingen bereiken om de verbinding tot stand te brengen :

  • Maak een port forwarding van uw lokale omgeving naar de bastionhost rekenengine
    -L 3306:localhost:3306
    “mijn lokale poort 3306 wordt doorgestuurd naar de doel-VM (hier de bastionhost) om de poort 3306 geopend op de localhost (dwz de doel-VM) “
  • Hergebruik de ssh-sleutel die automatisch door Google is gemaakt tijdens de eerste ssh verbinding met de bastionhost Compute Engine (of scp). Deze privésleutel is opgeslagen in de home directory van de huidige gebruiker ~/.ssh
    -i ~/.ssh/google_compute_engine
  • Open een ssh -verbinding via de bestaande IAP-tunnel in de localhost -omgeving en doorsturen van de ssh verkeer van de lokale poort 4226
    -p 4226 localhost
  • Indien verbonden met de bastionhost Compute Engine, u wilt de Cloud SQL-proxy uitvoeren om de tunnel naar de Cloud SQL-instantie te maken, op de poort 3306. Voer hiervoor de gewenste opdracht uit op de afstandsbediening (de bastionhost) na een --
    -- /tmp/cloud_sql_proxy instances==tcp:3306

En voeg dit allemaal samen

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

Nu heb je het! Gebruik uw favoriete database-IDE, sluit deze aan op localhost:3306 en log in op uw database met de gebruiker / het wachtwoord.

Wauw !! Dit alles om te kunnen voldoen aan een beveiligingspatroon ! Hier een schema van wat we hebben gebouwd

Dat is “lelijk” !!

Extra bijwerking

Met Cloud SQL met een privé-IP-adres voegt alleen voorbehouden toe . Er wordt inderdaad een -peering gemaakt tussen de VPC van het project en het Cloud SQL-netwerk (beheerd door Google Cloud).
En peering heeft 2 beperkingen:

Dit laatste punt is erg belangrijk en kan een blokkering zijn als je de database-instantie wilt bereiken vanuit een ander project . Vanuit de VPC van een ander project wilt u inderdaad een peering maken met het project dat de Cloud SQL-instantie moet bereiken, via het privé-IP-adres.

Maar vanwege de beperking van de transitiviteit kunt u t: het privé-IP-adres van Cloud SQL wordt niet gezien vanuit de VPC van het andere project.
De oplossing hier is om een VPN te maken om de 2 VPCs .
Dat is euh… “lelijkste” ??

Een bijkomend neveneffect is het onvermogen voor App Script-apps om Cloud SQL-instanties te gebruiken als er geen openbaar IP-adres is gedefinieerd.

Slimme beveiligingspatroon is van belang

Beveiligingskwestie en de bestaande patronen voor databases werk geweldig … in de legacy-wereld.
Nu, met Cloud SQL en Cloud SQL-proxy, bestaan ​​er extra beveiligingslagen die de oude patronen ongeldig maken.

Wat is het probleem met een openbaar IP-adres als er geen IP-bereiken zijn toegestaan ​​ om er verbinding mee te maken ?

Het is de definitie van een firewallregel in de oude wereld, isn t het? Weiger alle IPs om toegang te krijgen tot dit bereik / IP waar mijn databases worden gehost

Beveiligingsteam bezorgdheid : Hoe weet je zeker dat er geen IP-bereik is toegestaan?

Deze vraag is legitiem en daarom kun je een organisatiebeleid afdwingen ( Beperken Geautoriseerde netwerken op Cloud SQL-instanties ) tot voorkomen dat een openbaar IP-bereik op Cloud SQL-instanties wordt toegevoegd , en dit voor het hele bedrijf.

Uiteindelijk voorkomt het toestaan ​​van een openbaar IP-adres op Cloud SQL-instanties veel tijdelijke oplossingen en vreemde ontwerpen om mee om te gaan, en zonder het beveiligingsniveau te verlagen.
Bovendien is de gemaakte tunnel gecodeerd en zorgt voor een hoog niveau van beveiliging en vertrouwelijkheid.

De cloud verandert de paradigmas (zie Beyond Corp ) en het beveiligingspatroon moet worden bijgewerkt om eraan te voldoen.
Slimme beveiligingspatronen zijn beter dan oudere beveiligingspatronen!

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *