Utiliser SSH pour Cloud Run

Cette page explique comment utiliser SSH pour se connecter aux services Cloud Run via le transfert TCP d'Identity-Aware Proxy (IAP).

En sécurisant vos connexions SSH avec IAP, vous pouvez déboguer des instances de conteneur individuelles dans un environnement sécurisé.

Avant de commencer

  1. Assurez-vous que votre service Cloud Run s'exécute dans un environnement d'exécution de deuxième génération et qu'il inclut tous les outils de débogage dont vous avez besoin pour exécuter des commandes une fois connecté. Pour en savoir plus, consultez Environnements d'exécution.
  2. Pour vous assurer que vous utilisez la dernière version de la Google Cloud CLI, exécutez la commande suivante :

    gcloud components update
    
  3. Activez les API Cloud Run, Cloud Resource Manager, Cloud OS Login et Identity-Aware Proxy dans votre projet.

    Pour activer les API, exécutez la commande suivante :

    gcloud services enable \
        cloudresourcemanager.googleapis.com \
        oslogin.googleapis.com \
        iap.googleapis.com \
        run.googleapis.com
    

Rôles requis

Pour obtenir les autorisations nécessaires pour configurer des règles et vous connecter à des charges de travail, demandez à votre administrateur de vous accorder les rôles IAM suivants :

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Limites

SSH pour Cloud Run présente les limites suivantes :

  • Seuls les services et instances Cloud Run sont compatibles.
  • Pour les services, seul l'environnement d'exécution de deuxième génération est compatible.
  • Les jobs Cloud Run ne sont pas compatibles.
  • Les pools de nœuds de calcul ne sont pas acceptés.
  • Lorsque vous utilisez SSH, les clés d'hôte de l'image sont écrasées. Les clés restent écrasées après la fin de la session SSH, jusqu'au redémarrage du service.
  • Windows : PuTTY n'est pas compatible. Utilisez le client OpenSSH.

Configurer des règles d'autorisation IAP

Vous pouvez gérer l'accès aux ressources Cloud Run au niveau du projet, de la région ou du service à l'aide de la gcloud CLI ou de l'API REST IAP.

Vous pouvez configurer des règles pour les identifiants d'API Cloud Identity suivants :

  • Cloud Identity : par exemple, user:EMAIL@example.com
  • Fédération des identités des employés : par exemple : principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

Pour en savoir plus et obtenir des exemples de types de comptes principaux, consultez la liste des identifiants de comptes principaux.

Mettre à jour un service Cloud Run existant

Pour mettre à jour le service afin d'activer SSH, exécutez la commande suivante :

gcloud beta run services update \
    SERVICE_NAME \
    --region=LOCATION \
    --ssh

Remplacez les éléments suivants :

  • SERVICE_NAME : nom de votre service Cloud Run.
  • LOCATION : Google Cloud région où le service est déployé (par exemple, us-central1).

Vous pouvez également déployer un service Cloud Run en ajoutant --ssh à gcloud beta run deploy.

Accorder l'accès à toutes les ressources Cloud Run d'un projet

Pour gérer l'accès à toutes les ressources d'un projet, appliquez la liaison de stratégie IAM au niveau du projet.

gcloud

Exécutez la commande suivante :

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run

Remplacez USER par l'identifiant principal de l'utilisateur, par exemple user:user@example.com ou le compte principal de Workforce Identity Federation.

API REST

Envoyez une requête POST au point de terminaison de la stratégie du projet :

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun:setIamPolicy"

Remplacez les éléments suivants :

  • USER : identifiant principal de l'utilisateur.
  • PROJECT_NUMBER : numéro du projet Google Cloudoù les ressources sont hébergées.

Accorder l'accès à toutes les ressources Cloud Run dans un emplacement spécifique

Pour restreindre l'accès à toutes les ressources d'une région spécifique (par exemple, us-central1), appliquez la liaison de stratégie au niveau de l'emplacement.

gcloud

Exécutez la commande ci-dessous.

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --region=LOCATION

Remplacez les éléments suivants :

  • USER : identifiant principal de l'utilisateur.
  • LOCATION : Google Cloud région où les ressources sont déployées (par exemple, us-central1).

API REST

Envoyez une requête POST au point de terminaison de la règle d'emplacement :

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
LOCATION:setIamPolicy"

Remplacez les éléments suivants :

  • USER : identifiant principal de l'utilisateur
  • PROJECT_NUMBER : numéro de projet Google Cloud
  • LOCATION : région Google Cloud

Accorder l'accès à un service Cloud Run spécifique

Pour limiter l'accès à un seul service nommé dans votre projet, appliquez la liaison de stratégie au niveau du service.

gcloud

Exécutez la commande ci-dessous.

gcloud beta iap tcp add-iam-policy-binding \
    --member='USER' \
    --role='roles/iap.tunnelResourceAccessor' \
    --resource-type=cloud-run \
    --service=SERVICE_NAME \
    --region=LOCATION

Remplacez les éléments suivants :

  • USER : identifiant principal de l'utilisateur
  • SERVICE_NAME : nom de la logique de service à laquelle se connecter
  • LOCATION : région Google Cloud dans laquelle le service est déployé

API REST

Envoyez une requête POST au point de terminaison de la règle de service :

curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -d '{
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["USER"]
          }
        ]
      }
    }' \
    "https://iap.googleapis.com/v1/projects/\
    PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
    LOCATION/services/\
    SERVICE_NAME:setIamPolicy"

Remplacez les éléments suivants :

  • USER : identifiant principal de l'utilisateur
  • PROJECT_NUMBER : numéro de projet Google Cloud
  • LOCATION : région Google Cloud
  • SERVICE_NAME : nom du service.

Se connecter avec SSH

Pour établir un tunnel SSH vers une ressource Cloud Run, vous devez utiliser la gcloud CLI.

Se connecter à un service

Exécutez la commande suivante :

gcloud beta run services ssh SERVICE_NAME \
    --region=LOCATION \
    --project=PROJECT_ID

Remplacez les éléments suivants :

  • SERVICE_NAME : nom du service auquel se connecter
  • LOCATION : région Google Cloud où se trouve le service
  • PROJECT_ID : ID de votre projet Google Cloud

Quittez la session.

Pour mettre fin à votre session SSH, saisissez exit.

Toutes les modifications que vous apportez au conteneur ne sont conservées que tant que le conteneur est maintenu actif. Le fait de quitter votre session n'arrête pas ni ne redémarre automatiquement le conteneur.

Utiliser un client OpenSSH local

Pour utiliser un client OpenSSH local pour les connexions :

  1. Pour lancer le tunnel SSH et générer le certificat nécessaire, exécutez la commande suivante :

    gcloud beta run services ssh SERVICE_NAME \
        --region=LOCATION \
        --project=PROJECT_ID
    

    Remplacez les éléments suivants :

    • SERVICE_NAME : nom du service.
    • LOCATION : région Google Cloud
    • PROJECT_ID : ID de votre projet Google Cloud
  2. Ajoutez le code de configuration suivant à votre fichier ~/.ssh/config local :

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile ~/.ssh/google_compute_engine
        CertificateFile ~/.ssh/google_compute_engine_cert/PROJECT_ID_LOCATION_SERVICE_NAME-cert.pub
        CheckHostIP no
        HashKnownHosts no
        HostKeyAlias cloud-run-default
        IdentitiesOnly yes
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null
        ProxyUseFdpass no
        ProxyCommand /usr/local/bin/python3 -S ~/google-cloud-sdk/lib/gcloud.py beta run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE_NAME --region=LOCATION
    

    Si votre chemin d'installation gcloud est différent, mettez à jour le préfixe dans le chemin d'accès ProxyCommand.

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de votre projet Google Cloud
    • LOCATION : région Google Cloud
    • SERVICE_NAME : nom du service.
    • PROJECT_NUMBER : numéro de votre projet Google Cloud
  3. Connectez-vous au service à l'aide d'OpenSSH :

    ssh cloud-run-ssh