Uwierzytelnianie użytkowników za pomocą Identity-Aware Proxy

1. Wprowadzenie

Uwierzytelnianie użytkowników aplikacji internetowej jest często niezbędne i zwykle wymaga zaprogramowania aplikacji w specjalny sposób. W przypadku aplikacji Google Cloud Platform za te zadania jest odpowiedzialna usługa Serwer proxy identyfikujący tożsamość. Jeśli chcesz przyznać dostęp tylko wybranym użytkownikom, nie musisz wprowadzać w aplikacji żadnych zmian. Jeśli do aplikacji muszą być przekazywane informacje o tożsamości użytkownika (aby na przykład przechowywać jego preferencje na serwerze), zadanie to może wykonać Identity-Aware Proxy, przy czym wymaga to minimalnej ingerencji w kod aplikacji.

Co to jest Serwer proxy identyfikujący tożsamość?

Serwer proxy identyfikujący tożsamość (IAP) to usługa Google Cloud Platform, która przechwytuje wysyłane do aplikacji żądania sieciowe, 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 żądań, dodając do nich informacje o uwierzytelnionym użytkowniku.

Dzięki temu ćwiczeniu w Codelabs dowiesz się, jak utworzyć własną aplikację, ograniczyć do niej dostęp i pobierać tożsamość użytkownika z IAP.

Co utworzysz

W ramach tego ćwiczenia w programie utworzysz minimalną aplikację internetową w Google App Engine, a następnie poznasz różne sposoby ograniczania dostępu do aplikacji i przekazywania do niej informacji o tożsamości użytkowników za pomocą Identity-Aware Proxy. Twoja aplikacja będzie:

  • wyświetlać stronę powitalną,
  • uzyskiwać dostęp do pochodzących z IAP informacji o tożsamości użytkowników,
  • zapobiegać podszywaniu się i podawaniu fałszywych informacji o tożsamości przy użyciu weryfikacji kryptograficznej.

Czego się nauczysz

  • Jak pisać i wdrażać proste aplikacje App Engine w języku Python 3.7.
  • Jak ograniczać dostęp do aplikacji przy użyciu IAP i wyłączać te ograniczenia.
  • Jak pobierać informacje o tożsamości użytkowników z IAP i przekazywać je do aplikacji.
  • Jak kryptograficznie sprawdzać informacje z IAP i chronić aplikację przed podszywaniem się.

Czego potrzebujesz

  • Nowoczesna przeglądarka, np. Chrome.
  • Podstawowa znajomość języka programowania Python

To ćwiczenia z programowania koncentrują się na Google App Engine i IAP. Nieistotne koncepcje i bloki kodu zostały zamaskowane. Można je po prostu skopiować i wkleić.

2. Przygotowanie

Będziesz pracować w środowisku wiersza poleceń Cloud Shell. Otwórz to środowisko i pobierz do niego przykładowy kod.

Uruchamianie konsoli i Cloud Shell

W lewym górnym rogu strony modułu kliknij przycisk Otwórz konsolę Google. Musisz zalogować się za pomocą nazwy użytkownika i hasła widocznych pod tym przyciskiem.

Wszystkie polecenia z tego ćwiczenia w Codelabs będą wykonywane w Cloud Shell dla projektu, który został dla Ciebie utworzony i otwarty. Otwórz Cloud Shell, klikając ikonę Aktywuj Cloud Shell widoczną po prawej stronie nagłówka strony konsoli. Dolna połowa strony umożliwia wpisywanie i uruchamianie poleceń.Polecenia można uruchamiać na Twoim komputerze, ale najpierw należy zainstalować i skonfigurować potrzebne oprogramowanie programistyczne. W Cloud Shell są już wszystkie potrzebne narzędzia.

Pobierz kod

Kliknij obszar wiersza poleceń w Cloud Shell, aby móc wpisywać polecenia. Pobierz kod z GitHuba, a następnie przejdź do folderu kodu:

git clone https://github.com/googlecodelabs/user-authentication-with-iap.git
cd user-authentication-with-iap

Ten folder zawiera 1 podfolder na każdy krok tego ćwiczenia z programowania. Podczas wykonywania określonego kroku przejdź do odpowiadającego mu folderu.

3. Krok 1. Wdróż aplikację i zabezpiecz ją przy użyciu IAP

To jest aplikacja App Engine Standard napisana w języku Python 3.7, która wyświetla po prostu komunikat „Hello, World” stronie powitalnej. Wdrożymy i przetestujemy ją, a następnie ograniczymy do niej dostęp przy użyciu IAP.

Sprawdzanie kodu aplikacji

Przejdź z głównego folderu projektu do podfolderu 1-HelloWorld, który zawiera kod dotyczący tego kroku.

cd 1-HelloWorld

Kod aplikacji znajduje się w pliku main.py. Odpowiada on na żądania sieciowe, przesyłając zawartość szablonu przy użyciu sieciowej platformy programistycznej Flask. Ten plik szablonu znajduje się w lokalizacji templates/index.html i w tym kroku zawiera tylko zwykły kod HTML. Drugi plik szablonu zawiera przykładową politykę prywatności w strukturze szkieletowej w templates/privacy.html.

Dostępne są też 2 inne pliki: requirements.txt zawiera listę wszystkich innych niż domyślne biblioteki Pythona, których używa aplikacja, a app.yaml informuje Google Cloud Platform, że jest to aplikacja App Engine w języku Python 3.7.

Każdy z tych plików można wyświetlić w powłoce przy użyciu polecenia cat, na przykład:

cat main.py

Kod możesz też obejrzeć w edytorze kodu Cloud Shell, klikając ikonę ołówka w prawym górnym rogu okna Cloud Shell.

W tym kroku nie trzeba modyfikować żadnych plików.

Wdrażanie w App Engine

Teraz wdróż aplikację w standardowym środowisku App Engine języka Python 3.7.

gcloud app deploy

Może pojawić się prośba o wybranie regionu do wdrożenia. Wybierz taką, która w pobliżu ma informację „obsługuje standardowe”. Gdy pojawi się pytanie, czy chcesz kontynuować, wpisz Y jako „Tak”.

W ciągu kilku minut wdrożenie zostanie ukończone i pojawi się komunikat informujący o tym, że możesz wyświetlić aplikację w narzędziu gcloud app browse. Wpisz polecenie. Jeśli w przeglądarce nie otworzy się nowa karta, kliknij wyświetlony link, aby otworzyć go w nowej karcie, lub w razie potrzeby skopiuj go i wklej w ręcznie otwartej nowej karcie. Ponieważ aplikacja jest uruchamiana po raz pierwszy, pojawi się po kilku sekundach. W tym czasie jest uruchamiana instancja w chmurze. Zostanie wyświetlone następujące okno.

1c1c0b166c6023e.png

Ten adres URL można otworzyć na dowolnym komputerze podłączonym do internetu i wyświetlić tę stronę internetową. Dostęp nie został jeszcze ograniczony.

Ograniczanie dostępu za pomocą IAP

W oknie konsoli Cloud kliknij ikonę menu w lewym górnym rogu strony, a następnie kliknij kolejno Zabezpieczenia i Identity-Aware Proxy.

Ponieważ po raz pierwszy włączasz opcję uwierzytelniania w tym projekcie, zobaczysz komunikat informujący o tym, że aby korzystać z IAP, musisz skonfigurować ekran akceptacji OAuth.

Kliknij PRZYCISK SKONFIGURUJ EKRAN ZGODY. Otworzy się nowa karta, w której możesz skonfigurować ekran zgody.

Podaj odpowiednie wartości w wymaganych, pustych polach:

Nazwa aplikacji

Przykład IAP

Adres e-mail pomocy

swojego adresu e-mail. pole może już być wypełnione.

Autoryzowana domena

nazwa hosta w adresie URL aplikacji, np. iap-example-999999.appspot.com. Adres ten znajdziesz na pasku adresu otwartej wcześniej strony internetowej Hello World. Nie umieszczaj w adresie URL początkowego https:// ani końcowego /.Po wpisaniu tej wartości trzeba nacisnąć Enter.

Link do strony głównej aplikacji

adres URL strony użytej do wyświetlenia aplikacji

Link do polityki prywatności aplikacji

link do strony prywatności w aplikacji, taki sam jak link do strony głównej, z dodanym /privacy na końcu

Kliknij Zapisz. Pojawi się prośba o utworzenie danych logowania. W przypadku tego ćwiczenia z programowania nie musisz tworzyć danych logowania, więc możesz po prostu zamknąć tę kartę przeglądarki.

Wróć na stronę Identity-Aware Proxy i odśwież ją. Powinna być teraz widoczna lista zasobów, które można zabezpieczyć.Aby włączyć IAP, kliknij przycisk przełączania w kolumnie IAP w wierszu aplikacji App Engine.

Zobaczysz nazwy domen, które będą chronione przez IAP. Kliknij WŁĄCZ.

Teraz otwórz kartę przeglądarki i wejdź na adres URL swojej aplikacji. Zobaczysz ekran Zaloguj się przez Google z prośbą o zalogowanie się, aby uzyskać dostęp do aplikacji.

Zaloguj się na konto Google lub G Suite. Pojawi się ekran z odmową dostępu.

Aplikacja została zabezpieczona przy użyciu IAP, ale nie przesłano jeszcze na ten serwer informacji o kontach, które mają być akceptowane.

Wróć na stronę konsoli Serwer proxy identyfikujący tożsamość, zaznacz pole wyboru obok aplikacji App Engine i zwróć uwagę na pasek boczny po prawej stronie ekranu.

Każdy adres e-mail, adres grupy dyskusyjnej Google lub nazwę domeny G Suite, które mają mieć dostęp, należy dodać jako użytkownika. Kliknij DODAJ CZŁONKOWEGO. Wpisz swój adres e-mail, a następnie wybierz rolę użytkownika Cloud IAP/użytkownika aplikacji internetowej zabezpieczonej przez IAP i przypisz mu ją. Możesz w ten sam sposób wpisać więcej adresów lub domen G Suite.

Kliknij Zapisz. U dołu okna pojawi się komunikat „Zasada zaktualizowana”.

Wróć do aplikacji i załaduj ponownie stronę. Teraz aplikacja powinna być widoczna, ponieważ nastąpiło logowanie przy użyciu autoryzowanego konta użytkownika. Nadal może być jednak wyświetlany komunikat „Nie masz dostępu” , ponieważ IAP może nie sprawdzić ponownie Twojej autoryzacji. W tym przypadku wykonaj te czynności:

  • Otwórz w przeglądarce adres strony głównej i dodaj ciąg /_gcp_iap/clear_login_cookie na końcu, np. https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Pojawi się nowy ekran Zaloguj się przez Google, na którym jest już wyświetlane Twoje konto. Nie klikaj tego konta. Zamiast tego kliknij Użyj innego konta i wpisz ponownie swoje dane logowania.
  • Wykonanie tych czynności spowoduje, że IAP ponownie sprawdzi Twój dostęp – ekran główny aplikacji powinien być już widoczny.

Jeśli masz inne ważne konto Gmail lub G Suite i dostęp do innej przeglądarki albo możesz użyć trybu incognito, przejdź w tej przeglądarce na stronę swojej aplikacji i zaloguj się przy użyciu tego innego konta. Ponieważ to konto nie zostało autoryzowane, zamiast aplikacji pojawi się ekran „Nie masz dostępu”.

4. Krok 2. Uzyskaj dostęp do informacji o tożsamości użytkowników

Aplikacja zabezpieczona przy użyciu IAP może używać informacji o tożsamości dostarczanych przez IAP w nagłówkach przekazywanych żądań sieciowych. W tym kroku aplikacja pobierze adres e-mail i stały, unikalny identyfikator zalogowanego użytkownika przypisany do niego przez usługę tożsamości Google. Te dane zostaną wyświetlone na stronie powitalnej.

To jest krok 2, a ostatni krok zakończył się otwarciem Cloud Shell w folderze iap-codelab/1-HelloWorld. Zmień folder, aby wykonać ten krok:

cd ~/iap-codelab/2-HelloUser

Wdrażanie w App Engine

Wdrożenie trwa kilka minut, więc zacznij od wdrożenia aplikacji w standardowym środowisku App Engine języka Python 3.7:

gcloud app deploy

Gdy pojawi się pytanie, czy chcesz kontynuować, wpisz Y (tak). Aplikacja powinna zostać wdrożona w ciągu kilku minut. Czekając na zakończenie tego procesu, możesz przejrzeć pliki aplikacji w opisany poniżej sposób.

Gdy wdrożenie będzie gotowe, pojawi się komunikat informujący o tym, że można wyświetlić aplikację przy użyciu gcloud app browse. Wpisz polecenie. Jeśli w przeglądarce nie otworzy się nowa karta, skopiuj wyświetlony link i otwórz go w nowej karcie, tak jak robisz to zwykle. Powinna Ci się wyświetlić strona podobna do tej:

5b5fb03111258cec.png

Zastąpienie wcześniejszej wersji aplikacji jej nową wersją może potrwać kilka minut. W razie potrzeby odśwież stronę, aby wyświetlić ekran podobny do ekranu widocznego powyżej.

Sprawdzanie plików aplikacji

Ten folder zawiera ten sam zestaw plików co w kroku 1, ale 2 pliki zostały zmienione: main.py i templates/index.html. Program został zmieniony tak, aby mógł pobierać informacje o użytkownikach dostarczane przez IAP w nagłówkach. Szablon wyświetla teraz te dane.

W narzędziu main.py znajdują się 2 wiersze, które umożliwiają pobieranie przekazywanych przez IAP danych o tożsamości:

user_email = request.headers.get('X-Goog-Authenticated-User-Email')
user_id = request.headers.get('X-Goog-Authenticated-User-ID')

Nagłówki X-Goog-Authenticated-User- są dostarczane przez IAP, a w nazwach nie jest rozróżniana wielkość liter, więc możesz je wpisywać w całości małymi lub wielkimi literami. Instrukcja render_template zawiera teraz te wartości, więc można je wyświetlić:

page = render_template('index.html', email=user_email, id=user_id)

Te wartości można wyświetlić przy użyciu szablonu index.html, umieszczając nazwy w podwójnych nawiasach klamrowych:

Hello, {{ email }}! Your persistent ID is {{ id }}.

Jak widać dostarczone dane są poprzedzone prefiksem accounts.google.com: wskazującym, skąd one pochodzą. W razie potrzeby Twoja aplikacja może usunąć wszystko, co znajduje się przed dwukropkiem (oraz sam dwukropek), uzyskując w ten sposób czyste wartości.

Wyłączanie IAP

Co stanie się z tą aplikacją, gdy IAP zostanie wyłączony lub w jakiś sposób pominięty (na przykład przez inne aplikacje działające w tym samym projekcie w chmurze)? Wyłącz IAP, aby to sprawdzić.

W oknie konsoli Cloud kliknij ikonę menu w lewym górnym rogu strony, a następnie kliknij kolejno Zabezpieczenia i Identity-Aware Proxy. Kliknij przełącznik IAP obok aplikacji App Engine, aby wyłączyć IAP.

Pojawi się ostrzeżenie informujące o tym, że po wykonaniu tej czynności wszyscy użytkownicy będą mieli dostęp do aplikacji.

Odśwież stronę internetową aplikacji. Powinna pojawić się ta sama strona, jednak bez żadnych informacji o użytkowniku:

17c850de95fea839.png

Ponieważ aplikacja nie jest już chroniona, można podjąć próbę wysłania żądań sieciowych, które wyglądają jak przekazane przez IAP. W tym celu możesz na przykład wykonać następujące polecenie curl w Cloud Shell (zastąp <your-url-here> prawidłowym adresem URL aplikacji):

curl -X GET <your-url-here> -H "X-Goog-Authenticated-User-Email: totally fake email"

W wierszu poleceń zostanie wyświetlona strona internetowa podobna do tej:

<!doctype html>
<html>
<head>
  <title>IAP Hello User</title>
</head>
<body>
  <h1>Hello World</h1>

  <p>
    Hello, totally fake email! Your persistent ID is None.
  </p>

  <p>
    This is step 2 of the <em>User Authentication with IAP</em>
    codelab.
 </p>

</body>
</html>

Aplikacja nie może w żaden sposób stwierdzić, że IAP został wyłączony lub pominięty. W przypadkach, gdy jest to potencjalne ryzyko, rozwiązanie problemu podano w kroku 3.

5. Krok 3. Użyj weryfikacji kryptograficznej

Jeśli istnieje ryzyko, że IAP zostanie wyłączony lub pominięty, w aplikacji można uwzględnić mechanizmy sprawdzające, czy odbierane informacje o tożsamości są prawidłowe. W tym celu jest używany trzeci nagłówek żądania internetowego dodany przez IAP o nazwie X-Goog-IAP-JWT-Assertion. Wartością tego nagłówka jest kryptograficznie podpisany obiekt, który zawiera także informacje o tożsamości użytkownika. Aplikacja może zweryfikować podpis cyfrowy i użyć danych dostarczonych w tym obiekcie, aby sprawdzić, czy żądanie przekazane przez IAP nie zostało w żaden sposób zmodyfikowane.

Sprawdzenie podpisu cyfrowego wymaga wykonania kilku dodatkowych kroków, takich jak pobranie najnowszego zestawu kluczy publicznych Google. Decyzję o tym, czy dana aplikacja powinna wykonywać te dodatkowe kroki, można podjąć, oceniając ryzyko wyłączenia lub pominięcia IAP oraz poziom poufności aplikacji.

To jest krok 3, a ostatni krok zakończył się otwarciem Cloud Shell w folderze iap-codelab/2-HelloUser. Zmień folder, aby wykonać ten krok:

cd ~/iap-codelab/3-HelloVerifiedUser

Wdrażanie w App Engine

Wdróż aplikację w standardowym środowisku App Engine języka Python 3.7:

gcloud app deploy

Gdy pojawi się pytanie, czy chcesz kontynuować, wpisz Y (tak). Aplikacja powinna zostać wdrożona w ciągu kilku minut. Czekając na zakończenie tego procesu, możesz przejrzeć pliki aplikacji w opisany poniżej sposób.

Gdy wdrożenie będzie gotowe, pojawi się komunikat informujący o tym, że można wyświetlić aplikację przy użyciu gcloud app browse. Wpisz polecenie. Jeśli w przeglądarce nie otworzy się nowa karta, skopiuj wyświetlony link i otwórz go w nowej karcie, tak jak robisz to zwykle.

Pamiętaj, że IAP został wyłączony w kroku 2, więc żadne dane IAP nie są przekazywane do aplikacji. Powinna Ci się wyświetlić strona podobna do tej:

8ef2abcc23d96958.png

Podobnie jak poprzednio aktywowanie nowej wersji aplikacji i wyświetlenie zaktualizowanej strony może potrwać kilka minut.

Ponieważ IAP jest wyłączony, nie są dostępne żadne informacje o użytkowniku. Teraz ponownie włącz IAP.

W oknie konsoli Cloud kliknij ikonę menu w lewym górnym rogu strony, a następnie kliknij kolejno Zabezpieczenia i Identity-Aware Proxy. Kliknij przełącznik IAP obok aplikacji App Engine, aby ponownie włączyć IAP.

Odśwież stronę. Powinna pojawić się strona podobna do następującej:

3a4d93c11f228852.png

Zwróć uwagę, że adres e-mail podany przez metodę zweryfikowanej nie zawiera prefiksu accounts.google.com:.

Po wyłączeniu lub pominięciu IAP zweryfikowane dane nie będą dostępne albo będą nieprawidłowe, ponieważ odpowiedni podpis mogą mieć wyłącznie dane utworzone przez posiadacza kluczy prywatnych Google.

Sprawdzanie plików aplikacji

Ten folder zawiera ten sam zestaw plików co krok 2, ale dwa pliki zostały zmodyfikowane i dodano jeden nowy. Nowy plik to auth.py. Zawiera on metodę user() służącą do pobierania i weryfikacji kryptograficznie podpisanych informacji o tożsamości. Zmienione pliki to main.py i templates/index.html. Korzystają one z wyników tej metody. Widoczne są też niezweryfikowane nagłówki w celu porównania z krokiem 2.

Nowa funkcja jest głównie dostępna w funkcji user():

def user():
    assertion = request.headers.get('X-Goog-IAP-JWT-Assertion')
    if assertion is None:
        return None, None

    info = jwt.decode(
        assertion,
        keys(),
        algorithms=['ES256'],
        audience=audience()
    )

    return info['email'], info['sub']

assertion to kryptograficznie podpisane dane przekazane w określonym nagłówku żądania. W kodzie używana jest biblioteka, która weryfikuje i dekoduje dane. Proces weryfikacji używa dostarczonych przez Google kluczy publicznych do sprawdzania podpisywanych danych i uzyskiwania informacji o odbiorcach, dla których zostały one przygotowane (czyli o chronionym projekcie Google Cloud). Funkcje pomocnicze keys() i audience() zbierają oraz zwracają te wartości.

Podpisany obiekt zawiera 2 wymagane informacje: zweryfikowany adres e-mail i unikalny identyfikator (podany w polu sub w przypadku abonenta, czyli standardowe pole).

W ten sposób zakończyliśmy wykonywanie kroku 3.

6. Podsumowanie

Aplikacja internetowa App Engine została wdrożona. W kroku 1 przyznałeś(-aś) dostęp do aplikacji tylko wybranym użytkownikom. W kroku 2 udało Ci się pobrać i wyświetlić dane o tożsamości użytkowników, którym IAP przyznał dostęp do aplikacji. Wiesz już również, jak można podszywać się pod innych użytkowników, jeśli IAP został wyłączony lub pominięty. W kroku 3 zweryfikowano kryptograficznie podpisane asercje tożsamości użytkowników, które zapobiegają podszywaniu się.

7. Czyszczenie

Jedyne zasoby Google Cloud Platform wykorzystane w tym ćwiczeniu z programowania to instancje App Engine. Za każdym razem, gdy wdrażasz aplikację, tworzona jest jej nowa wersja, która będzie istnieć do momentu usunięcia. Aby usunąć projekt i wszystkie znajdujące się w nim zasoby, zamknij moduł.