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 en la app de Cymbal Eats. Usarás Identity Aware Proxy (IAP) para proteger el acceso al portal sin usar una red privada virtual (VPN). 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 aplicaciones.

94b06525c85408ad.png

¿Qué es Identity-Aware Proxy?

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

Qué aprenderás

  • Cómo configurar un grupo de extremos de red (NEG) sin servidores
  • 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 te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, 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 te facture 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 proyectos y 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 del servicio de IAP y de 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 de 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

Resultado de ejemplo

...
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 (NEG) sin servidores

Crearás un grupo de extremos de red sin servidores( NEG sin servidores) para el servicio de IU de Cloud Run de los empleados. 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 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 de tu 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 URL
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

Resultado de ejemplo

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

Restringir el tráfico de entrada para que solo acepte solicitudes internas y solicitudes que provengan del balanceo de cargas HTTP(S)

26cb0b2a9162e7ab.png

  1. Actualizar 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

Resultado de ejemplo

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 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 de 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 con 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. Ve a la pantalla de consentimiento de OAuth en la consola de Cloud.

bcb460f3ab5241f4.png

  1. Haz clic en CREAR EXTERNO en Tipo de usuario.
  2. Selecciona Testing (Prueba) como el estado de publicación (Publishing status).

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. Obtener URL del servicio
echo https://$DOMAIN

Resultado de ejemplo

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

352b600209c3fb33.png

  1. Accede con tus credenciales del lab.

f7e0318388aa0739.png

  1. Cierra el navegador.

Otorga acceso de usuario al portal de empleados

  1. Agrega una vinculación de política de IAM para la función de 'roles/iap.httpsResourceAccessor' en 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'

Resultado de ejemplo

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

Prueba el acceso a los servicios

Confirma que se haya otorgado acceso al portal de empleados

  1. Obtener URL del servicio
echo https://$DOMAIN

Resultado de ejemplo

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

86416f68c0b8152a.png

Ahora deberías tener acceso al portal para empleados.

(Opcional) Implementa todas las dependencias. La implementación de estos microservicios puede tardar unos 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.