Sécuriser une application sans serveur avec Identity-Aware Proxy (IAP)

1. Présentation

Dans cet atelier, vous allez déployer le portail des employés qui leur permet de consulter, de mettre à jour et de supprimer des commandes depuis l'application Cymbal Eats. Vous allez utiliser Identity Aware Proxy (IAP) pour sécuriser l'accès au portail sans utiliser de réseau privé virtuel (VPN). L'IAP simplifie l'implémentation d'un modèle d'accès "zéro confiance" et prend moins de temps qu'un VPN pour les travailleurs à distance, à la fois sur site et dans les environnements cloud. Il offre un point de contrôle unique pour gérer l'accès à vos applications.

94b06525c85408ad.png

Qu'est-ce qu'Identity-Aware Proxy ?

Identity-Aware Proxy (IAP) est un service Google Cloud qui intercepte les requêtes envoyées à votre application, authentifie l'utilisateur qui effectue la requête à l'aide de Google Identity Service et transmet la requête seulement si elle provient d'un utilisateur autorisé à accéder à l'application. De plus, IAP peut modifier les en-têtes de la requête pour inclure des informations sur l'utilisateur authentifié.

Objectifs de l'atelier

  • Configurer un groupe de points de terminaison du réseau (NEG) sans serveur
  • Configurer un équilibreur de charge
  • Activer IAP pour restreindre l'accès
  • Restreindre l'accès à l'aide d'IAP

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pouvez le mettre à jour à tout moment.
  • L'ID du projet est unique parmi tous les projets Google Cloud et non modifiable une fois défini. La console Cloud génère automatiquement une chaîne unique (en général, vous n'y accordez d'importance particulière). Dans la plupart des ateliers de programmation, vous devrez indiquer l'ID de votre projet (généralement identifié par PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre de manière aléatoire. Vous pouvez également en spécifier un et voir s'il est disponible. Après cette étape, l'ID n'est plus modifiable et restera donc le même pour toute la durée du projet.
  • Pour information, il existe une troisième valeur (le numéro de projet) que certaines API utilisent. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour désactiver les ressources et éviter ainsi que des frais ne vous soient facturés après ce tutoriel, vous pouvez supprimer le projet ou les ressources que vous avez créées. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai gratuit pour bénéficier d'un crédit de 300 $.

Configuration de l'environnement

  1. Créer des variables d'environnement liées au projet et aux ressources
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. Activer les API du service IAP et du service Cloud Resource Manager
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. Cloner le dépôt de l'application exemple et accéder au répertoire
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/employee-ui
  1. Déployez le portail des employés à l'aide du script de configuration. Attendez la fin de l'exécution du script avant de passer à l'étape suivante.
./setup.sh

Exemple de résultat :

...
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. Cliquez sur le lien "URL du service".

86416f68c0b8152a.png

3. Configurer un groupe de points de terminaison du réseau sans serveur (NEG)

Vous allez créer un groupe de points de terminaison du réseau sans serveur( NEG sans serveur) pour le service Cloud Run de l'UI des employés. Les NEG sans serveur vous permettent d'utiliser des applications sans serveur Google Cloud avec un équilibrage de charge HTTP(S) externe.

2abe669e53c27186.png

  1. Créez un groupe de points de terminaison du réseau pour le service d'UI des employés.
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

Exemple de résultat

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].

Créer un service de backend et ajouter le NEG sans serveur

Un service de backend définit la manière dont Cloud Load Balancing répartit le trafic. La configuration du service de backend contient un ensemble de valeurs, telles que le protocole utilisé pour se connecter aux backends, divers paramètres de répartition et de gestion des sessions, les vérifications d'état et les délais avant expiration. Ces paramètres permettent de contrôler précisément le comportement de votre équilibreur de charge.

  1. Créer un service de backend
gcloud compute backend-services create employee-ui-iap-backend \
        --global 

Exemple de résultat

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. Ajouter le NEG sans serveur en tant que backend au service 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

Exemple de résultat

Updated [https://www.googleapis.com/compute/v1/projects/cymbal-eats-18147-25762/global/backendServices/employee-ui-iap-backend].
  1. Créer un mappage d'URL pour acheminer les requêtes entrantes vers le service 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. Configurer les composants de l'équilibreur de charge

Le schéma suivant montre que l'équilibreur de charge utilise un backend de NEG sans serveur pour envoyer les requêtes vers un service Cloud Run sans serveur.

335f4674737a6514.png

Réserver une adresse IP statique

  1. Réserver une adresse IPv4 statique et stocker le domaine
gcloud compute addresses create employee-ui-iap-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

Exemple de résultat

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

Créer une ressource de certificat SSL géré par Google

  1. Créer une ressource de certificat SSL géré par Google
gcloud compute ssl-certificates create employee-ui-iap-cert \
    --description=employee-ui-iap-cert \
    --domains=$DOMAIN \
    --global

Exemple de résultat

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

Créer un proxy HTTPS cible

  1. Créez le proxy HTTPS cible pour rediriger les requêtes vers votre mappage d'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

Exemple de résultat

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:

Configurer des règles de transfert

  1. Créer une règle de transfert pour acheminer les requêtes entrantes vers le 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

Exemple de résultat :

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

Restreindre l'entrée au service Cloud Run

Limitez le trafic entrant à n'accepter que les requêtes internes et les requêtes provenant de l'équilibrage de charge HTTP(S).

26cb0b2a9162e7ab.png

  1. Mettez à jour le service pour n'autoriser que le trafic entrant provenant des requêtes internes et des requêtes via l'équilibreur de charge HTTP(S).
gcloud run services update employee-ui-service \
    --ingress internal-and-cloud-load-balancing \
    --region $REGION

Exemple de résultat :

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. Cliquez sur le lien "URL du service".

8505fde7e0784bf1.png

L'accès à l'URL du service Cloud Run est désormais signalé comme interdit.

5. Activer Cloud Identity-Aware Proxy (IAP) sur l'équilibreur de charge

IAP vous permet d'établir une couche d'autorisation centrale pour les applications accessibles via HTTPS. Vous pouvez utiliser un modèle de contrôle des accès au niveau des applications au lieu de pare-feu au niveau du réseau.

d9740402a74370a8.png

Une marque est l'écran de consentement OAuth qui contient des informations sur la marque pour les utilisateurs. Les marques peuvent être limitées aux utilisateurs internes ou publics. Une marque interne permet à un membre de la même organisation Google Workspace que le projet d'accéder au flux OAuth. Une marque publique rend le flux OAuth accessible à tous les internautes.

  1. Créer une marque
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

Exemple de résultat

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

Créer un client OAuth IAP

  1. Créez un client à l'aide du nom de la marque de l'étape précédente.
gcloud alpha iap oauth-clients create \
    projects/$PROJECT_ID/brands/$PROJECT_NUMBER \
    --display_name=cymbal-eats-employee-ui

Exemple de résultat

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. Stocker le nom, l'ID et le secret du client
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. Dans Cloud Console, sélectionnez le projet dans le menu déroulant de sélection des projets.
  2. Accédez à l'écran de consentement OAuth dans Cloud Console.

bcb460f3ab5241f4.png

  1. Cliquez sur "MAKE EXTERNAL" (RENDRE EXTERNE) sous "User Type" (Type d'utilisateur).
  2. Définissez l'état de publication sur "Test".

27fd7de6e7b7ef21.png

  1. Cliquez sur "CONFIRMER".

6. Restreindre l'accès avec IAP

Limitez l'accès au service de backend à l'aide d'IAP, puis vérifiez que l'application est inaccessible.

  1. Activer l'IAP sur le service 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

Vérifier la configuration de l'IAP

  1. Vérifier que le certificat SSL est ACTIF
gcloud compute ssl-certificates list --format='value(MANAGED_STATUS)'
  1. Obtenir l'URL du service
echo https://$DOMAIN

Exemple de résultat :

https://34.102.234.98.nip.io
  1. Cliquez sur l'URL du service pour ouvrir le portail des employés.

352b600209c3fb33.png

  1. Connectez-vous à l'aide des identifiants de l'atelier.

f7e0318388aa0739.png

  1. Fermer le navigateur

Accorder l'accès au portail des employés à un utilisateur

  1. Ajouter une liaison de stratégie IAM pour le rôle 'roles/iap.httpsResourceAccessor' de l'utilisateur créé à l'étape précédente
gcloud iap web add-iam-policy-binding \
    --resource-type=backend-services \
    --service=employee-ui-iap-backend \
    --member=user:$USER_EMAIL \
    --role='roles/iap.httpsResourceAccessor'

Exemple de résultat :

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

Tester l'accès aux services

Confirmer que l'accès au portail des employés a été accordé

  1. Obtenir l'URL du service
echo https://$DOMAIN

Exemple de résultat :

https://34.102.234.98.nip.io
  1. Cliquez sur l'URL du service pour ouvrir le portail des employés.

86416f68c0b8152a.png

Vous devriez maintenant avoir accès au portail des employés.

(Facultatif) Déployez toutes les dépendances. Le déploiement de ces microservices peut prendre environ 20 minutes.

unset ORDER_SERVICE_URL
unset INVENTORY_SERVICE_URL
unset MENU_SERVICE_URL

cd ~/cymbal-eats

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

7. Félicitations !

Félicitations, vous avez terminé cet atelier de programmation.

Étapes suivantes :

Découvrez les autres ateliers de programmation Cymbal Eats:

Effectuer un nettoyage

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez chaque ressource individuellement.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.