Cloud SQL tylko z prywatnym adresem IP: Dobry, zły i brzydki

Dane to nowa kopalnia złota wszystkich firm, a ten skarb musi być bezpiecznym i chronionym . Dlatego przez wiele lat powszechną dobrą praktyką każdego administratora baz danych jest usuwanie całego publicznego dostępu do bazy danych , zwłaszcza publicznego adresu IP i do przyznaj dostęp tylko z prywatnego adresu IP.
Ta „złota” reguła jest egzekwowana przez wszystkie zespoły ds. bezpieczeństwa i wymagają tego samego wzorca dla dowolnego wdrożenia w chmurze.

Usługa Cloud SQL , usługa zarządzanej bazy danych w Google Cloud, umożliwia:

Dzięki tym funkcjom możesz egzekwować wymagania zespołu ds. bezpieczeństwa .

Ale czy jest to problem, gdy pracujemy da nie mieć publicznego adresu IP w instancjach Cloud SQL?

Sprawdźmy to na 3 przykładach użycia:

  1. Compute Engine łączność
  2. Usługi bezserwerowe łączność
  3. Środowisko lokalne łączność

Dane binarne serwera proxy Cloud SQL

Zanim zagłębię się w przypadki użycia, chciałbym skupić się na głównej funkcji Cloud SQL proxy

  • Ten plik binarny otwiera bezpieczny i kompleksowo szyfrowany tunel . Podsumowując, nawet jeśli Twoja baza danych nie ma certyfikatu SSL, dane są szyfrowane podczas przesyłania.
  • Przed otwarciem tunelu plik binarny sprawdza, czy IAM Service API, jeśli bieżące dane logowania mają uprawnienia dostępu do instancji Cloud SQL . Jest to dodatkowa warstwa bezpieczeństwa, oprócz standardowego uwierzytelniania bazy danych przez użytkownika / hasło.
  • Tunel można otworzyć na porcie lokalnym (tryb połączenia TCP) lub do gniazda Unix (niemożliwe w Środowisko Windows)

Zaleta: łączność Compute Engine

Ponieważ ten „wzorzec bezpieczeństwa prywatnego adresu IP” został zbudowany w przypadku starszej architektury (tj. lokalnej maszyny wirtualnej i sieci prywatnej) ograniczenie idealnie pasuje do świata IaaS (tj. Compute Engine + VPC).
Wspominam o Compute Engine, ale dotyczy to również wszystkich usług korzystających z instancji Compute Engine: Dataflow, Dataproc, GKE,…

  • Wdróż maszynę wirtualną w ten sam VPC, co prywatny adres IP instancji Cloud SQL.
  • Użyj prywatnego adresu IP instancji Cloud SQL, aby uzyskać do niego dostęp z aplikacji wdrożonej w Compute Engine.
  • Otwórz wymagane reguły zapory, jeśli potrzebne.

To jest „dobrze” !!

Uwaga: użycie serwera proxy Cloud SQL w tym przypadku można omówić. Dodaje dodatkową warstwę bezpieczeństwa, sprawdzając autoryzację pod kątem usług IAM i szyfrowanej komunikacji, ale także dodaje dodatkowe opóźnienie i potencjalny punkt awarii. To kwestia kompromisów.

Złe: łączność usług bezserwerowych

Kiedy używamy „nowego świata” chmury, paradygmatu bezserwerowego , rzeczy nie są takie przyjemne z Cloud Run , Funkcje chmury i App Engine .

Rzeczywiście, podczas wdrażania na platformach bezserwerowych z definicji nie musisz zarządzać serwerami , a zatem serwerów nie ma w Twoim VPC . Dlatego nie jest możliwe po wyjęciu z pudełka, aby uzyskać dostęp do prywatnego adresu IP Cloud SQL połączonego z VPC Twojego projektu.

Jeśli zagłębisz się w Cloud Run , Cloud Functions i App Engine , znajdziesz , jak połączyć instancję Cloud SQL z usługą bezserwerową dzięki wbudowanej funkcji:

Dodaj nazwę połączenia instancji Cloud SQL do swojej konfiguracji, a tunel zostanie utworzony automatycznie wraz z uruchomieniem instancji.

W rzeczywistości jest to połączenie otwarte przez serwer proxy Cloud SQL w formacie binarnym w trybie gniazda unixowego . Ale to rozwiązanie działa tylko wtedy, gdy instancja Cloud SQL ma publiczny adres IP .
W przypadku tylko prywatnego adresu IP , a nawet jeśli tryb prywatnego połączenia IP istnieje z proxy Cloud SQL , nie działa!

Połącz usługi bezserwerowe z prywatnym adresem IP Cloud SQL

Mamy nadzieję, że istnieje rozwiązanie. Możesz kliknąć private IP w samouczkach dotyczących połączeń z Cloud SQL w tym celu ( przykład dotyczący funkcji chmury ).

Podsumowując, musisz:

  • Utworzyć bezserwerowy łącznik VPC , w tym samym regionie co usługa bezserwerowa. I oczywiście połączone z tym samym VPC, co Twoja instancja Cloud SQL.
    Pamiętaj, że obecnie wszystkie regiony są obsługiwane przez bezserwerowy łącznik VPC, ale przez jakiś czas tak nie było.
  • Wdróż usługę bezserwerową za pomocą tego łącznika VPC , obsługiwanego przez Cloud Run , Cloud Functions i App Engine
  • W swojej aplikacji użyj prywatnego adresu IP Cloud SQL (zamiast połączenia przez gniazdo Unix)

To rozwiązanie działa, ale wprowadza nowy element sieci , dodatkowy koszt i możliwy nowy punkt awarii w łańcuchu łączności.

To jest „zły” !!

Ugly: Łączność w środowisku lokalnym

Gdy chcesz wysłać zapytanie do bazy danych , gdzieś w produkcji, za pośrednictwem preferowanego środowiska IDE zainstalowanego na komputerze , musisz połączyć swoje środowisko lokalne z chmurą Instancja SQL, a więc za pośrednictwem prywatnego adresu IP.

Ponieważ instancja Cloud SQL nie ma publicznego adresu IP, nie możesz się do niej połączyć bezpośrednio z internet (Twój komputer) i Cloud SQL proxy również nie może . Rozwiązaniem jest tutaj utworzenie host bastionu : maszyna wirtualna mostu między światem zewnętrznym (publiczny adres IP) a światem wewnętrznym (prywatny adres IP).

W tym celu utwórz małą instancję Compute Engine , na przykład f1-micro ( bardzo przystępne cenowo, poniżej 5 USD miesięcznie), aby to osiągnąć.

Wymóg zespołu ds. bezpieczeństwa : Wszystkie maszyny wirtualne nie mogą mieć publicznego adresu IP. Oczywiście reguły firewalla 0.0.0.0/0 nie są dozwolone, szczególnie na porcie 22 (ssh)

Host bastionowy bez publicznego adresu IP

Nowe ograniczenia do rozwiązania ! Ale jest to spójne: jeśli zamkniesz drzwi, to po to, by pozwolić otworzyć okno !!
Więc nie ma problemu, Google Cloud oferuje świetne i łatwe rozwiązanie: Identity-Aware Proxy (IAP)

W przypadku zakupów w aplikacji wystarczy przyznać Google Cloud IAP Zakres adresów IP

35.235.240.0/20 umożliwiający dostęp do Compute Engine przez port 22 w regułach zapory sieciowej . Dlatego nie trzeba otwierać 0.0.0.0/0 (całego internetu), aby dotrzeć do portu Compute Engine ssh!

Następnie użyj gcloud SDK, aby połączyć się z hostem bastionu Compute Instancja silnika
gcloud compute ssh --zone=
I dzieje się magia! Zestaw gcloud SDK automatycznie wykrywa brak publicznego adresu IP Compute Engine instancji i otwiera automatycznie tunel IAP, aby połączyć się przez SSH z instancją . Jest niewidoczne dla użytkownika!

Poświadczenie (tutaj konto użytkownika, ale może to być konto usługi) musi mieć wystarczające uprawnienia, aby utworzyć tunel IAP . Role to roles / iap.tunnelResourceAccessor do utworzenia tunelu i roles / compute.instanceAdmin.v1 do dostępu do maszyny wirtualnej

Teraz jesteś połączono z hostem bastionu, ale jeszcze nie połączono instancji Cloud SQL …

Tunelowanie IAP, przekierowanie portu SSL i Serwer proxy Cloud SQL

I tam zaczyna się „brzydki” . Mamy dwie rzeczy do osiągnięcia

  1. Połącz host bastionu z instancją Cloud SQL przez prywatny adres IP
  2. Przekaż dalej żądanie połączenia z lokalną bazą danych środowiska do hosta bastionu do dotrzeć do instancji Cloud SQL przez tunel Cloud SQL Proxy

1. Łączność instancji Cloud SQL z hosta bastionu
W tym celu potrzebujemy serwera proxy Cloud SQL do otwarcia tunelu między hostem bastionu a instancją Cloud SQL.

Pierwsza sprawa: Ponieważ ty nie masz publicznego adresu IP, nie możesz połączyć się z Internetem!
Możesz wybrać utworzyć Cloud NAT w zakresie adresów IP instancji obliczeniowej hosta bastionu. Ale najłatwiej jest pobrać go w swoim środowisku lokalnym , a następnie skopiuj go na host bastionu . Aby to osiągnąć, możesz użyć tego polecenia.
gcloud compute scp /local/path/to/cloud_sql_proxy :/tmp
Ponieważ możesz otworzyć połączenie SSH przez IAP, możesz też użyć scp protokół (ssh copy) do kopiuj pliki przez IAP! Magic !!

Świetnie, teraz masz plik binarny w instancji Compute Engine na hoście bastionu i chcesz sprawdzić, czy połączenie działa . Możesz uruchomić polecenia

#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

Możesz znaleźć connection_name na stronie Twojej instancji Cloud SQL

Drugi problem: to nie działa! Jest wiele powodów!

  • Jeśli utworzyłeś hosta bastionu Compute Engine z domyślnymi parametrami , zwłaszcza część dotycząca zakresu API, nie masz wystarczającego zakresu, aby dotrzeć do interfejsów API Cloud SQL.
    Aby rozwiązać ten problem, musisz zatrzymać silnik Compute Engine , edytować go i dostosuj zakresy
  • Po utworzeniu tunelu Cloud SQL uprawnienia IAM dotyczące bieżących poświadczeń (tutaj dane logowania Compute Engine ) są sprawdzane . Konto usługi Compute Engine nie mogło mieć wystarczających uprawnień.
    Aby rozwiązać ten problem, upewnij się, że minimalne role są przyznane na koncie usługi: Cloud SQL client, Cloud SQL editor lub Cloud SQL admin
    Domyślne konto usługi Compute Engine ma role / redaktora rola. Zbyt szeroki, ale wystarczający dla naszego przypadku użycia.
  • Wreszcie, domyślnie, gdy żądasz interfejsu API Google Cloud, żądany jest publiczny DNS . Występuje, gdy serwer proxy Cloud SQL wysyła żądanie do interfejsu API Cloud SQL lub usługi IAM podczas tworzenia tunelu. Ponieważ host bastionu Compute Engine nie ma publicznego adresu IP, może połączyć się z Internetem i googleapis.com publiczny DNS.
    Aby rozwiązać ten problem, masz dwa rozwiązania. skonfiguruj Cloud NAT zgodnie z wcześniejszą propozycją lub użyj skomplikowanej funkcji Google Cloud VPC: Zezwalaj na obecną podsieć hosta bastionu Compute Engine aby zadzwonić do prywatnego

    googleapis.com DNS . Aby to osiągnąć, przejdź do swojego VPC, wybierz odpowiednią podsieć i edytuj ją. Następnie wybierz On jako przycisk opcji Prywatny dostęp do Google i zapisz.

Świetnie !! Teraz host bastionu Compute Engine może używać serwera proxy Cloud SQL do otwierania tunelu z portu lokalnego 3306 do instancji Cloud SQL, przez prywatny adres IP.

2. Przekazywanie ruchu ze środowiska lokalnego do instancji Cloud SQL
Aby to osiągnąć, nie użyjemy gcloud ssh funkcja wbudowana, ale rozwiązanie alternatywne . Oprócz bezpośredniego połączenia z ssh z instancjami obliczeniowymi, gcloud SDK umożliwia tworzenie tunelu na dowolnych portach .

Zatem utwórzmy tunel na porcie 22 hosta bastionu Compute Engine i zdefiniuj dowolny port lokalny (tutaj 4226)

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

Świetnie, tunel jest open i możemy go użyć do połączenia instancji Compute Engine hosta bastionu w ssh.

Pozwól tunelowi otworzyć się i uruchomić w terminalu i otwórz nowy.

Teraz połączmy się w ssh do niego . Jednym poleceniem osiągniesz kilka wymaganych rzeczy do ustanowienia połączenia :

  • Utwórz przekierowanie portu ze środowiska lokalnego do hosta bastionu silnik obliczeniowy
    -L 3306:localhost:3306
    „mój port lokalny 3306 jest przekazywany na docelową maszynę wirtualną (tutaj host bastionu), aby dotrzeć do portu 3306 otwarty na localhost (tj. docelowej maszynie wirtualnej) ”
  • Użyj ponownie utworzonego klucza ssh automatycznie przez Google podczas pierwszego ssh połączenie z hostem bastionu Compute Engine (lub scp). Ten klucz prywatny jest przechowywany w katalogu home bieżącego użytkownika ~/.ssh
    -i ~/.ssh/google_compute_engine
  • Otwórz ssh połączenie przez istniejący tunel IAP w środowisku localhost i przekazywanie ssh ruch z portu lokalnego 4226
    -p 4226 localhost
  • Po podłączeniu do hosta bastionu Compute Engine, chcesz uruchomić serwer proxy Cloud SQL w celu utworzenia tunelu do instancji Cloud SQL na porcie 3306. W tym celu uruchom żądane polecenie na pilocie (hoście bastionu) po --
    -- /tmp/cloud_sql_proxy instances==tcp:3306

I zbierz to wszystko razem

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

Teraz masz to! Użyj swojego ulubionego IDE bazy danych, połącz go na localhost:3306 i zaloguj się do bazy danych za pomocą użytkownika / hasła.

Wow !! Wszystko po to, aby móc zachować zgodność ze wzorcem bezpieczeństwa ! Oto schemat tego, co stworzyliśmy

To jest „brzydki” !!

Dodatkowy efekt uboczny

Używanie Cloud SQL z prywatnym adresem IP dodaje tylko zastrzeżenia . Rzeczywiście, między VPC projektu a siecią Cloud SQL (zarządzaną przez Google Cloud) tworzona jest .
I peering ma 2 ograniczenia:

Ten ostatni punkt jest bardzo ważny i może blokować, jeśli chcesz uzyskać dostęp do instancji bazy danych z innego projektu . Rzeczywiście, z VPC innego projektu chciałbyś utworzyć komunikację równorzędną z projektem, do którego ma dotrzeć instancja Cloud SQL, za pośrednictwem prywatnego adresu IP.

Jednak ze względu na ograniczenie przechodniości możesz t: prywatny adres IP Cloud SQL nie jest widoczny z VPC innego projektu.
Sposób obejścia tego problemu polega na utworzeniu sieci VPN do komunikacji równorzędnej z 2 VPC .
To euh… „brzydszy” ??

Dodatkowym efektem ubocznym jest niezdolność aplikacji App Script do korzystania z wystąpień Cloud SQL, jeśli nie zdefiniowano publicznego adresu IP.

„Inteligentny” wzorzec zabezpieczeń ma znaczenie

Kwestia bezpieczeństwa i istniejące wzorce dla baz danych działają świetnie… w starym świecie.
Teraz dzięki Cloud SQL i serwerowi proxy Cloud SQL istnieją dodatkowe warstwy zabezpieczeń, które unieważniają stare wzorce.

Jaki jest problem z publicznym adresem IP, jeśli żadne zakresy adresów IP nie są dozwolone , aby się z nim połączyć ?

To definicja reguły zapory sieciowej w starym świecie, czyż nie t to? Odmów wszystkim adresom IP, aby uzyskać dostęp do tego zakresu / adresu IP, w którym są hostowane moje bazy danych

Problem zespołu bezpieczeństwa : Jak się upewnić, że żaden zakres adresów IP nie jest dozwolony?

To pytanie jest słuszne i dlatego możesz egzekwuj zasady organizacji ( Ograniczaj Autoryzowane sieci w instancjach Cloud SQL ), aby zapobiec dodawaniu publicznego zakresu adresów IP w instancjach Cloud SQL , a to w całej firmie.

Ostatecznie zezwolenie na publiczny adres IP w instancjach Cloud SQL pozwala uniknąć wielu obejść i dziwne projekty , z którymi można sobie poradzić, i bez obniżania poziomu bezpieczeństwa.
Ponadto tworzony tunel jest szyfrowany i zapewnia wysoki poziom bezpieczeństwa i poufność.

Chmura zmienia paradygmaty (patrz Beyond Corp ) i wzorzec bezpieczeństwa musi zostać zaktualizowany, aby był z nimi zgodny.
Inteligentne wzorce zabezpieczeń są lepsze niż starsze wzorce zabezpieczeń!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *