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 permet aux employés d'afficher, 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 passer par un réseau privé virtuel (VPN). 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 télétravailleurs, que ce soit sur site ou dans le cloud. Vous bénéficiez ainsi d'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 les envoie à l'aide de Google Identity Service et ne les laisse passer que si elles proviennent d'un utilisateur autorisé à accéder à l'application. En outre, il peut modifier les en-têtes des requêtes pour inclure des informations sur l'utilisateur authentifié.

Objectifs de l'atelier

  • Configurer un groupe de points de terminaison du réseau sans serveur (NEG)
  • 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 modifier à 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. généralement, vous ne vous souciez pas de ce que c’est. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (il est généralement identifié comme PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre au hasard. Vous pouvez également essayer la vôtre pour voir si elle est disponible. Il ne peut pas être modifié après cette étape et restera actif pendant toute la durée du projet.
  • Pour votre information, il existe une troisième valeur, le numéro de projet, utilisé par certaines API. 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 arrêter les ressources afin d'éviter que des frais ne vous soient facturés au-delà de ce tutoriel, vous pouvez supprimer les ressources que vous avez créées ou l'ensemble du projet. 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 de service IAP et Cloud Resource Manager
gcloud services enable \
    iap.googleapis.com \
    cloudresourcemanager.googleapis.com \
    cloudidentity.googleapis.com \
    compute.googleapis.com
  1. Clonez le dépôt de l'exemple d'application et accédez 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 que le script soit terminé 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 "Service URL" (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 de l'employé. 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 distribution et de session, les vérifications de l'é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 NEG sans serveur pour diriger 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éer le proxy HTTPS cible pour acheminer 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].

Limiter le trafic d'entrée au service Cloud Run

Restreignez le trafic entrant pour qu'il n'accepte que les requêtes internes et les requêtes provenant de l'équilibrage de charge HTTP(S).

26cb0b2a9162e7ab.png

  1. Mettre à 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 apparaît désormais 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 de l'application plutôt que des pare-feu au niveau du réseau.

d9740402a74370a8.png

Une marque correspond à l'écran de consentement OAuth qui contient les informations de branding destinées aux utilisateurs. Les marques peuvent être réservé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 à toute personne ayant accès à Internet.

  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éer un client en utilisant le 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 code 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 la console Cloud, sélectionnez le projet dans le menu déroulant de sélection.
  2. Accédez à l'écran de consentement OAuth dans la console Cloud.

bcb460f3ab5241f4.png

  1. Cliquez sur EXTERNE sous "Type d'utilisateur".
  2. Sélectionner "Test" pour l'état de publication

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 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 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 qui vous ont été attribués pour cet atelier.

f7e0318388aa0739.png

  1. Fermer le navigateur

Accorder aux utilisateurs l'accès au portail des employés

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

Vérifier 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 à présent 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 d'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.