Cloud SQL numai cu IP privat: Bine, rău și urât

Datele sunt noua mină de aur a tuturor companiilor, iar această comoară trebuie să fie să fie păstrat în siguranță și protejat . De aceea, timp de mulți ani, o bună practică obișnuită a oricărui administrator de baze de date este să elimine tot accesul public la baza de date , în special IP-ul public și să să acorde acces doar din IP-ul privat.
Această regulă „de aur” este aplicată de toți echipelor de securitate și necesită același model pentru orice implementare în cloud.

Serviciul Cloud SQL , serviciul de baze de date gestionate de pe Google Cloud, vă permite să:

Datorită acestor funcții, puteți aplica cerințele echipei de securitate .

Dar, este o problemă când lucrăm da zilnic să nu aveți un IP public în instanțele Cloud SQL?

Să verificăm acest lucru în 3 cazuri de utilizare:

  1. Compute Engine conectivitate
  2. Servicii fără server conectivitate
  3. Mediu local conectivitate

Cloud SQL proxy binar

Înainte de a aprofunda cazurile de utilizare, aș dori să mă concentrez rapid asupra caracteristicii principale a proxy Cloud SQL

  • Acest binar deschide un tunel criptat securizat și end-to-end . Pe scurt, chiar dacă baza de date nu are certificat SSL, datele sunt criptate în tranzit.
  • Înainte de a deschide tunelul, binarul verifică împotriva API de servicii IAM dacă acreditarea curentă este autorizată să acceseze instanța Cloud SQL . Acesta este un strat suplimentar de securitate, în plus față de autentificarea standard a bazei de date prin utilizator / parolă.
  • Tunelul poate fi deschis pe un port local (modul conexiune TCP) sau pe un socket Unix (nu este posibil pe Mediu Windows)

Bine: conectivitate Compute Engine

Deoarece acest „model de securitate IP privat” a fost construit pentru arhitectura moștenită (adică VM on-prem și rețea privată), constrângerea se potrivește perfect lumii IaaS (adică Compute Engine + VPC).
Menționez Compute Engine, dar este valabil și pentru toate serviciile care utilizează instanțe Compute Engine: Dataflow, Dataproc, GKE, …

  • Implementați VM în același VPC ca IP-ul privat SQL instanțe Cloud.
  • Utilizați IP privat instanță Cloud SQL pentru a ajunge la acesta din aplicația dvs. care este implementată pe Compute Engine.
  • Deschideți regulile firewall necesare dacă necesar.

Asta este „bun” !!

Notă: utilizarea proxy-ului Cloud SQL în acest caz poate fi discutată. Acesta adaugă un strat de securitate suplimentar prin verificarea autorizației împotriva serviciilor IAM și a comunicației criptate, dar adaugă și o latență suplimentară și un potențial punct de eșec. Este o chestiune de compromisuri.

Rău: conectivitate la servicii fără server

Când folosim „lumea nouă” din Cloud, paradigma fără server , lucrurile nu sunt atât de frumoase cu Cloud Run , Funcții Cloud și App Engine .

Într-adevăr, atunci când implementați pe platforme fără server , prin definiție, nu nu trebuie să gestionați serverele și, astfel, serverele nu sunt în VPC . Și, prin urmare, nu este posibil, din cutie, să ajungeți la IP-ul privat SQL SQL conectat la VPC-ul proiectului dvs.

Dacă intrați în Cloud Run , Funcții Cloud și App Engine , puteți găsi cum să vă conectați instanța Cloud SQL la serviciul fără server datorită unei funcții încorporate:

Adăugați numele conexiunii instanței Cloud SQL la configurația dvs. și automat se creează un tunel cu pornirea instanței.

În realitate, este o conexiune deschisă de Cloud SQL proxy binar în modul socket Unix . Dar această soluție funcționează numai dacă instanța Cloud SQL are un IP public .
În cazul numai IP privat și chiar dacă un modul de conexiune IP privat există cu proxy Cloud SQL , acesta nu funcționează!

Conectați serviciile fără server la IP-ul privat SQL SQL

Sperăm că există o soluție. Puteți faceți clic pe private IP tab în tutorialele conexiunii Cloud SQL pentru aceasta ( exemplu pentru funcțiile cloud ).

În rezumat, trebuie să:

  • Creați un conector VPC fără server , în aceeași regiune ca serviciul dvs. fără server. Și, desigur, conectat la același VPC ca instanța dvs. Cloud SQL.
    Rețineți că astăzi, toate regiunile sunt acceptate de conector VPC fără server, dar nu a fost cazul pentru o vreme.
  • Implementați serviciul fără server cu acest conector VPC , acceptat de Cloud Run , Cloud Functions și App Engine
  • În aplicația dvs., utilizați IP-ul privat SQL SQL (în loc de conexiunea socket Unix)

Această soluție funcționează, dar introduce un element de rețea nou , un cost suplimentar și un posibil nou punct de eșec în lanțul de conectivitate.

Asta este „rău” !!

Urâtul: conectivitate la mediu local

Când doriți să interogați baza de date , cândva în producție, prin IDE-ul preferat al bazei de date instalat pe computer , trebuie să vă conectați mediul local la cloud Instanță SQL și, prin urmare, prin intermediul IP-ului privat.

Deoarece instanța Cloud SQL nu are un IP public, nu îl puteți accesa direct din internetul (computerul dvs.) și proxy Cloud SQL, de asemenea, nu poate . Soluția aici este să să creați un host bastion : o punte virtuală între lumea exterioară (IP public) și lumea interioară (IP privat).

Pentru aceasta, creați o mică instanță Compute Engine , un f1-micro de exemplu ( foarte accesibil, mai puțin de 5 USD pe lună), pentru a realiza acest lucru.

Cerința echipei de securitate : Toate VM nu trebuie să aibă un IP public. Desigur, regulile firewall-ului 0.0.0.0/0 nu sunt permise, în special pe portul 22 (ssh)

Gazda bastion fără IP public

Noi constrângeri de tratat ! Dar este consecvent: dacă închizi ușa, este pentru a lăsa fereastra să se deschidă !!
Așadar, nicio problemă, Google Cloud oferă o soluție excelentă și ușoară pentru acest lucru: Proxy Identity-Aware (IAP)

Cu IAP, trebuie doar să acordați un Google Cloud IAP Interval IP

35.235.240.0/20 pentru a accesa Compute Engine pe portul 22 din regulile firewall-ului . Și astfel, nu este necesar să deschideți 0.0.0.0/0 (întregul internet) pentru ajungeți la portul Compute Engine ssh!

Apoi, utilizați SDK gcloud pentru a vă conecta la hostul dvs. bastion Compute Instanță motor
gcloud compute ssh --zone=
Și se întâmplă magia! SDK gcloud detectează automat lipsa de IP public instance și deschide automat un tunel IAP pentru a conecta în SSH instanța . Este invizibil pentru utilizator!

Acreditarea (aici contul de utilizator, dar poate fi un cont de serviciu) trebuie să aibă permisiunea suficientă pentru a crea un tunel IAP . Rolurile sunt roles / iap.tunnelResourceAccessor pentru a crea tunelul și roles / compute.instanceAdmin.v1 pentru a accesa VM

Acum, sunteți conectat la gazda bastion, dar nu ați conectat încă instanța Cloud SQL

Tunelare IAP, redirecționare port SSL și Cloud SQL proxy

Și acolo începe partea „urât” . Avem 2 lucruri de realizat

  1. Conectați gazda bastion la instanța Cloud SQL prin IP-ul privat
  2. Redirecționați cererea de conectare la baza de date a mediului local către gazda bastionului la ajunge la instanța Cloud SQL prin tunelul Cloud SQL Proxy

1. Conectivitate instanță Cloud SQL de la gazda bastion
Pentru aceasta, avem nevoie de proxy Cloud SQL pentru a deschide un tunel între gazda bastion și instanța Cloud SQL.

Primul număr: Pentru că tu nu aveți un IP public, nu puteți ajunge la internet!
Puteți alege să creați un Cloud NAT pe gama IP a instanței de calcul a gazdei bastion. Dar, cel mai simplu mod este să să-l descărcați în mediul dvs. local și apoi să copiați-l pe gazda bastion . Pentru a realiza acest lucru, puteți utiliza această comandă.
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
Deoarece puteți deschide o conexiune SSH prin IAP, puteți utiliza și scp protocol (copiere ssh) la copiere fișiere prin IAP! Magic !!

Excelent, acum aveți binarul pe instanța Compute Engine a gazdei bastion și doresc să testăm dacă conexiunea funcționează . Puteți rula comenzile

#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

Puteți găsi connection_name în pagina instanței Cloud SQL

Al doilea număr: nu funcționează! Și există multe motive!

  • Dacă ți-ai creat gazda bastion Compute Engine cu parametrii impliciți , în special partea de domeniu API, nu aveți suficient domeniu pentru a ajunge la API-urile Cloud SQL.
    Pentru a rezolva acest lucru, trebuie să opriți calculatorul dvs. , să-l editați și personalizați domeniile
  • Când se creează tunelul Cloud SQL, permisiunile IAM ale acreditărilor curente (aici se verifică acreditările Compute Engine ) sunt verificate . Contul de serviciu Compute Engine nu a putut avea suficiente permisiuni.
    Pentru a rezolva acest lucru, asigurați-vă că rolurile minime sunt acordate pe contul de serviciu: Cloud SQL client, Cloud SQL editor sau Cloud SQL admin
    Contul de serviciu implicit Compute Engine are roluri / editor rol. Prea larg, dar suficient pentru cazul nostru de utilizare.
  • În cele din urmă, în mod implicit, când solicitați un API Google Cloud, este solicitat DNS-ul public . Apare atunci când proxy-ul Cloud SQL solicită API-ul Cloud SQL sau serviciul IAM când este creat tunelul. Și, deoarece gazda de bastion Compute Engine nu are un IP public, poate ajunge la internet și la googleapis.com DNS public.
    Pentru a rezolva acest lucru, aveți 2 soluții.Fie configurați un Cloud NAT așa cum s-a propus anterior, sau utilizați o caracteristică complicată a Google Cloud VPC: Permiteți subrețele actuale pentru a apela

    googleapis.com DNS . Pentru a realiza acest lucru, accesați VPC-ul dvs., selectați subrețeaua corectă și editați-o. Apoi selectați On pentru butonul radio Acces Google privat și salvați.

Excelent !! Acum gazda bastion Compute Engine poate utiliza proxy Cloud SQL pentru a deschide un tunel de la portul local 3306 la instanța Cloud SQL, prin IP-ul privat.

2. Redirecționați traficul de mediu local către instanța Cloud SQL
Pentru a realiza acest lucru, nu vom folosi gcloud ssh caracteristică încorporată, dar o soluție alternativă . În plus față de o conexiune directă cu ssh pentru a calcula instanțele, SDK gcloud permite crearea unui tunel pe orice porturi .

Deci, haideți să creăm un tunel pe portul 22 al gazdei bastionului Instanță de calculare a motorului și definiți un port local arbitrar (aici 4226)

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

Excelent, un tunel este deschideți și putem să îl folosim pentru a conecta instanța bastion Compute Engine în ssh.

Lăsați tunelul să se deschidă și să ruleze într-un terminal și deschideți una nouă.

Acum, să ne conectăm în ssh la . Într-o comandă, veți realiza mai multe lucruri obligatorii pentru a stabili conexiunea :

  • Creați un redirecționare de port din mediul dvs. local către gazda bastion motor de calcul
    -L 3306:localhost:3306
    „portul meu local 3306 este redirecționat pe VM țintă (aici gazda bastion) pentru a ajunge la port 3306 deschis pe localhost (adică VM țintă) ”
  • Reutilizați cheia ssh creată automat de Google în timpul primului ssh conexiune la motorul de calcul al gazdei bastion (sau scp). Această cheie privată este stocată în directorul home al utilizatorului curent ~/.ssh
    -i ~/.ssh/google_compute_engine
  • Deschideți un ssh conexiune prin tunelul IAP existent pe mediul localhost și redirecționarea ssh trafic de la portul local 4226
    -p 4226 localhost
  • Când este conectat la motorul de calcul al gazdei bastion, doriți să rulați proxy-ul Cloud SQL pentru a crea tunelul către instanța Cloud SQL , pe portul 3306. Pentru aceasta, rulați comanda dorită pe telecomandă (gazda bastion) după un --
    -- /tmp/cloud_sql_proxy instances==tcp:3306

Și puneți toate acestea laolaltă

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

Acum, aveți! Utilizați IDE-ul preferat al bazei de date, conectați-l pe localhost:3306 și conectați-vă la baza de date cu utilizatorul / parola.

Uau !! Toate acestea pentru a putea respecta un model de securitate ! Aici o schemă a ceea ce am construit

Acesta este „urât” !!

Efect secundar suplimentar

Utilizarea Cloud SQL cu un IP privat adaugă doar avertismente . Într-adevăr, se creează o peering între VPC-ul proiectului și rețeaua Cloud SQL (administrat de Google Cloud).
Și peeringul vine cu 2 limitări:

Acest ultim punct este foarte important și poate fi un blocant dacă doriți să accesați instanța bazei de date dintr-un alt proiect . Într-adevăr, din VPC-ul unui alt proiect, ați dori să creați un peering cu proiectul care are ca instanță Cloud SQL să ajungă, prin IP-ul privat.

Dar, din cauza limitării tranzitivității, puteți t: IP-ul privat Cloud SQL nu este văzut din VPC-ul celuilalt proiect.
Soluția de rezolvare aici este să să creeze un VPN pentru a identifica cele 2 VPC-uri div>.
Asta e euh … „cel mai urât” ??

Un efect secundar suplimentar este incapacitatea pentru aplicațiile App Script de a utiliza instanțe Cloud SQL dacă nu este definit un IP public.

Modelul de securitate „inteligent” contează

Problema de securitate și modelele existente pentru bazele de date funcționează excelent … în lumea moștenită.
Acum, cu proxy Cloud SQL și Cloud SQL, există straturi de securitate suplimentare și anulează vechile tipare.

Care este problema cu un IP public dacă nu sunt permise pentru a se conecta la acesta ?

Este definiția unei reguli firewall în lumea veche, nu este nu-i asa? Refuzați toate IP-urile pentru a accesa acest interval / IP unde sunt găzduite bazele mele de date

Preocuparea echipei de securitate : Cum să vă asigurați că nu este permisă o gamă IP?

Această întrebare este legitimă și de aceea puteți aplică o politică organizațională ( Restricționează Rețele autorizate pe instanțe Cloud SQL ) pentru a împiedica adăugarea intervalului IP public pe instanțele Cloud SQL , iar aceasta, la nivelul întregii companii.

În cele din urmă, permițând o adresă IP publică în instanțele Cloud SQL evită o mulțime de soluții și modele ciudate de tratat și fără scăderea nivelului de securitate.
Mai mult, tunelul creat este criptat și asigură un nivel ridicat de securitate și confidențialitate.

Norul schimbă paradigmele (vezi Dincolo de Corp ) și modelul de securitate trebuie actualizat pentru a le respecta.
Modelele de securitate inteligente sunt mai bune decât modelele de securitate vechi!

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *