Résoudre les problèmes liés à Cloud Run avec SSH

SSH vous permet d'établir une connexion shell interactive et sécurisée avec vos instances de conteneur en cours d'exécution. Cela permet d'accéder directement au système de fichiers et à l'environnement d'exécution du conteneur, ce qui vous permet d'inspecter les ressources système, de vérifier les configurations et de résoudre les problèmes.

SSH pour Cloud Run ajoute automatiquement les binaires sshd requis au système de fichiers de votre conteneur. Ces binaires ne sont accessibles que pendant la durée de la session SSH et sont supprimés une fois la session terminée. Les configurations SSH existantes, y compris les entrées /etc/passwd, sont ignorées par Cloud Run SSH au profit des configurations gérées par Google.

Les avis de copyright Open Source tiers pour les dépendances SSH gérées par Google sont montés dans votre conteneur lorsqu'une session SSH est établie au chemin d'accès suivant : /usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES.

Limites

Les limites suivantes s'appliquent à SSH :

  • SSH n'est disponible que pour les services qui s'exécutent sur l'environnement de deuxième génération de Cloud Run et les instances Cloud Run.
  • 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 l'instance de service soit redémarrée.
  • Windows : PuTTY n'est pas compatible. Utilisez le client OpenSSH.
  • Soyez particulièrement vigilant pour sécuriser votre conteneur lorsque vous utilisez SSH. Tenez compte des bonnes pratiques de sécurité, comme l'exécution du code d'application en tant qu'utilisateur non racine.

Avant de commencer

  1. Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Activez les API Cloud Run Admin, Cloud Resource Manager, Identity-Aware Proxy et Cloud OS Login :
      gcloud services enable run.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. Installez et initialisez la gcloud CLI.
  8. Mettez à jour les composants :
    gcloud components update
  9. Windows : assurez-vous que le client OpenSSH est installé.

    Le client OpenSSH est généralement installé par défaut sur Windows 10 et les versions ultérieures. Si ce n'est pas le cas, vous pouvez l'installer en exécutant la commande suivante dans PowerShell en tant qu'administrateur :

    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

    Pour en savoir plus, consultez Installer OpenSSH.

  10. Consultez la page des tarifs de Cloud Run. Pour obtenir une estimation des coûts en fonction de votre utilisation prévue, utilisez le simulateur de coût. SSH facture les octets de sortie réseau.
  11. Si votre projet utilise VPC Service Controls (VPC-SC), notez que le processus de tunneling vérifie iaptunnel.googleapis.com comme nom de service, plutôt que run.googleapis.com.

Rôles requis

Pour obtenir les autorisations nécessaires pour effectuer ces étapes, 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 avec des rôles personnalisés ou d'autres rôles prédéfinis.

Si vous n'êtes pas membre de l'organisation à laquelle appartient le projet, Cloud Run bloque l'accès SSH. Pour obtenir un accès SSH, ajoutez le rôle roles/compute.osLoginExternalUser ou utilisez un rôle personnalisé avec l'autorisation compute.oslogin.updateExternalUser.

Vous pouvez attribuer le rôle "Utilisateur de tunnels sécurisés par IAP" au niveau du projet. Pour limiter ce rôle à un service ou une instance Cloud Run spécifiques, exécutez la commande suivante :

Pour un service spécifique

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --service=SERVICE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

Remplacez les éléments suivants :

  • SERVICE : nom de votre service.
  • REGION : région dans laquelle votre service est déployé.
  • MEMBER : identité à laquelle accorder l'accès.

Pour une instance spécifique

gcloud beta iap tcp add-iam-policy-binding \
    --resource-type=cloud-run \
    --instance=INSTANCE \
    --region=REGION \
    --member=MEMBER \
    --role=roles/iap.tunnelResourceAccessor

Remplacez les éléments suivants :

  • INSTANCE : nom de l'instance.
  • REGION : région dans laquelle votre service est déployé.
  • MEMBER : identité à laquelle accorder l'accès.

Pour accorder le rôle roles/iap.tunnelResourceAccessor au niveau du projet et de la région, consultez Configurer des règles d'accès IAP.

Utiliser SSH avec les services Cloud Run

Configurez l'accès SSH au niveau du service et connectez-vous au service à l'aide de SSH.

Configurer l'accès SSH au niveau du service

Vous pouvez autoriser l'accès à l'inspection sur un service spécifique à l'aide de gcloud CLI ou de YAML :

gcloud

Pour activer l'accès sur un service existant, utilisez la commande suivante :

gcloud beta run services update SERVICE --ssh

Vous pouvez également autoriser l'accès à l'inspection d'un service à l'aide de l'option --ssh lors du déploiement du service.

YAML

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml
  2. L'exemple suivant contient la configuration YAML :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    Remplacez les éléments suivants :

    • SERVICE : nom de votre service Cloud Run.
    • REGION : région Google Cloud , par exemple us-central1.
    • IMAGE_URL : référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL est au format LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  3. Créez ou mettez à jour le service à l'aide de la commande suivante :

    gcloud run services replace service.yaml

    Par défaut, la commande gcloud run services replace utilise le fichier service.yaml s'il est présent.

Vous pouvez désactiver l'accès SSH pour chaque service à l'aide de gcloud CLI ou de YAML :

gcloud

Pour désactiver l'accès au service, utilisez la commande suivante :

gcloud beta run services update SERVICE --no-ssh

YAML

  1. Si vous créez un service, ignorez cette étape. Si vous mettez à jour un service existant, téléchargez sa configuration YAML :

    gcloud run services describe SERVICE --format export > service.yaml
  2. L'exemple suivant contient la configuration YAML :

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      template:
        spec:
          containers:
            image: IMAGE_URL
    

    Remplacez les éléments suivants :

    • SERVICE : nom de votre service Cloud Run.
    • REGION : région Google Cloud , par exemple us-central1.
    • IMAGE_URL : référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest. Si vous utilisez Artifact Registry, le dépôt REPO_NAME doit déjà être créé. L'URL est au format LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
  3. Créez ou mettez à jour le service à l'aide de la commande suivante :

    gcloud run services replace service.yaml

    Par défaut, la commande gcloud run services replace utilise le fichier service.yaml s'il est présent.

Se connecter au service avec SSH

Pour vous connecter à un service à l'aide de SSH, utilisez gcloud CLI :

Pour vous connecter à un service à l'aide de SSH, utilisez la commande Google Cloud CLI suivante :

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID

Remplacez les éléments suivants :

  • SERVICE : nom de votre service.
  • REGION : région dans laquelle votre service est déployé.
  • PROJECT_ID : ID du projet Google Cloud .

    Si vous êtes invité à saisir une phrase secrète pour la clé SSH, vous pouvez laisser le champ vide. Toutefois, si vous saisissez une phrase secrète, assurez-vous d'utiliser la même pour toutes les sessions SSH ultérieures à partir du même espace de travail.

    Une fois la session SSH terminée, Cloud Run affiche le message suivant :

    Project: my-project
    Region: REGION
    Service: busybox
    Revision: busybox-REVISION
    Instance:
    INSTANCE-ID
    Container: busybox-1
    Image: IMAGE
    

    Pour mettre fin à votre session SSH, saisissez exit. Toutes les modifications que vous apportez au conteneur sont conservées tant que le conteneur est actif. Quitter la session ne redémarre ni n'arrête le conteneur.

Spécifier une instance de service

Pour vous connecter à une instance de service spécifique à l'aide de SSH, utilisez Google Cloud CLI.

Pour vous connecter à une instance de service Cloud Run à l'aide de SSH, utilisez la commande Google Cloud CLI suivante :

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --instance=INSTANCE_ID

Remplacez les éléments suivants :

  • SERVICE : nom de votre service.
  • REGION : région dans laquelle votre service est déployé.
  • PROJECT_ID : ID du projet Google Cloud .
  • INSTANCE_ID : ID de l'instance. Pour trouver l'ID de l'instance de service, accédez à la page Journaux dans la section Observabilité. L'ID d'instance se trouve dans le champ labels d'une entrée de journal. Vous ne pouvez pas trouver l'ID d'instance si vous mettez fin à l'instance spécifique avant de vous y connecter.

Spécifier une révision

Pour vous connecter à une révision spécifique à l'aide de SSH, utilisez la Google Cloud CLI.

Pour vous connecter à une révision de service Cloud Run à l'aide de SSH, utilisez la commande Google Cloud CLI suivante :

  gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --revision=REVISION

Remplacez les éléments suivants :

  • SERVICE : nom de votre service.
  • REGION : région dans laquelle votre service est déployé.
  • PROJECT_ID : ID du projet Google Cloud .
  • REVISION : nom de la révision.

Utiliser SSH avec les instances Cloud Run

Configurez l'accès SSH au niveau de l'instance et connectez-vous à l'instance à l'aide de SSH.

Configurer l'accès SSH au niveau de l'instance

Le protocole SSH est activé par défaut pour les instances.

Vous pouvez désactiver l'accès SSH pour chaque instance à l'aide de gcloud CLI ou de YAML :

gcloud

Pour désactiver l'accès à l'instance, utilisez la commande suivante :

gcloud beta run instances update INSTANCE --no-ssh

YAML

  1. Si vous créez une instance, ignorez cette étape. Si vous mettez à jour une instance existante, téléchargez sa configuration YAML :

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. L'exemple suivant contient la configuration YAML :

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "false"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    Remplacez les éléments suivants :

    • INSTANCE : nom de votre instance Cloud Run.
    • REGION : région Google Cloud , par exemple us-central1.
    • IMAGE_URL : référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Créez ou mettez à jour l'instance à l'aide de la commande suivante :

    gcloud beta run instances replace instance.yaml

Vous pouvez autoriser l'accès à l'inspection sur une instance spécifique à l'aide de gcloud CLI ou de YAML.

gcloud

Pour activer l'accès sur une instance existante, utilisez la commande suivante :

gcloud beta run instances update INSTANCE --ssh

Vous pouvez également autoriser l'accès à l'inspection sur une instance à l'aide de l'option --ssh lors du déploiement de l'instance.

YAML

  1. Si vous créez une instance, ignorez cette étape. Si vous mettez à jour une instance existante, téléchargez sa configuration YAML :

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. L'exemple suivant contient la configuration YAML :

    apiVersion: run.googleapis.com/v1
    kind: Instance
    metadata:
      name: INSTANCE
      labels:
        cloud.googleapis.com/location: REGION
      annotations:
        run.googleapis.com/ssh-enabled: "true"
        run.googleapis.com/launch-stage: BETA
    spec:
      containers:
        image: IMAGE_URL
    

    Remplacez les éléments suivants :

    • INSTANCE : nom de votre instance Cloud Run.
    • REGION : région Google Cloud , par exemple us-central1.
    • IMAGE_URL : référence à l'image de conteneur, par exemple us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Créez ou mettez à jour l'instance à l'aide de la commande suivante :

    gcloud beta run instances replace instance.yaml

Se connecter à l'instance avec SSH

Pour vous connecter à une instance à l'aide de SSH, utilisez la commande Google Cloud CLI suivante :

  gcloud beta run instances ssh INSTANCE --region=REGION --project=PROJECT_ID

Remplacez les éléments suivants :

  • INSTANCE : nom de l'instance.
  • REGION : région dans laquelle votre service est déployé.
  • PROJECT_ID : ID du projet Google Cloud .

Si vous êtes invité à saisir une phrase secrète pour la clé SSH, vous pouvez laisser le champ vide. Toutefois, si vous saisissez une phrase secrète, assurez-vous d'utiliser la même pour toutes les sessions SSH ultérieures à partir du même espace de travail.

Une fois la session SSH terminée, Cloud Run affiche le message suivant :

  Project: my-project
  Region: REGION
  Instance: INSTANCE
  Revision: REVISION
  Container: CONTAINER
  Image: IMAGE

Pour mettre fin à votre session SSH, saisissez exit.

Utiliser le client OpenSSH pour se connecter

Pour vous connecter à l'aide de votre client OpenSSH :

  1. Exécutez la commande gcloud beta run services ssh sur le service cible.
  2. Lancez le tunnel SSH et générez le certificat.
  3. Ajoutez ce qui suit à votre configuration SSH :

    Host cloud-run-ssh
        HostName cloud-run-default
        User root
        IdentityFile /Users/USER/.ssh/google_compute_engine
        CertificateFile /Users/USER/.ssh/google_compute_engine_cert/PROJECT_ID_REGION_SERVICE-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 /Users/USER/google-cloud-sdk/lib/gcloud.py alpha run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE --region=REGION
    

    Remplacez les éléments suivants :

    • USER : nom d'utilisateur sur votre machine locale.
    • PROJECT_ID : ID du projet Google Cloud .
    • PROJECT_NUMBER : numéro du projet Google Cloud .
    • REGION : région dans laquelle votre service est déployé.
    • SERVICE : nom de votre service.

    Si la gcloud CLI est installée dans un autre dossier, vous devrez peut-être modifier l'emplacement dans la dernière ligne.

  4. Exécutez la commande suivante :

    ssh cloud-run-ssh
    

Votre certificat SSH expire au bout de cinq minutes. Si vous essayez d'établir une connexion SSH avec votre service au bout de cinq minutes, vous devez réexécuter gcloud beta run services ssh pour générer à nouveau le certificat.

Journaux d'accès SSH

Pour capturer les journaux d'audit pour la gestion des clés SSH, vous devez activer les journaux d'audit pour l'API Cloud OS Login. Consultez Afficher les journaux d'audit OS Login. Pour accéder aux journaux SSH des ressources Cloud Run, vous devez avoir accès à Cloud Audit Logs pour ce projet.

L'exemple suivant interroge tous les services Cloud Run pour la journée précédente :

gcloud logging read '
  logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
  protoPayload.serviceName="oslogin.googleapis.com" AND
  protoPayload.request.instance:"run.googleapis.com"
' --project=PROJECT_ID \
  --freshness=1d \
  --format="table(timestamp, protoPayload.authenticationInfo.principalSubject:label=USER, protoPayload.request.instance:label=CLOUD_RUN_SERVICE)"

Sécuriser et contrôler l'accès SSH

Vous pouvez contrôler qui peut utiliser SSH et comment il est limité dans votre environnement.

Désactiver l'accès SSH avec des règles d'administration

Pour définir une règle d'administration afin de désactiver SSH, utilisez la contrainte personnalisée qui limite l'activation de l'accès au débogage SSH sur les services Cloud Run.

Étapes suivantes