Protege las aplicaciones sin servidores con Identity-Aware Proxy (IAP)

1. Descripción general

En este lab, implementarás el portal de empleados que les permite ver, actualizar y borrar pedidos desde la app de Cymbal Eats. Usarás Identity Aware Proxy (IAP) para proteger el acceso al portal sin usar una red privada virtual (VPN). La IAP simplifica la implementación de un modelo de acceso de confianza cero y lleva menos tiempo que una VPN para los trabajadores remotos, tanto en entornos locales como en la nube, con un único punto de control para administrar el acceso a tus apps.

94b06525c85408ad.png

¿Qué es Identity-Aware Proxy?

Identity-Aware Proxy (IAP) es un servicio de Google Cloud que intercepta las solicitudes que se envían a tu aplicación, autentica al usuario que hace la solicitud mediante el servicio de identidad de Google y solo acepta las solicitudes si provienen de un usuario autorizado para acceder a la aplicación. Además, puede modificar los encabezados de la solicitud para incluir información sobre el usuario autenticado.

Qué aprenderás

  • Cómo configurar un grupo de extremos de red sin servidores (NEG)
  • Cómo configurar un balanceador de cargas
  • Cómo habilitar IAP para restringir el acceso
  • Cómo restringir el acceso con IAP

2. Configuración y requisitos

Cómo configurar el entorno a tu propio ritmo

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (suele identificarse como PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá durante todo el proyecto.
  • Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Configuración del entorno

  1. Crea variables de entorno relacionadas con el proyecto y los recursos
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export REGION=us-east1
export ORDER_SERVICE_URL=order-service
export INVENTORY_SERVICE_URL=inventory-service
export MENU_SERVICE_URL=menu-service
  1. Habilita las APIs de los servicios de IAP y Cloud Resource Manager
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. Clona el repositorio de la app de ejemplo y navega al directorio
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. Implementa el portal para empleados con la secuencia de comandos de configuración. Espera a que se complete la secuencia de comandos antes de continuar con el siguiente paso.
./setup.sh

Ejemplo de resultado:

...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. Haz clic en el vínculo URL del servicio.

86416f68c0b8152a.png

3. Configura un grupo de extremos de red sin servidores (NEG)

Crearás un grupo de extremos de red sin servidores( NEG sin servidores) para el servicio de Cloud Run de la IU del empleado. Los NEG sin servidores te permiten usar apps sin servidores de Google Cloud con balanceo de cargas de HTTP(S) externo.

2abe669e53c27186.png

  1. Crea un grupo de extremos de red para el servicio de la IU del empleado.
gcloud compute network-endpoint-groups create employee-ui-iap-neg \
    --project $PROJECT_ID \
    --region=$REGION \
    --network-endpoint-type=serverless  \
    --cloud-run-service=employee-ui-service

Resultado de ejemplo:

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/regions/us-east1/networkEndpointGroups/employee-ui-iap-neg].
Created network endpoint group [employee-ui-iap-neg].

Crea un servicio de backend y agrega el NEG sin servidores

Un servicio de backend define cómo Cloud Load Balancing distribuye el tráfico. La configuración del servicio de backend contiene un conjunto de valores, como el protocolo que se usa para conectarse a backends, varios parámetros de configuración de distribución y sesión, verificaciones de estado y tiempos de espera. Esta configuración proporciona un control detallado sobre el comportamiento del balanceador de cargas.

  1. Crear un servicio de backend
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

Resultado de ejemplo:

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
NAME: employee-ui-iap-backend
BACKENDS:
PROTOCOL: HTTP
  1. Agrega el NEG sin servidores como un backend al servicio de backend
gcloud compute backend-services add-backend employee-ui-iap-backend \
    --global \
    --network-endpoint-group=employee-ui-iap-neg \
    --network-endpoint-group-region=$REGION

Resultado de ejemplo:

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. Crea un mapa de URL para enrutar las solicitudes entrantes al servicio de backend
gcloud compute url-maps create employee-ui-iap-url-map \
    --default-service employee-ui-iap-backend
Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/urlMaps/employee-ui-iap-url-map].
NAME: employee-ui-iap-url-map
DEFAULT_SERVICE: backendServices/employee-ui-iap-backend

4. Configura los componentes del balanceador de cargas

En el siguiente diagrama, se muestra que el balanceador de cargas usa un backend de NEG sin servidores para dirigir las solicitudes a un servicio de Cloud Run sin servidores.

335f4674737a6514.png

Reserva una dirección IP estática

  1. Reserva una dirección IPv4 estática y almacena el dominio
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

Resultado de ejemplo:

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/addresses/employee-ui-iap-ip].
  1. Almacena el dominio nip.io
export DOMAIN=$(gcloud compute addresses list --filter employee-ui-iap-ip --format='value(ADDRESS)').nip.io

Crea un recurso de certificado SSL administrado por Google

  1. Crea un recurso de certificado SSL administrado por Google
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

Resultado de ejemplo:

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/sslCertificates/employee-ui-iap-cert].
NAME: employee-ui-iap-cert
TYPE: MANAGED
CREATION_TIMESTAMP: 2022-04-18T06:39:37.474-07:00
EXPIRE_TIME:
MANAGED_STATUS: PROVISIONING

34.102.234.98.nip.io: PROVISIONING

Crea un proxy HTTPS de destino

  1. Crea el proxy HTTPS de destino para enrutar las solicitudes a tu mapa de URLs.
gcloud compute target-https-proxies create employee-ui-iap-http-proxy \
    --ssl-certificates employee-ui-iap-cert \
    --url-map employee-ui-iap-url-map

Resultado de ejemplo:

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/targetHttpsProxies/employee-ui-iap-http-proxy].
NAME: employee-ui-iap-http-proxy
SSL_CERTIFICATES: employee-ui-iap-cert
URL_MAP: employee-ui-iap-url-map
CERTIFICATE_MAP:

Configura reglas de reenvío

  1. Crea una regla de reenvío para enrutar las solicitudes entrantes al proxy
gcloud compute forwarding-rules create employee-ui-iap-forwarding-rule \
    --load-balancing-scheme=EXTERNAL \
    --network-tier=PREMIUM \
    --address=employee-ui-iap-ip \
    --global \
    --ports=443 \
    --target-https-proxy employee-ui-iap-http-proxy

Ejemplo de resultado:

Created [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/forwardingRules/employee-ui-iap-forwarding-rule].

Restringe la entrada al servicio de Cloud Run

Restringe el tráfico de entrada para que solo acepte solicitudes internas y las que llegan a través del balanceo de cargas de HTTP(S).

26cb0b2a9162e7ab.png

  1. Actualiza el servicio para permitir solo el tráfico de entrada de solicitudes internas y solicitudes a través del balanceador de cargas HTTP(S)
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

Ejemplo de resultado:

OK Deploying... Done.                            
  OK Creating Revision...
  OK Routing traffic...
Done.
Service [employee-ui-service] revision [employee-ui-service-00001-quw] has been deployed and is serving 100 percent of traffic.
Service URL: https://employee-ui-service-gbtuuy5eda-uk.a.run.app
  1. Haz clic en el vínculo URL del servicio.

8505fde7e0784bf1.png

El acceso a la URL del servicio de Cloud Run ahora se muestra como prohibido.

5. Habilita Cloud Identity-Aware Proxy (IAP) en el balanceador de cargas

IAP te permite establecer una capa de autorización central para las aplicaciones a las que se accede a través de HTTPS. Puedes usar un modelo de control de acceso a nivel de la aplicación en lugar de firewalls a nivel de red.

d9740402a74370a8.png

Una marca es la pantalla de consentimiento de OAuth que contiene información de desarrollo de la marca para los usuarios. Es posible que las marcas estén restringidas a usuarios internos o públicos. Una marca interna permite que un miembro de la misma organización de Google Workspace que el proyecto acceda al flujo de OAuth. Una marca pública hace que el flujo de OAuth sea accesible para cualquier persona que tenga acceso a Internet.

  1. Crea una marca
export USER_EMAIL=$(gcloud config list account --format "value(core.account)")

gcloud alpha iap oauth-brands create \
    --application_title="Cymbal Eats" \
    --support_email=$USER_EMAIL

Resultado de ejemplo:

Created [462858740426].
applicationTitle: Cymbal Eats
name: projects/462858740426/brands/462858740426
orgInternalOnly: true

Crea un cliente de OAuth para IAP

  1. Crea un cliente con el nombre de la marca del paso anterior
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

Resultado de ejemplo:

Created [462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com].
displayName: cymbal-eats-employee-ui
name: projects/462858740426/brands/462858740426/identityAwareProxyClients/462858740426-tkpv8n03opijg7erd3s9ccued2pfllsd.apps.googleusercontent.com
secret: [secret-removed]
  1. Almacena el nombre, el ID y el secreto del cliente
export CLIENT_NAME=$(gcloud alpha iap oauth-clients list \
    projects/$PROJECT_NUMBER/brands/$PROJECT_NUMBER --format='value(name)' \
    --filter="displayName:cymbal-eats-employee-ui")

export CLIENT_ID=${CLIENT_NAME##*/}

export CLIENT_SECRET=$(gcloud alpha iap oauth-clients describe $CLIENT_NAME --format='value(secret)')
  1. En la consola de Cloud, selecciona el proyecto en el menú desplegable de selección de proyectos.
  2. Navega a la pantalla de consentimiento de OAuth en la consola de Cloud.

bcb460f3ab5241f4.png

  1. Haz clic en HACER EXTERNO en Tipo de usuario.
  2. Selecciona Pruebas como el estado de publicación.

27fd7de6e7b7ef21.png

  1. Haz clic en CONFIRMAR.

6. Restringe el acceso con IAP

Restringe el acceso al servicio de backend con IAP y, luego, verifica que no se pueda acceder a la aplicación.

  1. Habilita IAP en el servicio de backend
gcloud iap web enable --resource-type=backend-services \
    --oauth2-client-id=$CLIENT_ID \
    --oauth2-client-secret=$CLIENT_SECRET \
    --service=employee-ui-iap-backend

Verifica la configuración de IAP

  1. Verifica que el certificado SSL esté ACTIVO
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. Cómo obtener la URL del servicio
echo https://$DOMAIN

Ejemplo de resultado:

https://34.102.234.98.nip.io
  1. Haz clic en la URL del servicio para abrir el portal para empleados.

352b600209c3fb33.png

  1. Accede con tus credenciales del lab.

f7e0318388aa0739.png

  1. Cierra el navegador.

Otorga acceso de usuario al portal para empleados

  1. Agrega una vinculación de política de IAM para el rol de 'roles/iap.httpsResourceAccessor' para el usuario creado en el paso anterior.
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

Ejemplo de resultado:

Updated IAM policy for backend service [projects/462858740426/iap_web/compute/services/employee-ui-iap-backend].

Cómo probar el acceso al servicio

Confirma que se otorgó acceso al portal para empleados

  1. Cómo obtener la URL del servicio
echo https://$DOMAIN

Ejemplo de resultado:

https://34.102.234.98.nip.io
  1. Haz clic en la URL del servicio para abrir el portal para empleados.

86416f68c0b8152a.png

Ahora deberías tener acceso al portal para empleados.

(Opcional) Implementa todas las dependencias. La implementación de estos microservicios puede tardar alrededor de 20 minutos.

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

./setup.sh
./get-site-urls.sh

7. ¡Felicitaciones!

¡Felicitaciones! Completaste el codelab.

¿Qué sigue?

Explora otros codelabs de Cymbal Eats:

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.