Autenticazione degli utenti con Identity-Aware Proxy

1. Introduzione

Spesso l'autenticazione degli utenti di un'app web è un'operazione necessaria e, in genere, richiede una programmazione speciale nell'app. Per le app di Google Cloud Platform puoi delegare queste responsabilità al servizio Identity-Aware Proxy. Se devi semplicemente limitare l'accesso a utenti selezionati, non sono necessarie modifiche all'applicazione. Se l'applicazione deve conoscere l'identità dell'utente (ad esempio per memorizzare le preferenze dell'utente sul lato server), Identity-Aware Proxy può fornirla tramite un codice dell'applicazione minimo.

Che cos'è Identity-Aware Proxy?

Identity-Aware Proxy (IAP) è un servizio di Google Cloud Platform che intercetta le richieste web inviate alla tua applicazione, autentica l'utente che fa la richiesta utilizzando Google Identity Service e fa passare solo le richieste che provengono da un utente che hai autorizzato. Inoltre, può modificare le intestazioni della richiesta per includere informazioni sull'utente autenticato.

Questo codelab ti guiderà nella creazione della tua applicazione, nella limitazione dell'accesso e nell'ottenimento dell'identità utente da IAP.

Cosa creerai

In questo codelab, creerai un'applicazione web minima con Google App Engine, quindi esplorerai vari modi di utilizzare Identity-Aware Proxy per limitare l'accesso all'applicazione e per fornire informazioni sull'identità utente. La tua app sarà in grado di:

  • Visualizzare una pagina di benvenuto
  • Accedere alle informazioni sull'identità utente fornite tramite IAP
  • Utilizzare la verifica crittografica per prevenire lo spoofing delle informazioni dell'identità utente

Cosa imparerai a fare

  • Scrivere ed eseguire il deployment di una semplice app di App Engine con Python 3.7
  • Abilitare e disabilitare IAP per limitare l'accesso all'app
  • Far arrivare le informazioni sull'identità utente da IAP alla tua app
  • Verificare tramite crittografia le informazioni ricevute da IAP per proteggerle dallo spoofing

Che cosa ti serve

  • Un browser web moderno come Chrome.
  • Conoscenza di base del linguaggio di programmazione Python

Questo codelab riguarda specificamente Google App Engine e IAP. Concetti e blocchi di codice non pertinenti sono trattati solo superficialmente e sono forniti solo per operazioni di copia e incolla.

2. Preparazione

Lavorerai nell'ambiente a riga di comando di Cloud Shell. Inizia aprendo l'ambiente e recuperando il codice campione.

Avviare la console e Cloud Shell

Nella parte in alto a sinistra della pagina del lab, fai clic sul pulsante Apri Google Console. Dovrai accedere con il nome utente e la password mostrati sotto il pulsante.

Tutti i comandi di questo codelab verranno eseguiti in Cloud Shell per il progetto creato e aperto per te. Apri Cloud Shell facendo clic sull'icona Attiva Cloud Shell sul lato destro dell'intestazione della pagina della console. La metà inferiore della pagina ti consente di inserire ed eseguire comandi.I comandi possono essere eseguiti dal tuo PC, ma prima devi installare e configurare il software di sviluppo necessario. Cloud Shell dispone già di tutti gli strumenti software necessari.

Scarica il codice

Fai clic sull'area della riga di comando in Cloud Shell per digitare i comandi. Recupera il codice da GitHub, quindi passa alla cartella del codice:

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

Questa cartella contiene una sottocartella per ogni passaggio di questo codelab. Dovrai passare alla cartella corretta per eseguire i singoli passaggi.

3. Passaggio 1: esegui il deployment dell'applicazione e proteggila con IAP

Questa è un'applicazione standard di App Engine scritta in Python 3.7 che visualizza semplicemente una pagina di benvenuto "Hello World". Eseguiremo il deployment e la testeremo, quindi ne limiteremo l'accesso utilizzando IAP.

Esamina il codice dell'applicazione

Passa dalla cartella del progetto principale alla sottocartella 1-HelloWorld che contiene il codice da utilizzare in questo passaggio.

cd 1-HelloWorld

Il codice dell'applicazione è nel file main.py. Utilizza il framework web Flask per rispondere alle richieste web con i contenuti di un modello. Il file modello si trova in templates/index.html e per questo passaggio contiene solo HTML normale. Un secondo file modello contiene uno schema essenziale di norme sulla privacy di esempio in templates/privacy.html.

Sono presenti due altri file: requirements.txt, che elenca tutte le librerie Python non predefinite utilizzate dall'applicazione, e app.yaml, che informa Google Cloud Platform che questa è un'applicazione App Engine in Python 3.7.

Puoi elencare ciascun file della shell utilizzando il comando cat, ad esempio:

cat main.py

Oppure puoi aprire l'editor di codice di Cloud Shell facendo clic sull'icona a forma di matita nell'angolo in alto a destra della finestra di Cloud Shell ed esaminare il codice in questo modo.

Per questo passaggio non è necessario modificare alcun file.

Esegui il deployment in App Engine

Ora esegui il deployment dell'app nell'ambiente standard di App Engine per Python 3.7

gcloud app deploy

Ti potrebbe essere chiesto di scegliere una regione in cui eseguire il deployment. Seleziona una qualsiasi area geografica nei dintorni con la dicitura "supports standard". Quando ti viene chiesto se vuoi continuare, digita Y per sì.

Il deployment dovrebbe completarsi in pochi minuti e vedrai un messaggio che ti informa che puoi visualizzare l'applicazione con gcloud app browse. Inserisci il comando. Se nel browser non si apre una nuova scheda, fai clic sul link visualizzato per aprirlo in una nuova scheda o copialo in una nuova scheda che avrai aperto manualmente, se necessario. Poiché questa è la prima volta che l'app viene eseguita, serviranno alcuni secondi perché sia visualizzata e si avvii l'istanza cloud; dovresti vedere la finestra seguente.

1c1c0b166c6023e.png

Puoi aprire lo stesso URL da qualsiasi computer connesso a internet per vedere la pagina web. L'accesso non è ancora limitato.

Limita l'accesso con IAP

Nella finestra della console Cloud, fai clic sull'icona del menu in alto a sinistra della pagina, fai clic su Sicurezza e poi su Identity-Aware Proxy.

Poiché è la prima volta che abiliti un'opzione di autenticazione per questo progetto, vedrai un messaggio che ti informa che devi configurare la schermata per il consenso OAuth prima di poter utilizzare IAP.

Fai clic sul pulsante CONFIGURA SCHERMATA DI CONSENSO. Si aprirà una nuova scheda per configurare la schermata per il consenso.

Compila i campi richiesti con i valori appropriati:

Nome applicazione

Esempio IAP

Email dell'assistenza

Il tuo indirizzo email (potrebbe essere già compilato).

Dominio autorizzato

La porzione del nome host dell'URL dell'applicazione, ad esempio iap-example-999999.appspot.com. Puoi vedere l'URL nella barra degli indirizzi della pagina web Hello World aperta in precedenza. Non includere la parte https:// iniziale o il carattere / alla fine dell'URL.Dopo aver inserito questo valore devi premere Invio.

Link alla home page dell'applicazione

l'URL che hai utilizzato per visualizzare la tua app

Link alle norme sulla privacy dell'applicazione

Il link alla pagina della privacy nell'app è uguale al link della home page con l'aggiunta di /privacy alla fine

Fai clic su Salva. Ti verrà chiesto di creare le credenziali. Per questo codelab non è necessario creare le credenziali, quindi puoi semplicemente chiudere questa scheda del browser.

Torna alla pagina Identity-Aware Proxy e aggiornala. Ora dovresti vedere un elenco delle risorse che puoi proteggere.Fai clic sul pulsante di attivazione/disattivazione nella colonna IAP della riga dell'app App Engine per attivare IAP.

Visualizzerai i nomi di dominio che verranno protetti da IAP. Fai clic su ATTIVA.

Ora apri una scheda del browser e vai all'URL della tua app. Si aprirà una schermata Accedi con Google in cui inserire le credenziali per accedere all'app.

Accedi con un account Google o G Suite. Verrà visualizzata una schermata che ti nega l'accesso.

La tua app è correttamente protetta tramite IAP, ma non hai ancora specificato in IAP quali account possono accedere.

Torna alla pagina Identity-Aware Proxy della console e seleziona la casella di controllo accanto all'app App Engine, quindi dai uno sguardo alla barra laterale a destra nella pagina.

Devi aggiungere come membri tutti gli indirizzi email (o indirizzi di Google Gruppi o nomi di dominio G Suite) che devono essere autorizzati ad accedere. Fai clic su AGGIUNGI MEMBRO. Inserisci il tuo indirizzo email, quindi scegli il ruolo Cloud IAP/Utente applicazione web con protezione IAP da assegnare all'indirizzo. Puoi inserire altri indirizzi o domini G Suite nello stesso modo.

Fai clic su Save (Salva). In fondo alla finestra viene visualizzato il messaggio "Policy aggiornata".

Torna alla tua app e ricarica la pagina. A questo punto dovresti vedere la tua app web, in quanto hai già eseguito l'accesso con un utente autorizzato. Tuttavia, potresti ancora visualizzare la pagina "Non disponi dei diritti di accesso" poiché IAP potrebbe non ripetere la verifica della tua autorizzazione. In questo caso, segui questi passaggi:

  • Apri il browser web all'indirizzo della home page con /_gcp_iap/clear_login_cookie aggiunto alla fine dell'URL, come in https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Viene visualizzata una nuova schermata Accedi con Google relativa al tuo account. Non fare clic sull'account, seleziona invece Utilizza un altro account e reinserisci le tue credenziali.
  • Questa procedura fa sì che IAP verifichi nuovamente il tuo accesso. A questo punto dovresti vedere la schermata iniziale della tua applicazione.

Se hai accesso a un altro browser oppure alla Modalità di navigazione in incognito in quello in uso e disponi di un altro account Gmail o G Suite valido, puoi utilizzare quel browser per andare alla pagina della tua app e accedere con l'altro account. Dal momento che quell'account non è autorizzato, invece della tua app vedrai la schermata "Non disponi dei diritti di accesso".

4. Passaggio 2: accedi alle informazioni sull'identità utente

Quando un'app è protetta con IAP, può utilizzare le informazioni sull'identità che IAP fornisce nelle intestazioni delle richieste web che lascia passare. In questo passaggio, l'applicazione riceve l'indirizzo email dell'utente che ha eseguito l'accesso e un ID utente univoco assegnato dal servizio di identità Google (Google Identity Service) a quell'utente. I dati vengono mostrati all'utente nella pagina di benvenuto.

Questo è il passaggio 2 e l'ultimo passaggio è terminato con Cloud Shell aperto nella cartella iap-codelab/1-HelloWorld. In questo passaggio, cambia cartella:

cd ~/iap-codelab/2-HelloUser

Esegui il deployment in App Engine

Dato che il deployment richiede alcuni minuti, inizia a eseguire il deployment dell'app nell'ambiente standard di App Engine per Python 3.7:

gcloud app deploy

Quando ti viene chiesto se vuoi continuare, digita Y per sì. Il deployment dovrebbe completarsi in pochi minuti. Mentre aspetti, puoi esaminare i file dell'applicazione descritti di seguito.

Quando il deployment è pronto, un messaggio confermerà che puoi visualizzare l'applicazione con gcloud app browse. Inserisci il comando. Se nel browser non si apre una nuova scheda, copia il link visualizzato in una nuova scheda come faresti normalmente. Dovresti visualizzare una pagina simile alla seguente:

5b5fb03111258cec.png

Potresti dover attendere qualche minuto prima che la nuova versione della tua applicazione sostituisca quella precedente. Se necessario, aggiorna la pagina. Dovresti vedere una pagina simile a quella riportata sopra.

Esamina i file dell'applicazione

Questa cartella contiene lo stesso set di file che abbiamo visto nel passaggio 1, ma due sono stati cambiati: main.py e templates/index.html. Il programma è stato cambiato per recuperare le informazioni utente che IAP fornisce nelle intestazioni delle richieste: ora il modello visualizza quei dati.

In main.py sono presenti due righe che recuperano i dati di identità forniti da IAP:

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

Le intestazioni X-Goog-Authenticated-User- sono fornite da IAP; i nomi sono senza distinzione tra maiuscole e minuscole, pertanto possono essere forniti a caratteri tutti minuscoli o tutti maiuscoli, se preferibile. L'istruzione render_template ora include quei valori, che possono quindi essere visualizzati:

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

Il template index.html può visualizzare quei valori racchiudendo i nomi tra doppie parentesi graffe:

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

Come puoi vedere, i dati forniti hanno come prefisso accounts.google.com:, per indicare da dove provengono le informazioni. La tua applicazione può rimuovere tutto fino ai due punti inclusi per prendere i valori non elaborati, se opportuno.

Disattiva IAP

Che cosa succede all'app se IAP viene disattivato o in qualche modo ignorato, ad esempio da altre applicazioni in esecuzione nello stesso progetto cloud? Disattiva IAP per scoprirlo.

Nella finestra della console Cloud, fai clic sull'icona del menu in alto a sinistra della pagina, fai clic su Sicurezza e poi su Identity-Aware Proxy. Fai clic sull'opzione di attivazione/disattivazione IAP accanto all'app di App Engine per disattivare IAP.

Sarà visualizzato un avviso che informa che tutti gli utenti potranno accedere all'app.

Aggiorna la pagina web dell'applicazione. Dovresti vedere la stessa pagina ma senza alcuna informazione utente:

17c850de95fea839.png

Ora che l'applicazione non è più protetta, un utente potrebbe inviare una richiesta web che sembra essere passata attraverso IAP. Ad esempio, per farlo, puoi eseguire il seguente comando curl da Cloud Shell (sostituisci <your-url-here> con l'URL della tua app):

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

La pagina web sarà visualizzata sulla riga di comando e avrà questo aspetto:

<!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>

L'applicazione non è in grado in alcun modo di sapere che IAP è stato disattivato o ignorato. Per i casi in cui esiste questo rischio potenziale, il passaggio 3 mostra una soluzione.

5. Passaggio 3: utilizza la verifica crittografica

Se esiste il rischio che IAP sia disattivato o ignorato, la tua app può eseguire un controllo per verificare che le informazioni sull'identità ricevute siano valide. A questo scopo viene utilizzata una terza intestazione della richiesta web aggiunta da IAP e denominata X-Goog-IAP-JWT-Assertion. Il valore dell'intestazione è un oggetto firmato in modo crittografico che contiene anche i dati dell'identità utente. La tua applicazione può verificare la firma digitale e utilizzare i dati forniti nell'oggetto per avere la certezza che siano forniti da IAP senza alterazioni.

La verifica della firma digitale richiede vari altri passaggi, quali ad esempio il recupero del set più recente di chiavi pubbliche di Google. Puoi decidere se la tua applicazione necessita di questi ulteriori passaggi in base al rischio che qualcuno possa disattivare o ignorare l'IAP e in base alla sensibilità dell'applicazione.

Questo è il passaggio 3 e l'ultimo passaggio è terminato con Cloud Shell aperto nella cartella iap-codelab/2-HelloUser. In questo passaggio, cambia cartella:

cd ~/iap-codelab/3-HelloVerifiedUser

Esegui il deployment in App Engine

Esegui il deployment dell'app nell'ambiente standard di App Engine per Python 3.7:

gcloud app deploy

Quando ti viene chiesto se vuoi continuare, digita Y per sì. Il deployment dovrebbe completarsi in pochi minuti. Mentre aspetti, puoi esaminare i file dell'applicazione descritti di seguito.

Quando il deployment è pronto, un messaggio confermerà che puoi visualizzare l'applicazione con gcloud app browse. Inserisci il comando. Se nel browser non si apre una nuova scheda, copia il link visualizzato in una nuova scheda come faresti normalmente.

Ricorda che hai disattivato IAP nel passaggio 2, pertanto all'applicazione non vengono forniti dati IAP. Dovresti visualizzare una pagina simile alla seguente:

8ef2abcc23d96958.png

Come in precedenza, potrebbe essere necessario attendere qualche minuto perché la nuova versione sia pubblicata e visibile online.

Dal momento che IAP è disattivato, non sono disponibili informazioni utente. A questo punto, riattiva IAP.

Nella finestra della console Cloud, fai clic sull'icona del menu in alto a sinistra della pagina, fai clic su Sicurezza e poi su Identity-Aware Proxy. Fai clic sull'opzione attiva/disattiva di IAP accanto all'app di App Engine per riattivarlo.

Aggiorna la pagina. La pagina deve avere il seguente aspetto:

3a4d93c11f228852.png

Osserva che l'indirizzo email fornito dal metodo verificato non ha il prefisso accounts.google.com:.

Se IAP è disattivato o ignorato, i dati verificati mancano o non sono validi, in quanto non possono avere una firma valida a meno che non siano creati da chi detiene le chiavi private di Google.

Esamina i file dell'applicazione

Questa cartella contiene lo stesso set di file del passaggio 2, con due file modificati e un nuovo file. Il nuovo file è auth.py, che fornisce un metodo user() per recuperare e verificare le informazioni sull'identità firmate tramite crittografia. I file modificati sono main.py e templates/index.html, che ora utilizzano i risultati di quel metodo. Vengono mostrate a titolo comparativo le intestazioni non verificate riscontrate nel passaggio 2.

La nuova funzionalità consiste principalmente nella funzione 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 sono i dati firmati in forma criptata forniti nell'intestazione della richiesta specificata. Il codice utilizza una libreria per convalidare e decodificare quei dati. La convalida utilizza le chiavi pubbliche che Google fornisce per controllare i dati che firma e per conoscere i destinatari per cui i dati sono stati preparati (in pratica il progetto Google Cloud che viene protetto). Le funzioni helper keys() e audience() raccolgono e restituiscono questi valori.

L'oggetto firmato contiene due dati che ci servono: l'indirizzo email verificato e il valore ID univoco (disponibile nel campo standard sub, come subscriber).

Il passaggio 3 è completato.

6. Riepilogo

Hai eseguito il deployment di un'applicazione web di App Engine. Nel passaggio 1, hai limitato l'accesso all'applicazione ai soli utenti scelti da te. Nel passaggio 2, hai recuperato e visualizzato l'identità degli utenti che IAP ha autorizzato ad accedere alla tua applicazione e hai visto come le informazioni possono essere soggette a spoofing se IAP è disattivato o ignorato. Nel passaggio 3, hai verificato le asserzioni con firma criptata dell'identità utente, che non possono essere soggette a spoofing.

7. Esegui la pulizia

Le uniche risorse di Google Cloud Platform che hai utilizzato in questo codelab sono le istanze di App Engine. Ogni volta che hai eseguito il deployment dell'app, è stata creata una nuova versione che continua a esistere finché non viene eliminata. Esci dal lab per eliminare il progetto e tutte le risorse al suo interno.