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 conteneurs 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 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 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 les instances Cloud Run sont compatibles.
  • Pour les services, seul l'environnement d'exécution de deuxième génération est pris en charge.
  • 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 remplacées. Les clés restent écrasées après la fin de la session SSH, jusqu'à ce que le service soit redémarré.
  • Windows : PuTTY n'est pas compatible. Utilisez le client OpenSSH.

Configurer les 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 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 d'identité de personnel : par exemple : principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

Pour obtenir plus d'informations et des exemples de types de comptes principaux, consultez la liste des identifiants 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 \
    --ssh

Remplacez SERVICE_NAME par le nom de votre service Cloud Run. Vous pouvez 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 l'association 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 la fédération d'identité du personnel).

API REST

Envoyez une requête POST au point de terminaison de la règle de 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 Clouddans lequel 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 l'association 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 : région Google Cloud dans laquelle 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 de localisation :

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 restreindre l'accès à un seul service nommé dans votre projet, appliquez l'association de règles 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 : Google Cloud région 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ù réside le service
  • PROJECT_ID : ID de votre projet Google Cloud

Quitter 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 actif. Quitter votre session n'arrête 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 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