Sécuriser des machines virtuelles avec IAP

Cette page explique comment vous pouvez utiliser le transfert TCP d'IAP pour activer l'accès administratif aux instances de VM qui n'ont pas d'adresse IP externe ou qui ne permettent pas un accès direct sur Internet.

Le transfert TCP d'IAP vous permet d'établir un tunnel chiffré sur lequel vous pouvez transférer le trafic SSH, RDP et tout autre trafic vers des instances de VM. Le transfert TCP d'IAP vous offre également un contrôle précis sur les utilisateurs autorisés à établir des tunnels et les instances de VM auxquelles les utilisateurs sont autorisés à se connecter.

Pour en savoir plus sur le fonctionnement du transfert TCP d'IAP, consultez la Présentation du transfert TCP.

Préparer votre projet pour le transfert TCP d'IAP

Cette section vous guide à travers les étapes nécessaires pour activer le transfert TCP d'IAP dans votre projet Google Cloud.

Créer une règle de pare-feu

Pour permettre à IAP de se connecter à vos instances de VM, créez une règle de pare-feu qui :

  • s'applique à toutes les instances de VM auxquelles vous souhaitez être accessible à l'aide d'IAP ;
  • autorise le trafic entrant à partir de la plage IP 35.235.240.0/20, qui contient toutes les adresses IP qu'IAP utilise pour le transfert TCP ;
  • autorise les connexions à tous les ports que vous souhaitez rendre accessibles à l'aide du transfert TCP d'IAP, par exemple, le port 22 pour SSH et le port 3389 pour RDP.

Console

Pour autoriser l'accès RDP et SSH à toutes les instances de VM de votre réseau, procédez comme suit :

  • Ouvrez la page Règles de pare-feu et cliquez sur Créer une règle de pare-feu.

    Ouvrir la page "Règles de pare-feu"

  • Configurez les paramètres suivants :

    • Nom : allow-ingress-from-iap
    • Sens du trafic : entrée
    • Cible : Toutes les instances du réseau
    • Filtre source : IP ranges
    • Plages d'adresses IP sources : 35.235.240.0/20
    • Protocoles et ports : sélectionnez TCP et saisissez 22,3389 pour autoriser à la fois RDP et SSH.
  • Cliquez sur Créer.

gcloud

Pour autoriser l'accès RDP à toutes les instances de VM de votre réseau, exécutez :

gcloud compute firewall-rules create allow-rdp-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3389 \
  --source-ranges=35.235.240.0/20

Pour l'accès SSH, exécutez :

gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

Pour les autres protocoles, exécutez :

gcloud compute firewall-rules create allow-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:PORT \
  --source-ranges=35.235.240.0/20

PORT est le port utilisé par le protocole.

Accorder des autorisations pour l'utilisation du transfert TCP d'IAP

Pour contrôler les utilisateurs et les groupes autorisés à utiliser le transfert TCP d'IAP et les instances de VM auxquelles ils sont autorisés à se connecter, configurez les autorisations Identity and Access Management.

Nous recommandons d'attribuer tous les rôles suivants aux administrateurs approuvés :

Vous pouvez accorder à un utilisateur ou à un groupe l'accès à toutes les instances de VM d'un projet en configurant des autorisations IAM au niveau du projet :

Console

  1. Ouvrez la page IAM et administration dans Cloud Console.

    Ouvrir la page "IAM et Administration"

  2. Cliquez sur Ajouter et configurez les éléments suivants :

    • Nouveaux membres : spécifiez l'utilisateur ou le groupe auquel vous souhaitez accorder l'accès.
    • Sélectionner un rôle : sélectionnez Cloud IAP > Utilisateur de tunnels sécurisés par IAP.
  3. Vous pouvez également cliquer sur Ajouter une condition et configurer une restriction de membre :

    • Titre : saisissez un nom pour la restriction.
    • Expression : saisissez une condition qu'un utilisateur doit remplir pour pouvoir utiliser IAP pour le transfert TCP.

    Par exemple, l'expression CEL suivante restreint l'accès au port 22 :

    destination.port == 22
    

    Vous pouvez également restreindre l'accès par niveau d'accès :

    destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
    

    FULL_ACCESS_LEVEL_NAME est un niveau d'accès existant et utilise le format accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  4. Cliquez sur Ajouter un autre rôle et configurez les éléments suivants :

    • Sélectionner un rôle : sélectionnez Compute Engine > Administrateur d'instances Compute (v1).
  5. Cliquez sur Ajouter un autre rôle et configurez les éléments suivants :

    • Sélectionner un rôle : sélectionnez Comptes de service > Utilisateur du compte de service.
  6. Cliquez sur Enregistrer.

gcloud

Attribuez les trois rôles à l'utilisateur :

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/iap.tunnelResourceAccessor
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/compute.instanceAdmin.v1
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/iam.serviceAccountUser

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet
  • EMAIL : adresse e-mail de l'utilisateur auquel vous souhaitez accorder l'accès, par exemple user@example.com

Si vous le souhaitez, vous pouvez également configurer le rôle iap.tunnelResourceAccessor par VM (les autres rôles doivent être appliqués au niveau du projet) :

Console

  1. Ouvrez la page d'administration d'IAP et sélectionnez l'onglet Ressources SSH et TCP.

    Ouvrir la page d'administration de BeyondCorp Enterprise

  2. Sélectionnez les instances de VM que vous souhaitez configurer.
  3. Cliquez sur Afficher le panneau d'informations si celui-ci n'est pas visible.
  4. Cliquez sur Ajouter un membre et configurez les éléments suivants :

    • Nouveaux membres : spécifiez l'utilisateur ou le groupe auquel vous souhaitez accorder l'accès.
    • Sélectionner un rôle : sélectionnez Cloud IAP > Utilisateur de tunnels sécurisés par IAP.
  5. Vous pouvez également cliquer sur Ajouter une condition et configurer une restriction de membre :

    • Titre : saisissez un nom pour la restriction.
    • Expression : saisissez une condition qu'un utilisateur doit remplir pour pouvoir utiliser IAP pour le transfert TCP.

    Par exemple, l'expression CEL suivante restreint l'accès au port 22 :

    destination.port == 22
    

    Vous pouvez également restreindre l'accès par niveau d'accès :

    destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
    

    FULL_ACCESS_LEVEL_NAME est un niveau d'accès existant et utilise le format accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  6. Cliquez sur Enregistrer.

API

Pour modifier le fichier policy.json de votre application, procédez comme suit : Pour en savoir plus sur l'utilisation de l'API IAM pour gérer les stratégies d'accès, consultez la page Gérer l'accès aux ressources sécurisées par BeyondCorp Enterprise.

  1. Téléchargez le fichier d'identifiants de votre compte de service.

    1. Accédez à la page Comptes de service.
      Accéder à la page "Comptes de service"

    2. Cliquez sur l'adresse e-mail de votre compte de service.

    3. Cliquez sur Modifier.

    4. Cliquez sur Créer une clé.

    5. Sélectionnez JSON comme type de clé.

    6. Créez une clé en cliquant sur Créer, puis en fermant la fenêtre de confirmation qui s'affiche.

    Votre fichier d'identifiants JSON est désormais téléchargé.

  2. Exportez les variables suivantes.

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  3. Convertissez le fichier d'identifiants JSON de votre compte de service en jeton d'accès OAuth à l'aide de l'outil Oauth2l en exécutant la commande suivante :

    oauth2l header --json ${JSON_CREDS} cloud-platform

  4. Si vous exécutez cette commande pour la première fois, procédez comme suit lorsque vous y êtes invité :

    1. Récupérez le code de validation en cliquant sur le lien affiché et en copiant le code.
    2. Collez le code de validation dans l'invite de votre application.
    3. Copiez le jeton de support renvoyé.
    4. Exportez une nouvelle variable affectée à la valeur de votre jeton de support renvoyé.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. Si vous avez déjà exécuté cette commande, exportez la variable suivante :

    export CLOUD_OAUTH_TOKEN="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

  6. Obtenez la stratégie IAM pour l'instance Compute Engine à l'aide de la méthode getIamPolicy. Le bit de données vide à la fin transforme la requête curl en POST plutôt qu'en GET.

    curl -i -H "${CLOUD_OAUTH_TOKEN}" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  7. Accordez le rôle iap.tunnelResourceAccessor à vos membres en modifiant le fichier JSON de stratégie IAM.

  8. Vous pouvez également ajouter des restrictions aux membres en fonction de conditions IAM et de niveaux d'accès.

    L'exemple suivant présente un fichier policy.json modifié qui lie le rôle iap.tunnelResourceAccessor à un groupe d'administrateurs d'instances de VM, en leur accordant l'accès aux ressources de tunnel sécurisées par BeyondCorp Enterprise. Une condition Cloud IAM a été ajoutée pour ne rendre les ressources accessibles qu'aux membres du groupe "Administrateurs d'instances de VM" avec une adresse IP privée de 10.0.0.1 sur le port 22 à l'aide des conditions IAM destination.ip et destination.port. Ils doivent également répondre aux exigences du niveau d'accès ACCESS_LEVEL_NAME.

    Notez que si un membre possède le rôle Propriétaire, il est autorisé à utiliser IAP pour le transfert TCP.


    Exemple de fichier policy.json

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["group:instance-admins@example.com"],
            "condition": {
              "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }

    Pour trouver un nom de stratégie, appelez accessPolicies.list :

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  9. Définissez votre nouveau fichier policy.json à l'aide de la méthode setIamPolicy.

    curl -i -H "Content-Type:application/json" \
              -H "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
              ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \
              -d @${JSON_NEW_POLICY}
    

Détails des autorisations

Les autorisations requises varient en fonction de la manière dont un utilisateur utilise le transfert TCP d'IAP :

Exemple Autorisations requises
Tous
  • iap.tunnelInstances.accessViaIAP
Utiliser un fichier de cookie (gcloud compute [start-iap-tunnel, ssh, scp])
  • compute.instances.get
  • compute.instances.list
Utiliser un fichier de cookie (gcloud compute [ssh, scp])
  • compute.projects.get
VM utilisant OS Login Veuillez consulter ces instructions.
OS Login n'est pas utilisé
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
Connexion en SSH à une VM à l'aide d'un compte de service
  • iam.serviceAccounts.actAs
SSH depuis le navigateur Veuillez consulter ces instructions.

Par exemple, si un utilisateur souhaite se connecter à l'aide de gcloud compute ssh à une VM qui n'utilise pas OS Login, mais qui utilise un compte de service, il a besoin des autorisations suivantes :

  • iap.tunnelInstances.accessViaIAP
  • compute.instances.get
  • compute.instances.list
  • compute.projects.get
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
  • iam.serviceAccounts.actAs

Tunneliser des connexions SSH

Vous pouvez vous connecter à des instances Linux qui n'ont pas d'adresse IP externe en tunnelisant le trafic SSH via IAP.

Lorsque vous utilisez la tunnellisation IAP, les proxys IAP se connectent à l'adresse IPv4 interne principale de nic0 sur la VM.

Console

Pour vous connecter à votre instance, utilisez le bouton SSH dans Cloud Console. La configuration de l'accès de votre instance (définie via des autorisations IAM) doit autoriser la tunnelisation TCP via IAP.

gcloud

Pour vous connecter à votre instance, exécutez la commande gcloud compute ssh. La configuration de l'accès de votre instance (définie via des autorisations IAM) doit autoriser la tunnelisation TCP via IAP.

gcloud compute ssh INSTANCE_NAME

Remplacez INSTANCE_NAME par le nom de l'instance à laquelle se connecter en SSH.

Si l'instance ne possède pas d'adresse IP externe, la connexion utilise automatiquement la tunnelisation TCP IAP. Si elle possède une adresse IP externe, la connexion utilise cette adresse IP externe au lieu de la tunnelisation TCP IAP.

Vous pouvez utiliser l'option --tunnel-through-iap pour que gcloud compute ssh utilise toujours la tunnellisation TCP d'IAP.

Utilisez l'option --internal-ip pour que gcloud compute ssh n'utilise jamais la tunnelisation TCP d'IAP et se connecte directement à l'adresse IP interne de la VM. Cela est utile pour les clients connectés au même réseau VPC que la VM cible.

IAP Desktop

Vous pouvez utiliser IAP Desktop pour vous connecter à une instance de VM en utilisant SSH et le transfert TCP d'IAP.

  1. Dans l'application, sélectionnez Fichier > Ajouter un projet Google Cloud.

  2. Saisissez l'ID ou le nom de votre projet, puis cliquez sur OK.

  3. Dans la fenêtre Explorateur de projets, effectuez un clic droit sur l'instance de VM à laquelle vous souhaitez vous connecter et sélectionnez Connexion.

IAP Desktop

Pour en savoir plus sur IAP Desktop, consultez la page du projet GitHub.

PuTTY

Vous pouvez configurer PuTTY de sorte qu'il utilise le transfert TCP d'IAP pour se connecter à une instance de VM. La configuration de l'accès de votre instance (définie via des autorisations IAM) doit autoriser la tunnelisation TCP via IAP.

Avant de configurer PuTTY, utilisez la commande gcloud compute ssh une fois pour vous assurer que vous disposez d'une clé SSH privée sur votre ordinateur local et que votre clé SSH publique est publiée dans Compute Engine :

  1. Ouvrez une invite de commande et exécutez la commande suivante pour vous connecter à l'instance de VM :

    gcloud compute ssh INSTANCE_NAME `
      --tunnel-through-iap `
      --project PROJECT_ID `
      --zone ZONE
    

    Remplacez les éléments suivants :

    • INSTANCE_NAME : nom de l'instance à laquelle se connecter.
    • PROJECT_ID : ID du projet dans lequel se trouve l'instance de VM.
    • ZONE : zone où se trouve l'instance de VM.

    Si nécessaire, confirmez que vous souhaitez générer des clés SSH en appuyant sur Y.

  2. Sur la VM, déterminez votre nom d'utilisateur en exécutant la commande suivante :

    whoami
    

    Vous aurez besoin de ce nom d'utilisateur ultérieurement.

Vous pouvez maintenant configurer PuTTY pour utiliser le transfert TCP d'IAP :

  1. Ouvrez PuTTY et sélectionnez la catégorie Connection > Proxy (Connexion > Proxy).
  2. Configurez les paramètres de proxy suivants :

    • Pour Proxy type (Type de proxy), sélectionnez Local.
    • Dans le champ Telnet command, or local proxy command (Commande Telnet ou commande proxy locale), saisissez les informations suivantes :

      gcloud.cmd compute start-iap-tunnel %host %port --listen-on-stdin --project PROJECT_ID --zone ZONE
      

      Remplacez les éléments suivants :

      • PROJECT_ID : ID du projet dans lequel se trouve l'instance de VM.
      • ZONE : zone où se trouve l'instance de VM.
    • Pour Print proxy diagnostics in the terminal window (Imprimer les diagnostics de proxy dans la fenêtre du terminal), sélectionnez Only until session starts (Seulement jusqu'au démarrage de la session).

  3. Sélectionnez la catégorie Connection > SSH > Auth (Connexion > SSH > Authentification).

  4. Cliquez sur Browse (Parcourir) et collez le nom de fichier suivant, puis cliquez sur Open (Ouvrir) :

    %USERPROFILE%\.ssh\google_compute_engine.ppk
    
  5. Sélectionnez la catégorie Session.

  6. Configurez les paramètres de proxy suivants :

    • Dans le champ Hostname (or IP address) (Nom d'hôte (ou adresse IP)), saisissez les informations suivantes :

      USERNAME@INSTANCE_NAME
      

      Remplacez les éléments suivants :

      • USERNAME : nom d'utilisateur Linux que vous avez déterminé précédemment.
      • INSTANCE_NAME : nom de l'instance de VM à laquelle vous souhaitez vous connecter.
    • Saved sessions (Sessions enregistrées) : saisissez un nom pour la session.

  7. Cliquez sur Enregistrer.

  8. Cliquez sur Open (Ouvrir) pour démarrer la session SSH.

Tunneliser des connexions RDP

Vous pouvez vous connecter à des instances Windows qui n'ont pas d'adresse IP externe en tunnelisant le trafic RDP via IAP :

IAP Desktop

Vous pouvez utiliser IAP Desktop pour vous connecter au Bureau à distance d'une ou plusieurs instances de VM à l'aide du transfert TCP d'IAP.

  1. Dans l'application, sélectionnez Fichier > Ajouter un projet Google Cloud.

  2. Saisissez l'ID ou le nom de votre projet, puis cliquez sur OK.

  3. Dans la fenêtre Explorateur de projets, effectuez un clic droit sur l'instance de VM à laquelle vous souhaitez vous connecter et sélectionnez Connexion.

IAP Desktop

Pour en savoir plus sur IAP Desktop, consultez la page du projet GitHub.

gcloud

Pour vous connecter au Bureau à distance d'une instance de VM, vous créez d'abord un tunnel.

  1. À l'aide de la commande gcloud compute start-iap-tunnel, créez un tunnel chiffré vers le port RDP de l'instance de VM.

    gcloud compute start-iap-tunnel INSTANCE_NAME 3389 \
        --local-host-port=localhost:LOCAL_PORT \
        --zone=ZONE
    

    Remplacez INSTANCE_NAME par le nom de l'instance de VM à laquelle vous souhaitez vous connecter. Remplacez LOCAL_PORT par le port localhost où vous souhaitez lier le proxy, ou utilisez 0 pour qu'un port non utilisé soit automatiquement sélectionné. Remplacez ZONE par la zone où se trouve l'instance de VM.

  2. gcloud effectue un test de connectivité avec l'instance de VM, puis ouvre un tunnel et affiche un numéro de port.

    Listening on port [LOCAL_PORT].
    

    Tout le trafic envoyé à localhost:LOCAL_PORT est transféré à l'instance de VM. Le port n'est accessible que par les applications exécutées sur votre ordinateur local.

  3. Laissez gcloud en cours d'exécution et ouvrez l'application Microsoft Windows Remote Desktop Connection.

  4. Saisissez le point de terminaison du tunnel comme nom d'ordinateur :

    localhost:LOCAL_PORT
    

    Remplacez LOCAL_PORT par le numéro de port affiché lorsque le tunnel a été ouvert par gcloud.

  5. Cliquez sur Connecter.

Tunneliser d'autres connexions TCP

Vous pouvez utiliser le transfert TCP d'IAP pour d'autres protocoles basés sur TCP en exécutant la commande gcloud compute start-iap-tunnel pour allouer un port local. Le port local achemine via un tunnel le trafic de données de la machine locale vers la machine distante dans un flux HTTPS. IAP reçoit ensuite les données, applique des contrôles d'accès et transfère les données désencapsulées au port distant. À l'inverse, toutes les données du port distant sont également encapsulées avant d’être envoyées au port local, où elles sont ensuite désencapsulées.

gcloud

Créez un tunnel chiffré vers un port de l'instance de VM :

gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT \
    --local-host-port=localhost:LOCAL_PORT \
    --zone=ZONE

Remplacez INSTANCE_NAME et INSTANCE_PORT par le nom et le port de l'instance de VM à laquelle vous souhaitez vous connecter. Remplacez LOCAL_PORT par le port localhost où vous souhaitez lier le proxy. Remplacez ZONE par la zone où se trouve l'instance de VM.

gcloud effectue un test de connectivité avec l'instance de VM, puis ouvre un tunnel et affiche un numéro de port.

Listening on port [LOCAL_PORT].

Tout le trafic envoyé à localhost:LOCAL_PORT est transféré à l'instance de VM. Le port n'est accessible que par les applications exécutées sur votre ordinateur local.

Limites connues

Bande passante : la fonctionnalité de transfert TCP d'IAP n'est pas conçue pour le transfert de données de manière groupée. IAP se réserve le droit de limiter le débit des utilisateurs en cas d'abus de ce service.

Longueur de la connexion : IAP déconnecte automatiquement les sessions après 1 heure d'inactivité. Nous vous recommandons d'intégrer à votre logique applicative la gestion du rétablissement d'un tunnel lorsqu'il est déconnecté.

Étapes suivantes