Bezpieczna aplikacja bezserwerowa z serwerem proxy identyfikującym tożsamość (IAP)

1. Omówienie

W tym laboratorium wdrożysz portal dla pracowników, który umożliwia im wyświetlanie, aktualizowanie i usuwanie zamówień z aplikacji Cymbal Eats. Aby zabezpieczyć dostęp do portalu bez korzystania z sieci VPN, użyjesz Identity Aware Proxy (IAP). IAP upraszcza wdrażanie modelu dostępu „zero zaufania” i zajmuje mniej czasu niż VPN w przypadku pracowników zdalnych zarówno w środowiskach lokalnych, jak i chmurowych, z jednym punktem kontroli umożliwiającym zarządzanie dostępem do aplikacji.

94b06525c85408ad.png

Co to jest Identity-Aware Proxy?

Serwer proxy identyfikujący tożsamość (IAP) to usługa Google Cloud, która przechwytuje wysyłane do aplikacji żądania, uwierzytelnia użytkownika, przesyłając żądania do usługi tożsamości Google, i przekazuje do aplikacji tylko te z nich, które pochodzą od autoryzowanego użytkownika. Dodatkowo może modyfikować nagłówki żądania, dodając do nich informacje o uwierzytelnionym użytkowniku.

Czego się nauczysz

  • Konfigurowanie bezserwerowej grupy punktów końcowych sieci (NEG)
  • Jak skonfigurować system równoważenia obciążenia
  • Jak włączyć IAP, aby ograniczyć dostęp
  • Jak ograniczać dostęp przy użyciu IAP

2. Konfiguracja i wymagania

Konfigurowanie środowiska we własnym tempie

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Nazwa projektu to wyświetlana nazwa uczestników tego projektu. Jest to ciąg znaków, którego nie używają interfejsy API Google. Możesz ją zaktualizować w dowolnym momencie.
  • Identyfikator projektu jest niepowtarzalny w ramach wszystkich projektów Google Cloud i nie można go zmienić (po ustawieniu). Cloud Console automatycznie generuje unikalny ciąg znaków. Zwykle nie ma znaczenia, jaki to ciąg. W większości laboratoriów z kodem musisz odwoływać się do identyfikatora projektu (zazwyczaj jest to PROJECT_ID). Jeśli nie podoba Ci się wygenerowany identyfikator, możesz wygenerować inny losowy. Możesz też spróbować użyć własnego adresu e-mail i sprawdzić, czy jest on dostępny. Po tym kroku nie można go zmienić. Pozostanie ona niezmieniona przez cały czas trwania projektu.
  • Informacyjnie: istnieje jeszcze 3 wartość, numer projektu, którego używają niektóre interfejsy API. Więcej informacji o wszystkich 3 wartościach znajdziesz w dokumentacji.
  1. Następnie musisz włączyć rozliczenia w konsoli Cloud, aby korzystać z zasobów i interfejsów API Cloud. Przejście przez ten moduł Codelab nie powinno wiązać się z wielkimi kosztami, jeśli w ogóle z nimi będzie. Aby wyłączyć zasoby, aby nie generować opłat po zakończeniu samouczka, możesz usunąć utworzone zasoby lub cały projekt. Nowi użytkownicy Google Cloud mogą skorzystać z bezpłatnego okresu próbnego, w którym mają do dyspozycji środki w wysokości 300 USD.

Konfiguracja środowiska

  1. Tworzenie zmiennych środowiskowych związanych z projektem i zasobami
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
  1. Włącz interfejsy IAP i Cloud Resource Manager API
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. Sklonuj repozytorium przykładowej aplikacji i otwórz katalog
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. Wdróż portal dla pracowników za pomocą skryptu konfiguracyjnego. Zanim przejdziesz do następnego kroku, poczekaj na zakończenie działania skryptu
./setup.sh

Przykładowe dane wyjściowe

...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. Kliknij link do adresu URL usługi.

86416f68c0b8152a.png

3. Konfigurowanie bezserwerowej grupy punktów końcowych sieci (NEG)

Utworzysz bezserwerową grupę punktów końcowych sieci( bezserwerową grupę NEG) dla usługi Cloud Run dla interfejsu użytkownika pracownika. Bezserwerowe grupy punktów końcowych sieci umożliwiają korzystanie z aplikacji bezserwerowych Google Cloud z zewnętrznym systemem równoważenia obciążenia HTTP(S).

2abe669e53c27186.png

  1. Utwórz grupę punktów końcowych sieci dla usługi interfejsu użytkownika dla pracowników.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
    --project $PROJECT_ID \
    --region=$REGION \
    --network-endpoint-type=serverless  \
    --cloud-run-service=employee-ui-service

Przykładowe dane wyjściowe

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg].
Created network endpoint group [employee-ui-iap-neg].

Utwórz usługę backendu i dodaj bezserwerową grupę punktów końcowych sieci.

Usługa backendu określa sposób, w jaki system równoważenia obciążenia Cloud rozdziela ruch. Konfiguracja usługi backendu zawiera zestaw wartości, takich jak protokół używany do łączenia się z backendami, różne ustawienia dystrybucji i sesji, kontrole stanu oraz limity czasu. Te ustawienia zapewniają szczegółową kontrolę nad działaniem systemu równoważenia obciążenia.

  1. Utwórz usługę backendu
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

Przykładowe dane wyjściowe

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
NAME: employee-ui-iap-backend
BACKENDS:
PROTOCOL: HTTP
  1. Dodaj bezserwerową grupę punktów końcowych sieci jako backend do usługi backendu
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

Przykładowe dane wyjściowe

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. Utwórz mapę URL, aby kierować przychodzące żądania do usługi backendu
gcloud compute url-maps create employee-ui-iap-url-map \
    --default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map].
NAME: employee-ui-iap-url-map
DEFAULT_SERVICE: backendServices/employee-ui-iap-backend

4. Konfigurowanie komponentów systemu równoważenia obciążenia

Na diagramie poniżej widać, jak system równoważenia obciążenia używa bezserwerowego backendu NEG do kierowania żądań do bezserwerowej usługi Cloud Run.

335f4674737a6514.png

Zarezerwuj statyczny adres IP

  1. Zarezerwuj statyczny adres IPv4 i zapisz domenę
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

Przykładowe dane wyjściowe

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. Przechowuj domenę nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

Tworzenie zasobu certyfikatu SSL zarządzanego przez Google

  1. Tworzenie zasobu certyfikatu SSL zarządzanego przez Google
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

Przykładowe dane wyjściowe

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert].
NAME: employee-ui-iap-cert
TYPE: MANAGED
CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00
EXPIRE_TIME:
MANAGED_STATUS: PROVISIONING

34.102.234.98.nip.io: PROVISIONING

Tworzenie docelowego serwera proxy HTTPS

  1. Utwórz docelowy serwer proxy HTTPS, aby kierować żądania do mapy URL
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

Przykładowe dane wyjściowe

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy].
NAME: employee-ui-iap-http-proxy
SSL_CERTIFICATES: employee-ui-iap-cert
URL_MAP: employee-ui-iap-url-map
CERTIFICATE_MAP:

Konfigurowanie reguł przekierowania

  1. Utwórz regułę przekierowania, aby kierować przychodzące żądania do serwera proxy
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=employee-ui-iap-ip \
    --global \
    --ports=443 \
    --target-https-proxy employee-ui-iap-http-proxy

Przykładowe dane wyjściowe

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

Ograniczanie ruchu przychodzącego do usługi Cloud Run

Ogranicz ruch przychodzący tak, aby przyjmował tylko żądania wewnętrzne i żądania przychodzące za pośrednictwem systemu równoważenia obciążenia HTTP(S).

26cb0b2a9162e7ab.png

  1. Zaktualizuj usługę, aby zezwalała na ruch przychodzący tylko z wewnętrznych żądań i żądań przez system równoważenia obciążenia HTTP(S).
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

Przykładowe dane wyjściowe

OK Deploying... Done.                            
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. Kliknij link do adresu URL usługi.

8505fde7e0784bf1.png

Dostęp do adresu URL usługi Cloud Run jest teraz zabroniony.

5. Włączanie serwera proxy Cloud Identity-Aware Proxy (IAP) w systemie równoważenia obciążenia

IAP umożliwia utworzenie centralnej warstwy autoryzacji dla aplikacji, do których dostęp uzyskuje się przez HTTPS. Zamiast zapory na poziomie sieci możesz użyć modelu kontroli dostępu na poziomie aplikacji.

d9740402a74370a8.png

Marka to ekran zgody OAuth, który zawiera informacje o markach dla użytkowników. Marki mogą być dostępne tylko dla użytkowników wewnętrznych lub publicznych. Marka wewnętrzna umożliwia dostęp do procesu OAuth użytkownikowi należącemu do tej samej organizacji Google Workspace co projekt. Marka publiczna udostępnia proces OAuth każdemu, kto ma dostęp do internetu.

  1. Tworzenie marki
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud alpha iap oauth-brands create \
    --application_title="Cymbal Eats" \
    --support_email=$USER_EMAIL

Przykładowe dane wyjściowe

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

Tworzenie klienta OAuth IAP

  1. Utwórz klienta, używając nazwy marki z poprzedniego kroku.
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

Przykładowe dane wyjściowe

Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com].
displayName: cymbal-eats-employee-ui
name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com
secret: [secret-removed]
  1. Zapisz nazwę, identyfikator i klucz tajny klienta
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
    projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
    --filter="displayName:cymbal-eats-employee-ui")

export CLIENT_ID=${CLIENT_NAME##*/}

export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
  1. W konsoli Google Cloud wybierz projekt z menu wyboru projektu.
  2. Otwórz w konsoli Cloud ekran zgody OAuth.

bcb460f3ab5241f4.png

  1. W sekcji Typ użytkownika kliknij ZMIEŃ NA ZEWNĘTRZNY.
  2. Jako stan publikacji wybierz Testowanie.

27fd7de6e7b7ef21.png

  1. Kliknij POTWIERDŹ.

6. Ograniczanie dostępu przy użyciu IAP

Ogranicz dostęp do usługi backendowej za pomocą IAP, a potem sprawdź, czy aplikacja jest niedostępna.

  1. Włączanie IAP w usłudze backendu
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

Weryfikowanie konfiguracji IAP

  1. Sprawdź, czy certyfikat SSL jest AKTYWNY
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. Uzyskiwanie adresu URL usługi
echo https://$DOMAIN

Przykładowe dane wyjściowe

https://34.102.234.98.nip.io
  1. Kliknij adres URL usługi, aby otworzyć portal pracownika.

352b600209c3fb33.png

  1. Zaloguj się, używając danych logowania do modułu.

f7e0318388aa0739.png

  1. Zamknij przeglądarkę.

Przyznawanie użytkownikom dostępu do portalu dla pracowników

  1. Dodaj powiązanie zasad uprawnień dla roli 'roles/iap.httpsResourceAccessor' dla użytkownika utworzonego w poprzednim kroku.
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

Przykładowe dane wyjściowe

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

Testowanie dostępu do usługi

Potwierdź, że przyznano dostęp do portalu dla pracowników

  1. Uzyskiwanie adresu URL usługi
echo https://$DOMAIN

Przykładowe dane wyjściowe

https://34.102.234.98.nip.io
  1. Kliknij adres URL usługi, aby otworzyć portal pracownika.

86416f68c0b8152a.png

Powinieneś mieć teraz dostęp do portalu dla pracowników.

(Opcjonalnie) Wdróż wszystkie zależności. Wdrażanie tych mikroserwisów może potrwać około 20 minut.

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. Gratulacje!

Gratulacje! Masz ukończone zajęcia.

Co dalej:

Inne ćwiczenia z programowania dotyczące 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.

Usuwanie projektu

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