Utilizzare SSH per Cloud Run

Questa pagina descrive come utilizzare SSH per connettersi 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 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 connesso. 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, Cloud Resource Manager, 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 carichi di lavoro, 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.

Configurare 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 IAP.

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

  • Cloud Identity: ad esempio, user:EMAIL@example.com
  • Federazione delle identità della 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 \
    --ssh

Sostituisci SERVICE_NAME con il nome del tuo servizio Cloud Run. Puoi eseguire il deployment di un servizio Cloud Run aggiungendo --ssh a gcloud beta run deploy.

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

Per gestire l'accesso per tutte le risorse all'interno di un progetto, applica il binding dei criteri 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 dell'entità dell'utente.
  • PROJECT_NUMBER: il Google Cloud numero di progetto in cui sono ospitate le risorse.

Concedere 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 dell'entità dell'utente.
  • LOCATION: la Google Cloud regione in cui vengono eseguito il deployment delle risorse (ad esempio, us-central1).

API REST

Invia una richiesta POST all'endpoint delle norme sulla posizione:

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 tuo progetto, applica il binding 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 Google Cloud regione 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.

Connettersi 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 Google Cloud regione 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 finché il container è attivo. L'uscita dalla sessione non interrompe o 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 questo 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 Google Cloud ID progetto
    • LOCATION: la regione Google Cloud
    • SERVICE_NAME: il nome del servizio
    • PROJECT_NUMBER: il tuo Google Cloud numero di progetto
  3. Connettiti al servizio utilizzando OpenSSH:

    ssh cloud-run-ssh