Sécuriser des machines virtuelles avec IAP

Cette page explique comment utiliser le transfert TCP Identity-Aware Proxy (IAP) pour activer l'accès administrateur aux instances de VM qui ne possèdent pas d'adresse IP externe ou qui n'autorisent pas un accès direct via 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 que vous souhaitez rendre accessibles à 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 :

  1. Ouvrez la page "Règles de pare-feu".

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

    Les étapes restantes apparaîtront automatiquement dans la console Google Cloud.

  2. Sélectionnez un projet Google Cloud. Démonstration
  3. Sur la page "Règles de pare-feu", cliquez sur Créer une règle de pare-feu.
  4. Configurez les paramètres suivants :
    • Nom : allow-ingress-from-iap
    • Sens du trafic : entrée
    • Cible : Toutes les instances du réseau
    • Filtre source : Plages d'adresses IP
    • 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.
  5. 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 rôles pour le transfert TCP IAP

Pour contrôler les utilisateurs et les groupes autorisés à utiliser le transfert TCP IAP et les instances de VM auxquelles ils sont autorisés à se connecter, attribuez les rôles IAM (Identity and Access Management) appropriés au projet.

Le tableau suivant présente les rôles prédéfinis que vous devez attribuer aux administrateurs de confiance pour le transfert TCP et les tâches associées:

Tâche Rôles Informations complémentaires
Transfert TCP Utilisateur de tunnels sécurisés par IAP (roles/iap.tunnelResourceAccessor) Consultez Accorder l'accès à toutes les instances de VM d'un projet ou Accorder l'accès à une VM spécifique.
Accès SSH Administrateur d'instances Compute (v1) (roles/compute.instanceAdmin.v1)
OS Login (recommandé) Divers Consultez la section Configurer les rôles OS Login sur les comptes utilisateur.
Utiliser un compte de service Utilisateur du compte de service (roles/iam.serviceAccountUser) Consultez la section Rôle serviceAccountUser.

Si vous souhaitez créer des rôles personnalisés avec uniquement les autorisations spécifiques nécessaires pour cette tâche, consultez la section Détails des autorisations.

Vous pouvez accorder à un utilisateur ou à un groupe l'accès à toutes les instances de VM d'un projet ou à une VM spécifique, selon le mode d'attribution des rôles requis.

Accorder l'accès à toutes les instances de VM d'un projet

Vous pouvez autoriser un utilisateur ou un groupe à accéder à toutes les instances de VM d'un projet en attribuant les rôles IAM requis au niveau du projet:

Console

  1. Ouvrez la page IAM et administration dans la console Google Cloud.

    Ouvrir la page "IAM et administration"

    Les étapes restantes apparaîtront automatiquement dans la console Google Cloud.

  2. Sur la page IAM et administration, cliquez sur Ajouter et configurez les paramètres suivants :
    • Nouveaux comptes principaux : spécifiez l'utilisateur ou le groupe auquel vous souhaitez accorder des droits d'accès.
    • Sélectionnez 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 condition :
    • Titre : saisissez un nom pour la condition.
    • Expression : saisissez une condition qu'un utilisateur doit remplir pour obtenir les autorisations dans le rôle "Utilisateur de tunnels sécurisés par IAP".

    Par exemple, l'expression CEL suivante n'accorde l'accès qu'au port 22 :

    destination.port == 22

    Vous pouvez également accorder l'accès en fonction du 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 suivant:

    accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME

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

gcloud

Attribuez les deux rôles à l'utilisateur en exécutant les commandes suivantes :

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

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

Accorder l'accès à une VM spécifique

Pour accorder à un utilisateur ou à un groupe l'accès à une VM spécifique, vous devez attribuer le rôle roles/iap.tunnelResourceAccessor sur cette VM. Les autres rôles doivent être attribués au niveau du projet.

Console

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

    Ouvrir la page d'administration de BeyondCorp Enterprise

    Les étapes restantes apparaîtront automatiquement dans la console Google Cloud.

  2. Dans l'onglet Ressources SSH et TCP de la page d'administration d'IAP, 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 compte principal et configurez les éléments suivants :

    • Nouveaux comptes principaux : spécifiez l'utilisateur ou le groupe auquel vous souhaitez accorder des droits d'accès.
    • Sélectionnez 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 condition :

    • Titre : saisissez un nom pour la condition.
    • Expression : saisissez une condition qu'un utilisateur doit remplir pour obtenir les autorisations dans le rôle "Utilisateur de tunnels sécurisés par IAP".

    Par exemple, l'expression CEL suivante n'accorde l'accès qu'au port 22 :

          destination.port == 22

    Vous pouvez également accorder l'accès en fonction du 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. Exportez les variables suivantes.

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  2. 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 "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  3. Attribuez le rôle iap.tunnelResourceAccessor à vos comptes principaux en modifiant le fichier JSON de la stratégie IAM.

  4. Vous pouvez éventuellement n'accorder le rôle qu'aux comptes principaux qui répondent à des critères spécifiques, en fonction des conditions IAM et des niveaux d'accès.

    Voici un exemple de fichier policy.json modifié qui attribue le rôle iap.tunnelResourceAccessor à un groupe d'administrateurs d'instances de VM, leur donnant ainsi accès aux ressources de tunnel sécurisées par BeyondCorp Enterprise. Une condition IAM a été ajoutée pour rendre les ressources accessibles uniquement aux comptes principaux 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 compte principal dispose du 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
    
  5. Définissez votre nouveau fichier policy.json à l'aide de la méthode setIamPolicy.

    curl -i -H "Content-Type:application/json" \
              -H "Authorization: Bearer $(gcloud auth print-access-token)" \
              ${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
Tout
  • 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 de la console Google Cloud. 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.

Application PuTTY

Vous pouvez configurer l'application d'émulateur de terminal Windows PuTTY de sorte qu'elle utilise le transfert TCP 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 l'application PuTTY, exécutez 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 sur 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 l'application PuTTY pour qu'elle utilise le transfert TCP IAP:

  1. Ouvrez l'application 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.

ssh

Vous pouvez utiliser directement la commande ssh avec une option ProxyCommand qui utilise gcloud pour démarrer le tunnel. Utilisez cette commande pour générer la commande ssh complète:

gcloud compute ssh INSTANCE_NAME --dry-run

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.

Augmenter la bande passante d'importation TCP d'IAP

Pour augmenter la bande passante d'importation TCP d'IAP, envisagez d'installer NumPy sur la machine sur laquelle gcloud CLI est installé.

Linux

Pour installer Numpy sur une plate-forme Unix à l'aide de pip, exécutez la commande suivante dans une nouvelle instance de terminal:

$(gcloud info --format="value(basic.python_location)") -m pip install numpy
Pour en savoir plus, consultez la page NumPy.org.

Si le message d'erreur persiste après l'installation de NumPy, procédez comme suit : Exécutez la commande suivante pour autoriser gcloud à accéder aux packages externes:

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Windows

Pour installer NumPy à l'aide de pip sur les plates-formes Windows, exécutez la commande suivante dans une nouvelle instance de PowerShell:

start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
Pour en savoir plus, consultez la page NumPy.org.

Si le message persiste après l'installation de NumPy, vous devez effectuer une autre étape. Exécutez la commande suivante pour autoriser gcloud à accéder aux packages externes:

$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"

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

Durée de la connexion: IAP déconnecte automatiquement les sessions après une heure d'inactivité. Actuellement, gcloud compute start-iap-tunnel tente de rétablir le tunnel s'il se déconnecte.

Étapes suivantes