Autenticazione degli utenti con Identity-Aware Proxy

Autenticare gli utenti della tua app web è spesso necessaria e in genere richiede una programmazione speciale nell'app. Per le app 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à attraverso i passaggi della creazione della tua applicazione, della limitazione dell'accesso e dell'acquisizione dell'identità utente da IAP.

Cosa imparerai a realizzare

In questo codelab, creerai un'applicazione web minima con Google App Engine, quindi esplorerai vari modi per utilizzare Identity-Aware Proxy per limitare l'accesso all'applicazione e per fornire informazioni sull'identità dell'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:

  • Come scrivere ed eseguire il deployment di una semplice app App Engine utilizzando 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 è incentrato su 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.

Utilizzerai l'ambiente a riga di comando di Cloud Shell. Per prima cosa, apri l'ambiente e recuperalo con il codice di esempio.

Avvia 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 indicati sotto il pulsante.

Tutti i comandi in questo codelab verranno eseguiti in Cloud Shell per il progetto che è stato creato e aperto per te. Apri Cloud Shell facendo clic sull'icona Attiva Cloud Shell che si trova sul lato destro dell'intestazione della pagina della console. Nella metà inferiore della pagina potrai inserire ed eseguire i comandi.

I comandi potrebbero essere eseguiti dal tuo PC, ma devi prima installare e configurare il software di sviluppo necessario. Cloud Shell ha già tutti gli strumenti software di cui hai bisogno.

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 iap-codelab

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

Questa è un'applicazione standard di App Engine scritta in Python 3.7 che mostra 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 per 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 del modello è in templates/index.html e per questo passaggio contiene solo HTML normale. Un secondo file di modello contiene una bozza di norme sulla privacy di esempio in templates/privacy.html.

Sono presenti altri due file: requirements.txt elenca tutte le librerie Python non predefinite utilizzate dall'applicazione e app.yaml indica a Google Cloud Platform che si tratta di un'applicazione Python 3.7 di App Engine.

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

cat main.py

In alternativa, puoi aprire l'editor di codice di Cloud Shell facendo clic sull'icona a forma di matita in alto a destra nella 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

È possibile che ti venga chiesto di scegliere un'area geografica in cui eseguire il deployment. Seleziona le opzioni nelle vicinanze con la dicitura "supporta standard" Quando ti viene chiesto se vuoi continuare, digita Y sì.

Dopo qualche minuto, il deployment dovrebbe essere completato e vedrai un messaggio che indica che puoi visualizzare la tua applicazione con gcloud app browse. Inserisci il comando. Se nel browser non si apre una nuova scheda, fai clic sul link visualizzato per aprirla in una nuova scheda o copiarla in una nuova scheda aperta 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.

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

Limitare l'accesso con IAP

Nella finestra di Cloud Console, fai clic sull'icona del menu in alto a sinistra nella pagina, quindi su Sicurezza e Identity-Aware Proxy.

Poiché è la prima volta che attivi un'opzione di autenticazione per questo progetto, verrà visualizzato un messaggio che ti chiede di configurare la schermata di consenso OAuth prima di poter utilizzare gli IAP.

Fai clic sul pulsante CONFIGURA LA 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 di 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 visualizzarla nella barra degli indirizzi della pagina web Hello World che hai aperto in precedenza. Non includere il simbolo https:// iniziale o finale / 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 sulla 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. Non è necessario creare le credenziali per questo codelab, quindi puoi semplicemente chiudere questa scheda del browser.

Torna alla pagina Identity-Aware Proxy e aggiornala. A questo punto, dovresti vedere un elenco delle risorse che puoi proteggere.

Fai clic sul pulsante di attivazione/disattivazione nella colonna IAP nella riga dell'app App Engine per attivare IAP.

Vedrai i nomi di dominio che saranno protetti da IAP. Fai clic su ATTIVA.

Ora apri una scheda del browser e vai all'URL della tua app. Verrà visualizzata una schermata Accedi con Google che ti chiederà di accedere 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 User IAP/IAP-Secured Web App da assegnare a tale 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 "Criterio aggiornato".

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 hai accesso", poiché IAP potrebbe non controllare nuovamente la tua autorizzazione. In questo caso, segui questi passaggi:

  • Apri il browser web all'indirizzo della home page aggiungendo /_gcp_iap/clear_login_cookie alla fine dell'URL, ad esempio 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".

Quando un'app è protetta con IAP, può utilizzare le informazioni sull'identità che IAP fornisce nelle intestazioni delle richieste 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

Eseguire il deployment in App Engine

Poiché il deployment richiede alcuni minuti, inizia eseguendo 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, vedrai un messaggio che indica 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:

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 insieme di file visualizzato nel passaggio 1, ma due dei file sono stati modificati: 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.

Sono presenti due righe in main.py che ricevono i dati sull'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 e i nomi non fanno distinzione tra maiuscole e minuscole, quindi potrebbero essere espressi in minuscolo o in lettere maiuscole. 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 sono preceduti da accounts.google.com, che indica la provenienza delle 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 di Cloud Console, fai clic sull'icona del menu in alto a sinistra nella pagina, quindi su Sicurezza e Identity-Aware Proxy. Fai clic sul pulsante di attivazione/disattivazione IAP accanto all'app 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:

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

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

La pagina web verrà visualizzata nella riga di comando e avrà il seguente 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. Nei casi in cui questo rappresenta un potenziale rischio, il passaggio 3 mostra una soluzione.

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. Utilizza un'intestazione di richiesta di terze parti aggiunta da IAP, chiamata 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 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, vedrai un messaggio che indica 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, quindi all'applicazione non viene fornito alcun dato IAP. Dovresti visualizzare una pagina simile alla seguente:

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 di Cloud Console, fai clic sull'icona del menu in alto a sinistra nella pagina, quindi su Sicurezza e Identity-Aware Proxy. Fai clic sul pulsante di attivazione/disattivazione IAP accanto all'app App Engine per riattivare IAP.

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

Tieni presente 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 insieme di file visualizzato nel 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à crittografiche. I file modificati sono main.py e templates/index.html, che ora utilizzano i risultati di questo metodo. Anche le intestazioni non verificate, come indicato nel passaggio 2, sono mostrate per il confronto.

La nuova funzionalità si trova 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 è il dato crittografico fornito 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 di cui abbiamo bisogno: l'indirizzo email verificato e il valore ID univoco (fornito nel campo sub per l'abbonato, il campo standard).

Il passaggio 3 è completato.

Hai eseguito il deployment di un'applicazione web di App Engine. Nel passaggio 1, hai limitato l'accesso all'applicazione ai soli utenti che hai scelto. Nel passaggio 2, hai recuperato e visualizzato l'identità degli utenti a cui IAP consentiva l'accesso alla tua applicazione e hai visto come le informazioni potrebbero essere sottoposte a spoofing se IAP veniva disattivato o ignorato. Nel passaggio 3, hai verificato le asserzioni con firma crittografica dell'identità dell'utente, che non possono essere oggetto di spoofing.

Le uniche risorse Google Cloud Platform utilizzate in questo codelab sono le istanze di App Engine. Ogni volta che hai eseguito il deployment dell'app, è stata creata una nuova versione che continuerà a esistere fino all'eliminazione. Esci dal lab per eliminare il progetto e tutte le risorse al suo interno.