Utilizzare SSH per Cloud Run

Questa pagina descrive come utilizzare SSH per connetterti ai servizi Cloud Run tramite l'inoltro TCP di Identity-Aware Proxy (IAP).

Proteggendo le connessioni SSH con IAP, puoi eseguire il debug delle singole istanze di container in un ambiente sicuro.

Prima di iniziare

  1. Assicurati che il servizio Cloud Run sia in esecuzione in un ambiente di esecuzione di seconda generazione e includa tutti gli strumenti di debug necessari per eseguire i comandi una volta stabilita la connessione. Per saperne di più, consulta Ambienti di esecuzione.
  2. Per assicurarti di utilizzare l'ultima versione di Google Cloud CLI, esegui questo comando:

    gcloud components update
    
  3. Abilita le API Cloud Run, API Cloud Resource Manager, API Cloud OS Login e Identity-Aware Proxy nel tuo progetto.

    Per abilitare le API, esegui questo comando:

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

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per configurare le policy e connetterti ai workload, 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.

Limitazioni

SSH per Cloud Run presenta le seguenti limitazioni:

  • Sono supportati solo i servizi e le istanze Cloud Run.
  • Per i servizi, è supportato solo l'ambiente di esecuzione di seconda generazione.
  • I job Cloud Run non sono supportati.
  • I pool di worker non sono supportati.
  • Quando utilizzi SSH, le chiavi host nell'immagine vengono sovrascritte. Le chiavi rimangono sovrascritte al termine della sessione SSH, fino al riavvio del servizio.
  • Windows: PuTTY non è supportato. Utilizza il client OpenSSH.

Configura le policy di autorizzazione IAP

Puoi gestire l'accesso alle risorse Cloud Run a livello di progetto, regione o servizio utilizzando gcloud CLI o l'API REST di IAP.

Puoi configurare le policy per i seguenti identificatori dell'API Cloud Identity:

  • Cloud Identity: ad esempio, user:EMAIL@example.com
  • Federazione delle identità per la forza lavoro: ad esempio: principal://iam.googleapis.com/locations/global/workforcePools/ <var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>

Per ulteriori informazioni ed esempi di tipi di entità, consulta l'elenco degli identificatori delle entità.

Aggiorna un servizio Cloud Run esistente

Per aggiornare il servizio in modo da abilitare SSH, esegui questo comando:

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

Sostituisci quanto segue:

  • SERVICE_NAME: il nome del tuo servizio Cloud Run.
  • LOCATION: la regione Google Cloud in cui viene eseguito il deployment del servizio (ad esempio, us-central1).

Puoi anche eseguire il deployment di un servizio Cloud Run aggiungendo --ssh a gcloud beta run deploy.

Concedi l'accesso a tutte le risorse Cloud Run in un progetto

Per gestire l'accesso a tutte le risorse di un progetto, applica l'associazione della policy IAM a livello di progetto.

gcloud

Esegui questo comando:

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

Sostituisci USER con l'identificatore dell'entità dell'utente, ad esempio user:user@example.com o l'entità della federazione delle identità per la forza lavoro.

API REST

Invia una richiesta POST all'endpoint della policy del progetto:

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"

Sostituisci quanto segue:

  • USER: l'identificatore principale dell'utente.
  • PROJECT_NUMBER: il numero di progetto Google Cloud in cui sono ospitate le risorse.

Concedi l'accesso a tutte le risorse Cloud Run in una località specifica

Per limitare l'accesso a tutte le risorse all'interno di una regione specifica (ad esempio, us-central1), applica l'associazione della policy a livello di località.

gcloud

Esegui questo comando:

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

Sostituisci quanto segue:

  • USER: l'identificatore principale dell'utente.
  • LOCATION: la regione Google Cloud in cui viene eseguito il deployment delle risorse (ad esempio, us-central1).

API REST

Invia una richiesta POST all'endpoint della policy di località:

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"

Sostituisci quanto segue:

  • USER: l'identificatore entità dell'utente
  • PROJECT_NUMBER: il numero di progetto Google Cloud
  • LOCATION: la regione Google Cloud

Concedi l'accesso a un servizio Cloud Run specifico

Per limitare l'accesso a un singolo servizio denominato nel progetto, applica l'associazione della policy a livello di servizio.

gcloud

Esegui questo comando:

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

Sostituisci quanto segue:

  • USER: l'identificatore entità dell'utente
  • SERVICE_NAME: il nome della logica di servizio a cui connettersi
  • LOCATION: la regione Google Cloud in cui viene eseguito il deployment del servizio

API REST

Invia una richiesta POST all'endpoint della policy di servizio:

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"

Sostituisci quanto segue:

  • USER: l'identificatore entità dell'utente
  • PROJECT_NUMBER: il numero di progetto Google Cloud
  • LOCATION: la regione Google Cloud
  • SERVICE_NAME: il nome del servizio

Connessione tramite SSH

Per stabilire un tunnel SSH a una risorsa Cloud Run, devi utilizzare gcloud CLI.

Connettiti a un servizio

Esegui questo comando:

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

Sostituisci quanto segue:

  • SERVICE_NAME: il nome del servizio a cui connettersi
  • LOCATION: la regione Google Cloud in cui si trova il servizio
  • PROJECT_ID: l'ID del tuo progetto Google Cloud

Esci dalla sessione

Per terminare la sessione SSH, digita exit.

Le modifiche apportate al container vengono mantenute solo per il periodo di tempo in cui il container viene mantenuto attivo. L'uscita dalla sessione non interrompe né riavvia automaticamente il container.

Utilizza un client OpenSSH locale

Per utilizzare un client OpenSSH locale per le connessioni:

  1. Per avviare il tunnel SSH e generare il certificato necessario, esegui il seguente comando:

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

    Sostituisci quanto segue:

    • SERVICE_NAME: il nome del servizio
    • LOCATION: la regione Google Cloud
    • PROJECT_ID: il tuo ID progetto Google Cloud
  2. Aggiungi il seguente codice di configurazione al file ~/.ssh/config locale:

    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
    

    Se il percorso di installazione di gcloud è diverso, aggiorna il prefisso nel percorso ProxyCommand.

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto Google Cloud
    • LOCATION: la regione Google Cloud
    • SERVICE_NAME: il nome del servizio
    • PROJECT_NUMBER: il tuo numero di progetto Google Cloud
  3. Connettiti al servizio utilizzando OpenSSH:

    ssh cloud-run-ssh