Risolvi i problemi di Cloud Run con SSH

SSH ti consente di stabilire una connessione shell sicura e interattiva alle istanze container in esecuzione. In questo modo, puoi accedere direttamente al file system e all'ambiente di runtime del container, il che ti consente di esaminare le risorse di sistema, verificare le configurazioni e risolvere i problemi.

SSH per Cloud Run aggiunge automaticamente i file binari sshd richiesti al file system del container. Questi file binari sono accessibili solo per la durata della sessione SSH e vengono rimossi al termine della sessione. Le configurazioni SSH esistenti, incluse le voci /etc/passwd, vengono ignorate da Cloud Run SSH a favore delle configurazioni gestite da Google.

Le note sul copyright open source di terze parti per le dipendenze SSH gestite da Google vengono montate all'interno del container quando viene stabilita una sessione SSH nel seguente percorso: /usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES.

Limitazioni

Si applicano le seguenti limitazioni a SSH:

  • SSH è disponibile solo per i servizi eseguiti nell'ambiente di seconda generazione di Cloud Run e per le istanze Cloud Run.
  • Quando utilizzi SSH, le chiavi host nell'immagine vengono sovrascritte. Le chiavi rimangono sovrascritte dopo la fine della sessione SSH, fino al riavvio dell'istanza del servizio.
  • Windows: PuTTY non è supportato. Utilizza il client OpenSSH.
  • Quando utilizzi SSH, presta particolare attenzione a proteggere il container. Prendi in considerazione le best practice di sicurezza, ad esempio l'esecuzione del codice dell'applicazione come utente non root.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei carichi di lavoro.
  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. Abilita le API Cloud Run Admin, Cloud Resource Manager, Identity-Aware Proxy e Cloud OS Login:
      gcloud services enable run.googleapis.com \
          iap.googleapis.com \
          oslogin.googleapis.com
      
  7. Installa e inizializza gcloud CLI.
  8. Aggiorna i componenti:
    gcloud components update
  9. Windows: assicurati che il client OpenSSH sia installato.

    Il client OpenSSH è in genere installato per impostazione predefinita su Windows 10 e versioni successive. Se non è installato, puoi installarlo eseguendo questo comando in PowerShell come amministratore:

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

    Per saperne di più, consulta Installare OpenSSH.

  10. Consulta la pagina Prezzi di Cloud Run. Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi. SSH fattura i byte di traffico di rete in uscita.
  11. Se il tuo progetto utilizza Controlli di servizio VPC (VPC-SC), tieni presente che il processo di tunneling controlla iaptunnel.googleapis.com come nome del servizio, anziché run.googleapis.com.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per completare questi passaggi, chiedi all'amministratore di concederti i seguenti ruoli IAM:

Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Se non fai parte dell'organizzazione a cui appartiene il progetto, Cloud Run blocca l'accesso SSH. Per ottenere l'accesso SSH, aggiungi il ruolo roles/compute.osLoginExternalUser o utilizza un ruolo personalizzato con l'autorizzazione compute.oslogin.updateExternalUser.

Puoi concedere il ruolo Utente tunnel protetto da IAP a livello di progetto. Per limitare questo ruolo a un servizio o a un'istanza Cloud Run specifici, esegui questo comando:

Per un servizio specifico

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

Sostituisci quanto segue:

  • SERVICE: il nome del servizio.
  • REGION: la regione in cui è stato eseguito il deployment del servizio.
  • MEMBER: l'identità a cui concedere l'accesso.

Per un'istanza specifica

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

Sostituisci quanto segue:

  • INSTANCE: il nome dell'istanza.
  • REGION: la regione in cui è stato eseguito il deployment del servizio.
  • MEMBER: l'identità a cui concedere l'accesso.

Per concedere il ruolo roles/iap.tunnelResourceAccessor a livello di progetto e regione, consulta Configurare le policy di accesso IAP.

Utilizzare SSH con i servizi Cloud Run

Configura l'accesso SSH a livello di servizio e connettiti al servizio utilizzando SSH.

Configurare l'accesso SSH a livello di servizio

Puoi consentire l'accesso di ispezione a un servizio specifico utilizzando gcloud CLI o YAML:

gcloud

Per abilitare l'accesso a un servizio esistente, utilizza questo comando:

gcloud beta run services update SERVICE --ssh

Puoi anche consentire l'accesso di controllo a un servizio utilizzando il flag --ssh quando esegui il deployment del servizio.

YAML

  1. Se stai creando un nuovo servizio, ignora questo passaggio. Se stai aggiornando un servizio esistente, scarica la relativa configurazione YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. L'esempio seguente contiene la configurazione 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
    

    Sostituisci quanto segue:

    • SERVICE: il nome del servizio Cloud Run.
    • REGION: la Google Cloud regione, ad esempio us-central1.
    • IMAGE_URL: un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL segue il formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. Crea o aggiorna il servizio utilizzando il seguente comando:

    gcloud run services replace service.yaml

    Il comando gcloud run services replace utilizza per impostazione predefinita il file service.yaml, se presente.

Puoi disattivare l'accesso SSH in base al servizio utilizzando gcloud CLI o YAML:

gcloud

Per disattivare l'accesso al servizio, utilizza questo comando:

gcloud beta run services update SERVICE --no-ssh

YAML

  1. Se stai creando un nuovo servizio, ignora questo passaggio. Se stai aggiornando un servizio esistente, scarica la relativa configurazione YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. L'esempio seguente contiene la configurazione 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
    

    Sostituisci quanto segue:

    • SERVICE: il nome del servizio Cloud Run.
    • REGION: la Google Cloud regione, ad esempio us-central1.
    • IMAGE_URL: un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL segue il formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
  3. Crea o aggiorna il servizio utilizzando il seguente comando:

    gcloud run services replace service.yaml

    Il comando gcloud run services replace utilizza per impostazione predefinita il file service.yaml, se presente.

Connettiti al servizio tramite SSH

Per connetterti a un servizio utilizzando SSH, utilizza gcloud CLI:

Per connetterti a un servizio utilizzando SSH, utilizza il seguente comando Google Cloud CLI:

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

Sostituisci quanto segue:

  • SERVICE: il nome del servizio.
  • REGION: la regione in cui è stato eseguito il deployment del servizio.
  • PROJECT_ID: l'ID progetto Google Cloud .

    Se ti viene chiesto di inserire una passphrase per la chiave SSH, puoi lasciare il campo vuoto. Tuttavia, se inserisci una passphrase, assicurati di utilizzare la stessa per le sessioni SSH successive dallo stesso workspace.

    Al termine della sessione SSH, Cloud Run mostra il seguente messaggio:

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

    Per terminare la sessione SSH, digita exit. Le modifiche apportate al container vengono mantenute finché il container è attivo. L'uscita dalla sessione non riavvia o interrompe il container.

Specifica un'istanza di servizio

Per connetterti a un'istanza di servizio specifica utilizzando SSH, utilizza Google Cloud CLI.

Per connetterti a un'istanza del servizio Cloud Run utilizzando SSH, utilizza questo comando Google Cloud CLI:

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

Sostituisci quanto segue:

  • SERVICE: il nome del servizio.
  • REGION: la regione in cui è stato eseguito il deployment del servizio.
  • PROJECT_ID: l'ID progetto Google Cloud .
  • INSTANCE_ID: l'ID istanza. Per trovare l'ID istanza del servizio, vai alla pagina Log nella sezione Osservabilità. L'ID istanza si trova nel campo labels di una voce di log. Non puoi trovare l'ID istanza se termini l'istanza specifica prima di connetterti.

Specificare una revisione

Per connetterti a una revisione specifica utilizzando SSH, utilizza Google Cloud CLI.

Per connetterti a una revisione del servizio Cloud Run utilizzando SSH, utilizza il seguente comando Google Cloud CLI:

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

Sostituisci quanto segue:

  • SERVICE: il nome del servizio.
  • REGION: la regione in cui è stato eseguito il deployment del servizio.
  • PROJECT_ID: l'ID progetto Google Cloud .
  • REVISION: il nome della revisione.

Utilizzare SSH con le istanze Cloud Run

Configura l'accesso SSH a livello di istanza e connettiti all'istanza tramite SSH.

Configurare l'accesso SSH a livello di istanza

SSH è abilitato per impostazione predefinita per le istanze.

Puoi disattivare l'accesso SSH per ogni istanza utilizzando gcloud CLI o YAML:

gcloud

Per disattivare l'accesso all'istanza, utilizza il seguente comando:

gcloud beta run instances update INSTANCE --no-ssh

YAML

  1. Se stai creando una nuova istanza, ignora questo passaggio. Se stai aggiornando un'istanza esistente, scarica la relativa configurazione YAML:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. L'esempio seguente contiene la configurazione 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
    

    Sostituisci quanto segue:

    • INSTANCE: il nome dell'istanza Cloud Run.
    • REGION: la Google Cloud regione, ad esempio us-central1.
    • IMAGE_URL: un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Crea o aggiorna l'istanza utilizzando il seguente comando:

    gcloud beta run instances replace instance.yaml

Puoi consentire l'accesso di controllo a un'istanza specifica utilizzando gcloud CLI o YAML.

gcloud

Per abilitare l'accesso su un'istanza esistente, utilizza il seguente comando:

gcloud beta run instances update INSTANCE --ssh

Puoi anche consentire l'accesso di ispezione a un'istanza utilizzando il flag --ssh quando esegui il deployment dell'istanza.

YAML

  1. Se stai creando una nuova istanza, ignora questo passaggio. Se stai aggiornando un'istanza esistente, scarica la relativa configurazione YAML:

    gcloud beta run instances describe INSTANCE --format export > instance.yaml
  2. L'esempio seguente contiene la configurazione 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
    

    Sostituisci quanto segue:

    • INSTANCE: il nome dell'istanza Cloud Run.
    • REGION: la Google Cloud regione, ad esempio us-central1.
    • IMAGE_URL: un riferimento all'immagine container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest.
  3. Crea o aggiorna l'istanza utilizzando il seguente comando:

    gcloud beta run instances replace instance.yaml

Connettiti all'istanza tramite SSH

Per connetterti a un'istanza utilizzando SSH, utilizza il seguente comando Google Cloud CLI:

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

Sostituisci quanto segue:

  • INSTANCE: il nome dell'istanza.
  • REGION: la regione in cui è stato eseguito il deployment del servizio.
  • PROJECT_ID: l'ID progetto Google Cloud .

Se ti viene chiesto di inserire una passphrase per la chiave SSH, puoi lasciare il campo vuoto. Tuttavia, se inserisci una passphrase, assicurati di utilizzare la stessa per le sessioni SSH successive dallo stesso workspace.

Al termine della sessione SSH, Cloud Run mostra il seguente messaggio:

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

Per terminare la sessione SSH, digita exit.

Utilizzare il client OpenSSH per connettersi

Per utilizzare il client OpenSSH per connetterti:

  1. Esegui il comando gcloud beta run services ssh sul servizio di destinazione.
  2. Avvia il tunnel SSH e genera il certificato.
  3. Aggiungi quanto segue alla configurazione 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
    

    Sostituisci quanto segue:

    • USER: il nome utente sul computer locale.
    • PROJECT_ID: l'ID progetto Google Cloud .
    • PROJECT_NUMBER: il Google Cloud numero di progetto.
    • REGION: la regione in cui è stato eseguito il deployment del servizio.
    • SERVICE: il nome del servizio.

    Se gcloud CLI è installato in una cartella diversa, potresti dover aggiornare la posizione nell'ultima riga.

  4. Esegui questo comando:

    ssh cloud-run-ssh
    

Il certificato SSH scade dopo cinque minuti. Se provi a stabilire una connessione SSH con il tuo servizio dopo cinque minuti, devi eseguire di nuovo gcloud beta run services ssh per rigenerare il certificato.

Log di accesso SSH

Per acquisire i log di controllo per la gestione delle chiavi SSH, devi abilitare i log di controllo per l'API Cloud OS Login. Consulta Visualizzare gli audit log di OS Login. Per accedere ai log SSH delle risorse Cloud Run, devi avere accesso a Cloud Audit Logs per il progetto.

Il seguente esempio esegue una query su tutti i servizi Cloud Run per l'ultimo giorno:

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)"

Proteggere e controllare l'accesso SSH

Puoi controllare chi può utilizzare SSH e come viene limitato nel tuo ambiente.

Disattivare l'accesso SSH con le policy dell'organizzazione

Per impostare una policy dell'organizzazione per disattivare SSH, utilizza il vincolo personalizzato che limita l'attivazione dell'accesso al debug SSH sui servizi Cloud Run.

Passaggi successivi