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 jego preferencje mogły być przechowywane 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.

To ćwiczenie przeprowadzi Cię przez proces tworzenia własnej aplikacji, ograniczania do niej dostępu i pobierania tożsamości użytkownika z IAP.

Co utworzysz

W tym ćwiczeniu utworzysz niewielką aplikację internetową w Google App Engine, a następnie poznasz różne sposoby ograniczania dostępu do tej aplikacji i przekazywania do niej informacji o tożsamości użytkowników z wykorzystaniem 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 użytkownikami podszywającymi się pod innych.

Czego potrzebujesz

  • nowoczesna przeglądarka, np. Chrome;
  • podstawowa wiedza o programowaniu w języku Python,

To ćwiczenie dotyczy głównie Google App Engine i IAP. Nieistotne koncepcje i bloki kodu zostały pominięte. Można je po prostu skopiować i wkleić.

2. Przygotowania

Będziesz pracować w środowisku wiersza poleceń Cloud Shell. Zacznij od otwarcia tego środowiska i pobrania do niego przykładowego kodu.

Uruchamianie konsoli i Cloud Shell

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

Wszystkie polecenia w tym ćwiczeniu będą wykonywane w Cloud Shell w projekcie, który został utworzony i otwarty. Otwórz Cloud Shell, klikając ikonę Aktywuj Cloud Shell po prawej stronie nagłówka strony konsoli. W dolnej części strony możesz wpisywać i uruchamiać polecenia.Możesz to robić na własnym komputerze, ale najpierw musisz zainstalować i skonfigurować potrzebne oprogramowanie do tworzenia aplikacji. Cloud Shell ma już wszystkie potrzebne narzędzia.

Pobieranie kodu

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 po 1 podfolderze dla każdego kroku tego modułu. Podczas wykonywania określonego kroku przejdź do odpowiadającego mu folderu.

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

Jest to aplikacja standardowego środowiska App Engine napisana w języku Python 3.7, która wyświetla po prostu stronę powitalną „Hello, World”. 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. Szablon znajduje się w pliku templates/index.html. W przypadku tego kroku zawiera on tylko zwykły kod HTML. Drugi szablon zawiera szkielet przykładowego dokumentu polityki prywatności i znajduje się w pliku templates/privacy.html.

Dostępne są także 2 inne pliki: requirements.txt zawiera listę wszystkich innych niż domyślne bibliotek Python, które są używane w aplikacji, 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żna także przejrzeć, uruchamiając edytor kodu Cloud Shell i 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 dla Pythona 3.7.

gcloud app deploy

Może pojawić się prośba o wybranie regionu, w którym chcesz wykonać wdrożenie. Wybierz dowolny pobliski region oznaczony tekstem „supports standard” (obsługuje środowisko standardowe). Gdy pojawi się pytanie, czy chcesz kontynuować, wpisz Y (Tak).

Aplikacja powinna zostać wdrożona w ciągu kilku minut. Pojawi się komunikat informujący o tym, że można wyświetlić aplikację przy użyciu polecenia 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

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

Ograniczanie dostępu przy użyciu 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, że przed użyciem IAP musisz skonfigurować ekran zgody OAuth.

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

Podaj odpowiednie wartości w wymaganych, pustych polach:

Nazwa aplikacji

Przykład IAP

Adres e-mail pomocy

Twój adres e-mail. Może już znajdować się w tym polu.

Autoryzowana domena

nazwa hosta z adresu URL aplikacji, np. iap-example-999999.appspot.com. Ten adres widać na pasku adresu otwartej wcześniej strony internetowej Hello World. Nie dołączaj początkowego fragmentu https:// ani znajdującego się na końcu adresu URL znaku /.Po wpisaniu tej wartości naciśnij Enter.

Link do strony głównej aplikacji

adres URL wyświetlonej aplikacji

Link do polityki prywatności aplikacji

link do strony prywatności w aplikacji. Jest on taki sam jak link strony głównej, jednak ma na końcu fragment /privacy

Kliknij Zapisz. Pojawi się prośba o utworzenie danych logowania. Nie musisz tworzyć danych logowania w tym ćwiczeniu, 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ć.Kliknij przycisk przełączania w kolumnie IAP i wierszu aplikacji App Engine, aby włączyć IAP.

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

Teraz otwórz kartę przeglądarki i przejdź na adres URL swojej aplikacji. Zostanie wyświetlony ekran Zaloguj się przez Google, na którym trzeba będzie się zalogować, aby uzyskać dostęp do aplikacji.

Zaloguj się przy użyciu konta 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 UŻYTKOWNIKA. Wpisz swój adres e-mail, a następnie wybierz rolę Cloud IAP/Użytkownik aplikacji internetowej zabezpieczonej przez IAP i przypisz ją do tego adresu. 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 została 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. Może się jednak zdarzyć, że nadal będzie wyświetlana strona „Nie masz dostępu”, ponieważ IAP może nie sprawdzić ponownie Twojej autoryzacji. W tym przypadku wykonaj te czynności:

  • Otwórz przeglądarkę internetową na adres strony głównej z dodanym na końcu adresu URL znakiem /_gcp_iap/clear_login_cookie, 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. Uzyskiwanie dostępu 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 krok 2, a ostatni krok został wykonany, gdy w Cloud Shell był otwarty folder iap-codelab/1-HelloWorld. Zmień folder, aby wykonać ten krok:

cd ~/iap-codelab/2-HelloUser

Wdrażanie w App Engine

Rozpocznij od wdrożenia aplikacji w standardowym środowisku App Engine dla Pythona 3.7, ponieważ ten proces potrwa kilka minut:

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 polecenia 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.

Przeglądanie plików aplikacji

Ten folder zawiera ten sam zestaw plików co w kroku 1, ale dwa z nich zostały zmodyfikowane: main.pytemplates/index.html. Program został zmieniony tak, aby mógł pobierać informacje o użytkownikach dostarczane przez IAP w nagłówkach żądań. Szablon wyświetla teraz te dane.

W pliku 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 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:, który informuje o tym, 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 znajdujący się obok aplikacji App Engine, aby wyłączyć IAP.

Pojawi się ostrzeżenie informujące o tym, że gdy wykonasz tę czynność, 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 sytuacjach, gdy ten problem może stwarzać potencjalne zagrożenie, rozwiązaniem jest krok 3.

5. Krok 3. Wdrażanie 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 spośród dodawanych przez IAP nagłówków żądań sieciowych 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 krok 3. Ostatni krok został wykonany, gdy w Cloud Shell był otwarty folder 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 dla Pythona 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 polecenia 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 w kroku 2 wyłączono IAP, więc aplikacja nie otrzymuje żadnych danych IAP. 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 znajdujący się 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ę na to, że adres e-mail zwrócony przez zweryfikowaną metodę nie ma prefiksu accounts.google.com:.

Gdy wyłączysz lub pominiesz 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.

Przeglądanie plików aplikacji

Ten folder zawiera ten sam zbiór plików co folder z kroku 2, jednak dwa pliki zostały zmodyfikowane i dodano jeden nowy. Nowy plik to auth.py. Zawiera on metodę user() służącą do pobierania i sprawdzania kryptograficznie podpisanych informacji o tożsamości. Zmodyfikowane pliki to main.pytemplates/index.html. Korzystają one z wyników wykonania tej metody. Widoczne są także niezweryfikowane nagłówki w postaci stosowanej w kroku 2. Dzięki temu można je porównać z nowymi nagłówkami.

Nowa funkcjonalność znajduje się głównie 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']

Obiekt assertion zawiera 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()audience() zbierają oraz zwracają te wartości.

Podpisany obiekt zawiera 2 fragmenty danych, których będziemy potrzebować: zweryfikowany adres e-mail i wartość unikalnego identyfikatora (podaną w polu standardowym sub, którego nazwa pochodzi od słowa „subskrybent”).

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 pobrałeś(-aś) i wyświetliłeś(-aś) informacje o tożsamości tych użytkowników, którym IAP przyznał dostęp do aplikacji. Wiesz już także, jak można podszywać się pod innych użytkowników, jeśli IAP zostanie wyłączony lub pominięty. W kroku 3 sprawdziłeś(-aś) kryptograficznie podpisane asercje tożsamości użytkowników, które zapobiegają podszywaniu się.

7. Czyszczenie

Jedynymi zasobami Google Cloud Platform, których użyto w tym ćwiczeniu w Codelabs, są instancje App Engine. Za każdym razem, gdy wdrażasz aplikację, tworzona jest nowa wersja, która istnieje do momentu usunięcia. Zakończ moduł, aby usunąć projekt i wszystkie jego zasoby.