Zabezpieczanie ruchu przychodzącego w Cloud Run

1. Omówienie

W tym module dowiesz się, jak ograniczyć dostęp do usługi Cloud Run i zezwalać jedynie na żądania pochodzące z zadania działającego lokalnie lub w sieci VPC Twojego projektu. Możesz użyć 2 warstw kontroli dostępu: ustawień ruchu przychodzącego oraz zasad Identity and Access Management (IAM).

5aed47d10595c878.png

Ustawienia ruchu przychodzącego

Ustawienia ruchu przychodzącego pozwalają filtrować żądania na podstawie ich pochodzenia sieciowego (wewnętrznego lub zewnętrznego). Domyślnie przekazywane są wszystkie żądania, również te z publicznego internetu.

Zasady dotyczące uprawnień

Zasady uprawnień pozwalają filtrować żądania na podstawie tożsamości nadawcy i są zwykle używane do uwierzytelniania żądań między usługami.

Z tego modułu dowiesz się, jak i kiedy używać ustawień ruchu przychodzącego.

Hosty lokalne łączą się przez VPC

W tym module przeprowadzimy symulację lokalnego zbioru zadań. Aby połączyć hosta lokalnego z Cloud Run, musisz skonfigurować prywatny dostęp do Google dla hostów lokalnych. Obejmuje to skonfigurowanie bramy Cloud VPN w sieci VPC, jak pokazano poniżej.

31611f6a2f12fd0c.png

Symulowanie lokalnego zadania z użyciem serwera przesiadkowego w VPC

W tym module symulujesz wysyłanie żądań z hosta lokalnego przez wysyłanie żądań z maszyny wirtualnej Compute Engine w VPC, jak pokazano tutaj.

aebf22740c7a84f0.png

Maszyna wirtualna Compute Engine używana jako serwer przesiadkowy ma to samo źródło sieci co brama sieci Cloud VPN, dlatego możesz z niej korzystać do symulowania wysyłania żądań z lokalnego zbioru zadań.

2. Konfiguracja i wymagania

Samodzielne konfigurowanie środowiska

  1. Zaloguj się w konsoli Google Cloud i utwórz nowy projekt lub wykorzystaj już istniejący. Jeśli nie masz jeszcze konta Gmail ani Google Workspace, musisz je utworzyć.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu jest wyświetlaną nazwą uczestników tego projektu. To ciąg znaków, który nie jest używany przez interfejsy API Google. W każdej chwili możesz ją zmienić.
  • Identyfikator projektu jest unikalny we wszystkich projektach Google Cloud i nie można go zmienić (po jego ustawieniu nie można go zmienić). Cloud Console automatycznie wygeneruje unikalny ciąg znaków. zwykle nieważne, co ona jest. W większości ćwiczeń z programowania konieczne jest odwołanie się do identyfikatora projektu (zwykle nazywa się on PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować kolejny losowy. Możesz też spróbować własnych sił i sprawdzić, czy jest dostępna. Potem nie będzie można go zmienić. Pozostanie ono przez czas trwania projektu.
  • Dostępna jest trzecia wartość, numer projektu, z którego korzystają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć płatności w Cloud Console, aby korzystać z zasobów Cloud/interfejsów API. Ukończenie tego ćwiczenia z programowania nie powinno kosztować zbyt wiele. Aby wyłączyć zasoby, aby nie naliczać opłat po zakończeniu tego samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z programu bezpłatnego okresu próbnego o wartości 300 USD.

Konfiguracja środowiska

  1. Ustaw zmienną środowiskową na identyfikator projektu, aby móc go używać w późniejszych poleceniach:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. Włącz interfejsy API wymagane do wykonania tego modułu.
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. Skopiuj repozytorium przykładowej aplikacji i przejdź do katalogu
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. Ustawianie domyślnego regionu i strefy dla Compute Engine i Cloud Run
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. Wdrażanie usługi

Najpierw należy wdrożyć usługę i pozostawić ją publicznie dostępną. Gdy potwierdzisz, że możesz wysyłać żądania z przeglądarki, zablokujemy usługę i zezwolimy wyłącznie na żądania pochodzące tylko z wewnętrznych źródeł sieci.

Po uruchomieniu tego polecenia wykonaj te czynności:

  • Lokalizacja kodu źródłowego (...): sprawdź, czy jesteś w katalogu usług rejestracji partnera i naciśnij Enter, aby zaakceptować wartość domyślną.
  • Nazwa usługi (partner-registration-service): naciśnij Enter, aby zaakceptować wartość domyślną.
  • Zezwolić na nieuwierzytelnione wywołania [partner-signup-service] (y/N)? T
gcloud run deploy 

Po zakończeniu tego polecenia pojawi się adres URL Twojej usługi Cloud Run. Dane wyjściowe będą podobne do tych poniżej:

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

Otwórz adres URL usługi w przeglądarce. Powinny się wyświetlić te dane wyjściowe:

Partner registration service: RUNNING

Skonfiguruj usługę w taki sposób, aby akceptowała tylko żądania wewnętrzne

Teraz użyjesz ustawień ruchu przychodzącego usługi Cloud Run, aby zezwolić tylko na żądania ze źródeł wewnętrznych. Źródła wewnętrzne obejmują zasoby w sieciach VPC, które znajdują się w tym samym projekcie (lub w granicach Ustawień usługi VPC) co usługa Cloud Run, dzięki czemu doskonale sprawdza się w naszym przypadku.

Poza tym żądania z innych usług Google Cloud są uznawane za wewnętrzne, nawet jeśli nie należą do VPC. Te usługi to na przykład Pub/Sub i Workflows.

Żądania z tych źródeł pozostają w sieci Google nawet wtedy, gdy uzyskują dostęp do usługi pod adresem URL run.app, a dostęp publiczny jest zabroniony.

Zaktualizuj usługę tak, aby akceptowała tylko żądania wewnętrzne:

gcloud run services update partner-registration-service --ingress=internal

Jeśli ponownie otworzysz adres URL usługi, zobaczysz komunikat „Error: Forbidden - Access is forbidden” (Błąd: brak dostępu – dostęp jest zabroniony).

Twoja przeglądarka wysyła żądanie z zewnętrznego źródła sieci, a nie z wewnętrznego do projektu Google Cloud, dlatego jest to dokładnie to, czego oczekujesz. Twoja usługa jest teraz bezpieczniejsza.

4. Tworzenie maszyny wirtualnej Compute Engine jako serwera przesiadkowego

Następnym krokiem jest symulacja żądań z serwera lokalnego przez bramę Cloud VPN przez utworzenie w VPC instancji Compute Engine, która będzie używana jako serwer przesiadkowy:

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

Wynik tego polecenia powinien być podobny do tego:

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

Wyślij żądanie z instancji Compute Engine do usługi

Teraz otworzysz terminal w maszynie wirtualnej i wyślij żądanie bezpośrednio z maszyny w sieci VPC.

Jeśli podane niżej polecenie poprosi Cię o skonfigurowanie SSH w Cloud Shell, postępuj zgodnie z instrukcjami:

gcloud compute ssh jump-server

Uzyskaj adres URL usługi Cloud Run za pomocą tego polecenia:

gcloud run services describe partner-registration-service --region us-central1

Pierwszych kilka wierszy danych wyjściowych powinno wyglądać tak:

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

Teraz skopiuj adres URL i wyślij żądanie z instancji Compute Engine za pomocą narzędzia curl. To żądanie powinno się udać, ponieważ maszyna wirtualna działa w sieci VPC projektu – jest to źródło wewnętrzne.

export SERVICE_URL=https://

curl ${SERVICE_URL}

Dane wyjściowe powinny wyglądać tak:

Partner registration service: RUNNING

5. Co z kontrolą dostępu na podstawie uprawnień?

W tym module pokazaliśmy, jak i kiedy używać ustawień ruchu przychodzącego. Ustawienia ruchu przychodzącego są świetnym pierwszym krokiem, jeśli łączysz zadanie lokalne z Cloud Run.

Wdrożenie kontroli dostępu opartej na uprawnieniach wymaga większego nakładu pracy, zwłaszcza jeśli wywołujesz z hosta lokalnego:

  • Uprawnienia wymagają zarządzania długoterminowymi danymi logowania do konta usługi na hoście
  • Uprawnienia wymagają zmian w kodzie, aby podpisywać żądania przy użyciu danych logowania konta usługi.

Google zaleca wielowarstwową metodę kontroli dostępu. Używanie ustawień ruchu przychodzącego do ograniczenia dostępu tylko do hostów wewnętrznych to świetny pierwszy krok, ale nie poprzestawaj na tym.

6. Gratulacje!

Gratulacje. Udało Ci się ukończyć ćwiczenia z programowania.

Co dalej:

Poznaj inne ćwiczenia z programowania Cymbal Eats:

Czyszczenie danych

Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym samouczku, możesz usunąć projekt zawierający te zasoby lub zachować projekt i usunąć poszczególne zasoby.

Usuwam projekt

Najprostszym sposobem na uniknięcie płatności jest usunięcie projektu utworzonego na potrzeby samouczka.

Przydatne materiały

Oto dodatkowe zasoby, które pomogą Ci dowiedzieć się więcej o 2 warstwach kontroli dostępu w Cloud Run.