Autenticación de usuarios con Identity-Aware Proxy

Autenticación de usuarios con Identity-Aware Proxy

Acerca de este codelab

subjectÚltima actualización: nov 20, 2021
account_circleEscrito por engelke

1. Introducción

Con frecuencia, deberá autenticar los usuarios de su aplicación web, y para esto suele ser necesario realizar en ella una programación especial. En las aplicaciones de Google Cloud Platform, puede transferir esas responsabilidades al servicio Identity-Aware Proxy. Si solamente necesita restringir el acceso a determinados usuarios, no tendrá que realizar cambios en la aplicación. En caso de que la aplicación deba conocer la identidad del usuario (por ejemplo, para mantener las preferencias del usuario del lado del servidor), Identity-Aware Proxy puede hacerlo con un código mínimo de la aplicación.

¿Qué es Identity-Aware Proxy?

Identity-Aware Proxy (IAP) es un servicio de Google Cloud Platform que intercepta las solicitudes web enviadas a su aplicación, autentica mediante el servicio de identidad de Google al usuario que hace la solicitud y solo deja pasar las solicitudes si provienen de un usuario que usted autorice. Además, puedes modificar los encabezados de las solicitudes para que incluyan información sobre el usuario autenticado.

En este codelab, te explicaremos cómo crear tu propia aplicación, restringir el acceso a ella y obtener la identidad del usuario desde IAP.

Qué compilarás

En este codelab, compilarás una aplicación web mínima con Google App Engine y, luego, explorarás varias formas de usar Identity-Aware Proxy para restringir el acceso a la aplicación y proporcionarle información de identidad del usuario. Tu app hará lo siguiente:

  • Mostrar una página de bienvenida
  • Acceder a la información de identidad del usuario que brinda IAP
  • Usar la verificación criptográfica para impedir que se falsifique la información de identidad del usuario

Qué aprenderás

  • Cómo escribir e implementar una aplicación simple de App Engine con Python 3.7
  • Cómo habilitar o inhabilitar IAP para restringir el acceso a tu app
  • Cómo trasladar la información de identidad del usuario de IAP a tu app
  • Cómo verificar de manera criptográfica la información de IAP para protegerte de la falsificación de identidad

Requisitos

  • Un navegador web moderno, como Chrome
  • Conocimientos básicos del lenguaje de programación Python

Este codelab se enfoca en Google App Engine y en IAP. Los conceptos y los bloques de código no relevantes se pasan por alto y se proporcionan para que simplemente los copies y pegues.

2. Cómo prepararte

Trabajarás en el entorno de la línea de comandos de Cloud Shell. Para comenzar, abre ese entorno y recupera el código de muestra en él.

Inicia la consola y Cloud Shell

En la parte superior izquierda de la página del lab, haz clic en el botón Abrir la consola de Google. Deberás acceder con el nombre de usuario y la contraseña que se muestran debajo del botón.

Todos los comandos de este codelab se ejecutarán en Cloud Shell para el proyecto que se creó y abrió para ti. Para abrir Cloud Shell, haz clic en el ícono Activar Cloud Shell que se encuentra en el lado derecho del encabezado de la página de la consola. La mitad inferior de la página te permitirá ingresar y ejecutar comandos.Los comandos pueden ejecutarse desde tu propia PC, pero primero debes instalar y configurar el software de desarrollo necesario. Cloud Shell ya cuenta con todas las herramientas de software que necesitas.

Descarga el código

En Cloud Shell, haz clic en el área de la línea de comandos para poder escribir los comandos. Recupere el código de GitHub y, luego, cambie a la carpeta del código:

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

Esa carpeta contiene una subcarpeta por cada paso de este codelab. Deberás cambiar a la carpeta correcta para completar cada paso.

3. Paso 1: Implementa la aplicación y protégela con IAP

Esta es una aplicación para el entorno estándar de App Engine escrita en Python 3.7 que simplemente muestra un mensaje de “Hello, World” página de bienvenida. Lo que haremos será implementarla, probarla y usar IAP para restringir el acceso a ella.

Revisa el código de la aplicación

Cambia de la carpeta principal del proyecto a la subcarpeta 1-HelloWorld que contiene el código para este paso.

cd 1-HelloWorld

El código de la aplicación se encuentra en el archivo main.py. Utiliza el framework web Flask para responder las solicitudes web con el contenido de una plantilla. Ese archivo de plantilla está en templates/index.html y, para este paso, contiene solo HTML simple. Un segundo archivo de plantilla contiene un ejemplo básico de una política de privacidad en templates/privacy.html.

Hay dos archivos más: requirements.txt enumera todas las bibliotecas de Python no predeterminadas que usa la aplicación y app.yaml le indica a Google Cloud Platform que esta es una aplicación de App Engine de Python 3.7.

Puedes usar el comando cat para que se muestre cada archivo en la shell, como en el siguiente ejemplo:

cat main.py

O puedes abrir el editor de código de Cloud Shell haciendo clic en el ícono de lápiz en la parte superior derecha de la ventana de Cloud Shell y examinar el código de esa manera.

No es necesario que modifiques ningún archivo para este paso.

Implemente en App Engine

Ahora implementa la app en el entorno estándar de App Engine para Python 3.7

gcloud app deploy

Es posible que debas elegir una región para realizar la implementación. Selecciona cualquiera cerca de ti que diga que "es compatible con el nivel estándar". Cuando se te pregunte si quieres continuar, presiona Y para indicar que sí.

La implementación debería completarse después de unos minutos y verás un mensaje en el que se indicará que puedes ver tu aplicación con gcloud app browse. Escriba ese comando. Si no se abre una pestaña nueva en tu navegador, haz clic en el vínculo que se muestra para abrirla en una pestaña nueva o, de ser necesario, cópialo y pégalo en una pestaña nueva que hayas abierto manualmente. Como esta es la primera vez que se ejecuta la aplicación, tardará unos segundos en aparecer mientras se inicia una instancia en la nube. Deberías ver la siguiente ventana:

1c1c0b166c6023e.png

Para ver esa página web, puedes abrir esa misma URL desde cualquier computadora conectada a Internet. El acceso aún no está restringido.

Restringe el acceso con IAP

En la ventana de la consola de Cloud, haz clic en el ícono de menú que se encuentra en la esquina superior izquierda de la página, luego en Seguridad y, por último, en Identity-Aware Proxy.

Dado que es la primera vez que habilitas una opción de autenticación para este proyecto, verás un mensaje en el que se indica que debes configurar la pantalla de consentimiento de OAuth para poder usar IAP.

Haz clic en el BOTÓN CONFIGURAR PANTALLA DE CONSENTIMIENTO. Se abrirá una nueva pestaña para configurar la pantalla de consentimiento.

Completa los espacios en blanco requeridos con los valores correspondientes:

Nombre de la aplicación

Ejemplo de IAP

Correo electrónico de asistencia

tu dirección de correo electrónico. es posible que ya se haya completado por ti.

Dominio autorizado

la parte del nombre de host de la URL de la aplicación, p.ej., iap-example-999999.appspot.com. Puedes verla en la barra de direcciones de la página web Hello World que visitaste antes. No incluyas el comienzo https:// ni la última / de esa URL.Debes presionar Intro después de completar este valor.

Vínculo a la página principal de la aplicación

la URL que utilizaste para ver tu app

Vínculo a la política de privacidad de la aplicación

El vínculo a la página de la privacidad en la app, al igual que el vínculo a la página principal, con /privacy al final

Haga clic en Guardar. Se le indicará que cree las credenciales. Como no es necesario que crees credenciales para este codelab, puedes cerrar la pestaña del navegador.

Regresa a la página de Identity-Aware Proxy y actualízala. Ahora deberías ver una lista de los recursos que puedes proteger.Haz clic en el botón de activación en la columna IAP, en la fila de la aplicación de App Engine, para activar IAP.

Verás los nombres de dominio que IAP protegerá. Haz clic en ACTIVAR.

Ahora, abre una pestaña del navegador y navega a la URL de tu aplicación. Verás una pantalla de Acceder con Google en la que se te indicará que accedas a la aplicación.

Accede con una cuenta de Google o G Suite. Verás una pantalla en la cual se denegará el acceso.

Logró proteger correctamente su aplicación con IAP, pero aún no le indicó a IAP qué cuentas tienen que poder acceder.

Regrese a la página de Identity-Aware Proxy de Console, seleccione la casilla de verificación junto a la aplicación de App Engine y consulte la barra lateral a la derecha de la página.

Deberá agregar como Miembro cada dirección de correo electrónico (o dirección de Grupos de Google o nombre de dominio de G Suite) que deba poder acceder. Haz clic en AGREGAR MIEMBRO. Ingresa tu dirección de correo electrónico y, luego, elige el rol Usuario de aplicación web protegida con IAP/Cloud IAP para asignarlo a esa dirección. Puede ingresar más direcciones o dominios de G Suite de la misma manera.

Haz clic en Guardar. Aparecerá el mensaje “Se actualizó la política” en la parte inferior de la ventana.

Regresa a tu app y vuelve a cargar la página. Ahora deberías ver tu app web, dado que ya accediste con un usuario que autorizaste. Sin embargo, es posible que sigas viendo el mensaje "No tienes acceso" ya que es posible que IAP no vuelva a comprobar su autorización. En ese caso, completa los siguientes pasos:

  • Abre el navegador web en la dirección de la página principal con /_gcp_iap/clear_login_cookie agregado al final de la URL, como en https://iap-example-999999.appspot.com/_gcp_iap/clear_login_cookie.
  • Ahora verás una nueva pantalla de Acceder con Google en la que ya se mostrará tu cuenta. No hagas clic en la cuenta, sino en Usar otra cuenta, y vuelva a ingresar sus credenciales.
  • Si completa estos pasos, IAP volverá a verificar su acceso, tras lo cual debería ver la pantalla principal de su aplicación.

Si tiene acceso a otro navegador o puede usar el modo Incógnito en su navegador, y si tiene otra cuenta válida de Gmail o G Suite, puede usar ese navegador para ir hasta la página de su aplicación y acceder con la otra cuenta. Dado que no se autorizó esa cuenta, verás la pantalla “No tienes acceso” en lugar de tu aplicación.

4. Paso 2: Accede a la información de identidad del usuario

Cuando una aplicación está protegida con IAP, puedes utilizar la información de identidad que IAP proporciona en los encabezados de la solicitud web que pasa por este servicio. En este paso, la aplicación obtendrá la dirección de correo electrónico del usuario que accedió y un ID persistente de usuario único que el servicio de identidad de Google asignó a ese usuario. Esos datos se mostrarán al usuario en la página de bienvenida.

Este es el paso 2, y el último finalizó con Cloud Shell abierto en la carpeta iap-codelab/1-HelloWorld. Cambie a la carpeta de este paso:

cd ~/iap-codelab/2-HelloUser

Realiza la implementación en App Engine

Como la implementación tardará algunos minutos, primero implementa la aplicación en el entorno estándar de App Engine para Python 3.7:

gcloud app deploy

Cuando se te pregunte si quieres continuar, presiona Y para indicar que sí. La implementación debería completarse después de algunos minutos. Mientras esperas, puedes examinar los archivos de la aplicación como se describe a continuación.

Cuando la implementación esté lista, verás un mensaje en el cual se indicará que puedes ver tu aplicación con gcloud app browse. Escriba ese comando. Si no se abre una nueva pestaña en tu navegador, copia el vínculo que se muestra y ábrelo normalmente en otra pestaña. Deberías ver una página similar a la siguiente:

5b5fb03111258cec.png

Quizás debas esperar algunos minutos para que la nueva versión de tu aplicación reemplace a la versión anterior. En caso de ser necesario, actualiza la página para ver una página similar a la de arriba.

Examina los archivos de la aplicación

Esta carpeta contiene el mismo conjunto de archivos que el paso 1, pero se modificaron dos de ellos: main.py y templates/index.html. El programa se modificó para que recupere la información del usuario que IAP proporciona en los encabezados de solicitud, y la plantilla ahora muestra esos datos.

En main.py, hay dos líneas que obtienen los datos de identidad proporcionados por IAP:

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

IAP proporciona los encabezados X-Goog-Authenticated-User-, y los nombres no distinguen mayúsculas de minúsculas, por lo que puedes escribirlos todo en mayúsculas o todo en minúsculas si así lo prefieres. La instrucción render_template ahora incluye esos valores para que puedan mostrarse:

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

La plantilla index.html puede mostrar esos valores con los nombres entre llaves dobles:

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

Como puedes ver, los datos proporcionados tienen el prefijo accounts.google.com: para mostrar de dónde provino la información. Tu aplicación puede quitar todo hasta los dos puntos (incluidos) para obtener los valores sin procesar, si así lo deseas.

Desactive IAP

¿Qué sucederá con esta aplicación si IAP se inhabilita o se omite de alguna manera (por ejemplo, debido a la ejecución de otras aplicaciones en tu mismo proyecto en la nube)? Desactiva IAP para averiguarlo.

En la ventana de la consola de Cloud, haz clic en el ícono de menú que se encuentra en la esquina superior izquierda de la página, luego en Seguridad y, por último, en Identity-Aware Proxy. Para desactivarla, haz clic en el interruptor junto a la aplicación de App Engine.

Se le advertirá que todos los usuarios podrán acceder a la aplicación.

Actualiza la página web de la aplicación. Deberías ver la misma página, pero sin información del usuario:

17c850de95fea839.png

Como la aplicación ahora está desprotegida, un usuario podría enviar una solicitud web que parecería haber pasado por IAP. Para hacerlo, por ejemplo, puedes ejecutar el siguiente comando curl desde Cloud Shell (reemplaza <your-url-here> por la URL correcta de tu app):

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

La página web se mostrará en la línea de comandos y será similar a los siguientes ejemplos:

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

La aplicación no tiene manera de saber que se inhabilitó o se omitió IAP. Para los casos en los que existe un posible riesgo, en el paso 3 se muestra una solución.

5. Paso 3: Usa la verificación criptográfica

Si existe el riesgo de que se desactive o se omita IAP, tu app puede realizar una verificación para asegurarse de que la información de identidad que recibe sea válida. Para ello, se usa un tercer encabezado de solicitud web que agrega IAP, llamado X-Goog-IAP-JWT-Assertion. El valor del encabezado es un objeto con firma criptográfica que también contiene los datos de identidad del usuario. Tu aplicación puede verificar la firma digital y usar los datos proporcionados en este objeto para asegurarse de que los haya proporcionado IAP sin alteraciones.

La verificación de la firma digital requiere varios pasos adicionales, como la recuperación del conjunto más reciente de claves públicas de Google. Puedes decidir si tu aplicación necesita estos pasos adicionales en función del riesgo de que alguien pueda omitir o desactivar IAP, y según la sensibilidad de la aplicación.

Este es el paso 3, y el último finalizó con Cloud Shell abierto en la carpeta iap-codelab/2-HelloUser. Cambie a la carpeta de este paso:

cd ~/iap-codelab/3-HelloVerifiedUser

Implemente en App Engine

Implementa la aplicación en el entorno estándar de App Engine para Python 3.7:

gcloud app deploy

Cuando se te pregunte si quieres continuar, presiona Y para indicar que sí. La implementación debería completarse después de algunos minutos. Mientras esperas, puedes examinar los archivos de la aplicación como se describe a continuación.

Cuando la implementación esté lista, verás un mensaje en el cual se indicará que puedes ver tu aplicación con gcloud app browse. Escriba ese comando. Si no se abre una nueva pestaña en tu navegador, copia el vínculo que se muestra y ábrelo normalmente en otra pestaña.

Recuerda que inhabilitaste IAP en el paso 2, por lo que no se proporcionan datos de IAP a la aplicación. Deberías ver una página similar a la siguiente:

8ef2abcc23d96958.png

Como antes, quizás debas esperar algunos minutos para que esté activa la versión más nueva de la página y puedas verla.

Dado que IAP está inhabilitado, no hay información de usuario disponible. Ahora, vuelve a activar IAP.

En la ventana de la consola de Cloud, haz clic en el ícono de menú que se encuentra en la esquina superior izquierda de la página, luego en Seguridad y, por último, en Identity-Aware Proxy. Para volver a activar IAP, haz clic en el interruptor junto a la aplicación de App Engine.

Actualice la página. Debería ser como la siguiente:

3a4d93c11f228852.png

Ten en cuenta que la dirección de correo electrónico que proporciona el método verificado no tiene el prefijo accounts.google.com:.

Si se desactiva o se omite IAP, faltarán los datos verificados o estos no serán válidos, dado que no pueden tener una firma válida a menos que los haya creado el titular de las claves privadas de Google.

Examina los archivos de la aplicación

Esta carpeta contiene el mismo conjunto de archivos que aparece en el paso 2, pero se modificaron dos de los archivos y hay uno nuevo. El archivo nuevo es auth.py, que proporciona un método user() para recuperar y verificar la información de identidad con firma criptográfica. Los archivos modificados son main.py y templates/index.html, que ahora usan los resultados de ese método. A modo de comparación, también se muestran los encabezados sin verificar que se encuentran en el paso 2.

La nueva funcionalidad se encuentra, principalmente, en la función 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 son los datos con firma criptográfica que se proporcionan en el encabezado de la solicitud especificado. El código usa una biblioteca para validar y decodificar esos datos. La validación utiliza las claves públicas que proporciona Google para verificar los datos que firma y averiguar para qué público se prepararon los datos (básicamente, el proyecto de Google Cloud que se protege). Las funciones auxiliares keys() y audience() recopilan y muestran esos valores.

El objeto con firma tiene dos datos que necesitamos: la dirección de correo electrónico verificada y el valor de ID único (proporcionado en el campo estándar sub de suscriptor).

Aquí termina el paso 3.

6. Resumen

Implementaste una aplicación web de App Engine. En el Paso 1, restringiste el acceso a la aplicación solo a los usuarios que tú elijas. En el paso 2, recuperaste y mostraste la identidad de los usuarios a los que IAP permitió acceder a tu aplicación, y viste cómo esa información podría falsificarse si se inhabilitara o se omitiera IAP. En el paso 3, verificaste las aserciones con firma criptográfica para que no se pueda falsificar la identidad del usuario.

7. Limpieza

Los únicos recursos de Google Cloud Platform que usaste en este codelab son las instancias de App Engine. Cada vez que implementaste la app, se creó una versión nueva que sigue existiendo hasta que se borra. Sal del lab para borrar el proyecto y todos los recursos que contiene.