Utilizzo di IAP per inoltro TCP

Questa pagina spiega come utilizzare il forwarding TCP con Identity-Aware Proxy (IAP) per abilitare l'accesso amministrativo alle istanze VM che non hanno indirizzi IP esterni o non consentono l'accesso diretto su Internet.

Il forwarding TCP da IAP consente di stabilire un tunnel criptato su cui puoi inoltrare a SSH istanze di traffico SSH, RDP e altro. L'inoltro TCP IAP fornisce inoltre un controllo granulare sugli utenti autorizzati a stabilire tunnel e sulle istanze VM a cui gli utenti sono autorizzati a connettersi.

Per ulteriori informazioni sul funzionamento dell'inoltro TCP in IAP, vedi la panoramica sull'inoltro TCP.

Preparazione del progetto per l'inoltro TCP in IAP

Questa sezione illustra i passaggi necessari per abilitare l'inoltro IAP TCP nel tuo progetto Google Cloud.

Crea una regola firewall

Per consentire a IAP di connettersi alle istanze VM, crea una regola firewall che:

  • si applica a tutte le istanze VM a cui vuoi accedere utilizzando IAP.
  • consente il traffico in entrata dall'intervallo IP 35.235.240.0/20. Questo intervallo contiene tutti gli indirizzi IP utilizzati da IAP per l'inoltro TCP.
  • consente le connessioni a tutte le porte a cui vuoi accedere utilizzando il forwarding TCP IAP, ad esempio la porta 22 per SSH e la porta 3389 per RDP.

console

Per consentire l'accesso RDP e SSH a tutte le istanze VM della tua rete, procedi nel seguente modo:

  • Apri la pagina Regole firewall e fai clic su Crea regola firewall.

    Apri la pagina Regole firewall

  • Configura le seguenti impostazioni:

    • Nome: allow-ingress-from-iap
    • Direzione del traffico: in entrata
    • Target: tutte le istanze nella rete
    • Filtro di origine: intervalli IP
    • Intervalli IP di origine: 35.235.240.0/20
    • Protocolli e porte: seleziona TCP e inserisci 22,3389 per consentire sia RDP che SSH.
  • Fai clic su Crea.

gcloud

Per consentire l'accesso RDP a tutte le istanze VM nella tua rete, esegui:

gcloud compute firewall-rules create allow-rdp-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3389 \
  --source-ranges=35.235.240.0/20

Per l'accesso SSH, esegui:

gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

Per altri protocolli, esegui

gcloud compute firewall-rules create allow-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:PORT \
  --source-ranges=35.235.240.0/20

dove PORT è la porta usata dal protocollo.

Concedi le autorizzazioni per utilizzare l'inoltro TCP IAP

Per controllare a quali utenti e gruppi è consentito utilizzare l'inoltro TCP IAP e a quali istanze VM sono autorizzati a connettersi, configura le autorizzazioni IAM (Gestione di identità e accessi).

Per gli amministratori attendibili, ti consigliamo di concedere tutti i seguenti ruoli:

Inoltre, se utilizzi OS Login (consigliato), consulta la pagina relativa alla configurazione dei ruoli di OS Login negli account utente. Se utilizzi account di servizio, consulta queste istruzioni su come configurare il ruolo serviceAccountUser.

Puoi concedere a un utente o a un gruppo l'accesso a tutte le istanze VM di un progetto configurando le autorizzazioni IAM a livello di progetto:

console

  1. Apri la pagina IAM e amministrazione in Google Cloud Console.

    Apri la pagina Amministrazione di IAM

  2. Fai clic su Aggiungi e configura quanto segue:

    • Nuovi membri: specifica l'utente o il gruppo a cui vuoi concedere l'accesso.
    • Seleziona un ruolo: seleziona Cloud IAP > IAP-Secured Tunnel User (Utente del tunnel con protezione IAP).
  3. (Facoltativo) Fai clic su Aggiungi condizione e configura una limitazione per i membri:

    • Titolo: inserisci un nome per la restrizione.
    • Espressioni: inserisci una condizione che l'utente deve soddisfare prima di poter utilizzare l'IAP per l'inoltro TCP.

    Ad esempio, la seguente espressione CEL limita l'accesso alla porta 22:

    destination.port == 22
    

    Puoi anche limitare l'accesso in base al livello di accesso:

    destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
    

    Dove FULL_ACCESS_LEVEL_NAME è un livello di accesso esistente e utilizza il formato accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  4. Fai clic su Aggiungi un altro ruolo e configura quanto segue:

    • Seleziona un ruolo: seleziona Compute Engine > Amministratore istanze Compute (v1).
  5. Fai clic su Salva.

gcloud

Concedi i due ruoli all'utente eseguendo questi comandi:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/iap.tunnelResourceAccessor
gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/compute.instanceAdmin.v1

Sostituisci quanto segue:

  • PROJECT_ID: ID del progetto
  • EMAIL: indirizzo email dell'utente a cui vuoi concedere l'accesso, ad esempio user@example.com.

Se vuoi, puoi configurare il ruolo iap.tunnelResourceAccessor in base alla VM (gli altri ruoli devono essere presenti nel progetto):

console

  1. Apri la pagina di amministrazione di IAP e seleziona la scheda SSH and TCP Resources (Risorse SSH e TCP).

    Apri la pagina di amministrazione di IAP

  2. Seleziona le istanze VM che vuoi configurare.
  3. Se non è visibile, fai clic su Mostra riquadro informazioni.
  4. Fai clic su Aggiungi membro e configura quanto segue:

    • Nuovi membri: specifica l'utente o il gruppo a cui vuoi concedere l'accesso.
    • Seleziona un ruolo: seleziona Cloud IAP > IAP-Secured Tunnel User (Utente del tunnel con protezione IAP).
  5. (Facoltativo) Fai clic su Aggiungi condizione e configura una limitazione per i membri:

    • Titolo: inserisci un nome per la restrizione.
    • Espressioni: inserisci una condizione che l'utente deve soddisfare prima di poter utilizzare l'IAP per l'inoltro TCP.

    Ad esempio, la seguente espressione CEL limita l'accesso alla porta 22:

    destination.port == 22
    

    Puoi anche limitare l'accesso in base al livello di accesso:

    destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
    

    Dove FULL_ACCESS_LEVEL_NAME è un livello di accesso esistente e utilizza il formato accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME.

  6. Fai clic su Salva.

API

Per modificare il file policy.json dell'applicazione, procedi nel seguente modo. Consulta Gestione dell'accesso alle risorse protette con IAP per ulteriori informazioni sull'utilizzo dell'API IAM per gestire i criteri di accesso.

  1. Scarica il file delle credenziali per il tuo account di servizio.

    1. Vai alla pagina Account di servizio.
      Vai alla pagina Account di servizio

    2. Fai clic sull'indirizzo email del tuo account di servizio.

    3. Fai clic su Modifica.

    4. Fai clic su Crea chiave.

    5. Seleziona JSON come tipo di chiave.

    6. Per creare una nuova chiave, fai clic su Crea e chiudi la finestra di conferma visualizzata.

    Il file delle credenziali JSON è stato scaricato.

  2. Esporta le seguenti variabili.

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  3. Converti il file JSON delle credenziali dell'account di servizio in un token di accesso OAuth con Oauth2l eseguendo il comando seguente:

    oauth2l header --json ${JSON_CREDS} cloud-platform

  4. Se è la prima volta che esegui il comando riportato sopra, quando richiesto:

    1. Per ricevere il codice di verifica, fai clic sul link visualizzato e copialo.
    2. Incolla il codice di verifica nel messaggio dell'app.
    3. Copia il token di connessione restituito.
    4. Esporta una nuova variabile assegnata al valore del token di trasferimento restituito.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. Se hai già eseguito questo comando, esporta la seguente variabile.

    export CLOUD_OAUTH_TOKEN="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

  6. Ottieni il criterio IAM per l'istanza Compute Engine utilizzando il metodo getIamPolicy. Il bit di dati vuoto alla fine trasforma la richiesta curl in POST anziché in GET.

    curl -i -H "${CLOUD_OAUTH_TOKEN}" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  7. Concedi il ruolo iap.tunnelResourceAccessor ai tuoi membri modificando il file JSON del criterio IAM.

  8. Se vuoi, aggiungi limitazioni per i membri in base alle Condizioni IAM e ai livelli di accesso.

    Di seguito è riportato un esempio di un file policy.json modificato che associa il ruolo iap.tunnelResourceAccessor a un gruppo di amministratori di istanze VM, concedendo loro l'accesso alle risorse del tunnel con protezione IAP. È stata aggiunta una condizione IAM per rendere le risorse accessibili solo ai membri nel gruppo di amministratori di istanze VM con indirizzo IP privato di 10.0.0.1 sulla porta 22utilizzando destination.ipe destination.portcondizioni IAM. Inoltre, devono soddisfare i requisiti del livello di accesso ACCESS_LEVEL_NAME.

    Tieni presente che se un membro ha il ruolo Proprietario, è autorizzato a utilizzare IAP per l'inoltro TCP.


    Esempio di file policy.json

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["group:instance-admins@example.com"],
            "condition": {
              "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }

    Per trovare il nome di un criterio, chiama il numero accessPolicies.list:

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  9. Imposta il nuovo file policy.json utilizzando il metodo setIamPolicy.

    curl -i -H "Content-Type:application/json" \
              -H "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
              ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \
              -d @${JSON_NEW_POLICY}
    

Dettagli autorizzazioni

Le autorizzazioni richieste variano in base all'utilizzo dell'inoltro TCP da IAP da parte di un utente:

Scenari Autorizzazioni obbligatorie
Tutti
  • iap.tunnelInstances.accessViaIAP
È in uso gcloud compute [start-iap-tunnel, ssh, scp]
  • compute.instances.get
  • compute.instances.list
È in uso gcloud compute [ssh, scp]
  • compute.projects.get
VM mediante OS Login Consulta queste istruzioni.
OS Login non utilizzato
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
Accedi a VM tramite VM con un account di servizio
  • iam.serviceAccounts.actAs
SSH dal browser Consulta queste istruzioni.

Ad esempio, se un utente vuole connettersi utilizzando gcloud compute ssh a una VM che non utilizza OS Login, ma utilizza un account di servizio, l'utente deve disporre delle seguenti autorizzazioni:

  • iap.tunnelInstances.accessViaIAP
  • compute.instances.get
  • compute.instances.list
  • compute.projects.get
  • compute.instances.setMetadata
  • compute.projects.setCommonInstanceMetadata
  • compute.globalOperations.get
  • iam.serviceAccounts.actAs

Tunneling connessioni SSH

Puoi connetterti a istanze Linux che non hanno un indirizzo IP esterno eseguendo il tunneling del traffico SSH tramite IAP.

Quando utilizzi il tunneling IAP, i proxy IAP si connettono all'indirizzo IPv4 principale di nic0 sulla VM.

console

Per connetterti all'istanza, utilizza il pulsante SSH in Google Cloud Console. La configurazione dell'accesso alla tua istanza (definita tramite le autorizzazioni IAM) deve consentire il tunneling TCP tramite IAP.

gcloud

Per connetterti all'istanza, utilizza il comando gcloud compute ssh. La configurazione dell'accesso alla tua istanza (definita tramite le autorizzazioni IAM) deve consentire il tunneling TCP tramite IAP.

gcloud compute ssh INSTANCE_NAME

Sostituisci INSTANCE_NAME con il nome dell'istanza in cui SSH. SSH.

Se l'istanza non ha un indirizzo IP esterno, la connessione utilizza automaticamente il tunneling IAP TCP. Se l'istanza ha un indirizzo IP esterno, la connessione utilizza l'indirizzo IP esterno anziché il tunneling TCP IAP.

Puoi utilizzare il flag --tunnel-through-iap in modo che gcloud compute ssh utilizzi sempre il tunneling TCP IAP.

Utilizza il flag --internal-ip in modo che gcloud compute ssh non utilizzi mai il tunneling TCP IAP e si connetta direttamente all'IP interno della VM. Questa operazione è utile per i client che sono connessi alla stessa rete VPC della VM di destinazione.

Desktop IAP

Puoi utilizzare IAP Desktop per connetterti a un'istanza VM utilizzando SSH e l'inoltro TCP IAP.

  1. Nell'applicazione, seleziona File > Add Google Cloud project.

  2. Inserisci l'ID o il nome del progetto e fai clic su OK.

  3. Nella finestra Esplora progetto, fai clic con il pulsante destro del mouse sull'istanza VM a cui vuoi connetterti e seleziona Connetti.

Desktop IAP

Per ulteriori informazioni su IAP Desktop, consulta la pagina del progetto GitHub.

Spugna

Puoi configurare PuTTY in modo che utilizzi il forwarding TCP da IAP per connetterti a un'istanza VM. La configurazione dell'accesso alla tua istanza (definita tramite le autorizzazioni IAM) deve consentire il tunneling TCP tramite IAP.

Prima di configurare PuTTY, utilizza una volta il comando gcloud compute ssh per assicurarti di avere una chiave SSH privata sul tuo computer locale e che la tua chiave SSH pubblica sia pubblicata su Compute Engine:

  1. Apri un prompt dei comandi ed esegui il comando seguente per connetterti all'istanza VM:

    gcloud compute ssh INSTANCE_NAME `
      --tunnel-through-iap `
      --project PROJECT_ID `
      --zone ZONE
    

    Sostituisci quanto segue:

    • INSTANCE_NAME: nome dell'istanza a cui connetterti
    • PROJECT_ID: ID progetto del progetto in cui si trova l'istanza VM
    • ZONE: zona in cui si trova l'istanza VM

    Se necessario, conferma che vuoi generare chiavi SSH premendo Y.

  2. Sulla VM, determina il tuo nome utente eseguendo questo comando:

    whoami
    

    che ti servirà in un secondo momento.

Ora puoi configurare PuTTY in modo che utilizzi il forwarding TCP da IAP:

  1. Apri PuTTY e seleziona la categoria Connessione > Proxy.
  2. Configura le seguenti impostazioni proxy:

    • Per Tipo di proxy, seleziona Local.
    • Nel campo Comando Telnet o proxy locale, inserisci quanto segue:

      gcloud.cmd compute start-iap-tunnel %host %port --listen-on-stdin --project PROJECT_ID --zone ZONE
      

      Sostituisci quanto segue:

      • PROJECT_ID: ID progetto del progetto in cui si trova l'istanza VM
      • ZONE: zona in cui si trova l'istanza VM
    • Per Diagnostica diagnostica proxy nella finestra del terminale, seleziona Solo fino all'inizio della sessione.

  3. Seleziona la categoria Connection (Connessione) > SSH > Auth.

  4. Fai clic su Sfoglia e incolla il seguente nome file, quindi fai clic su Apri:

    %USERPROFILE%\.ssh\google_compute_engine.ppk
    
  5. Seleziona la categoria Sessione.

  6. Configura le seguenti impostazioni proxy:

    • Nel campo Nome host (o indirizzo IP), inserisci quanto segue:

      USERNAME@INSTANCE_NAME
      

      Sostituisci quanto segue:

      • USERNAME: il nome utente Linux che hai determinato in precedenza
      • INSTANCE_NAME: il nome dell'istanza VM a cui vuoi connetterti
    • Sessioni salvate: inserisci un nome per la sessione.

  7. Fai clic su Salva.

  8. Fai clic su Apri per avviare la sessione SSH.

ssh

Puoi utilizzare direttamente il comando ssh con un'opzione ProxyCommand che utilizza gcloud per avviare il tunnel. Utilizza questo elemento per generare il comando ssh completo:

gcloud compute ssh INSTANCE_NAME --dry-run

Tunneling, connessioni RDP

Puoi connetterti a istanze Windows che non hanno un indirizzo IP esterno eseguendo il tunneling del traffico RDP tramite IAP:

Desktop IAP

Puoi utilizzare IAP Desktop per connetterti al desktop remoto di una o più istanze VM utilizzando l'inoltro TCP IAP.

  1. Nell'applicazione, seleziona File > Add Google Cloud project.

  2. Inserisci l'ID o il nome del progetto e fai clic su OK.

  3. Nella finestra Esplora progetto, fai clic con il pulsante destro del mouse sull'istanza VM a cui vuoi connetterti e seleziona Connetti.

Desktop IAP

Per ulteriori informazioni su IAP Desktop, consulta la pagina del progetto GitHub.

gcloud

Per connetterti al desktop remoto di un'istanza VM, devi prima creare un tunnel.

  1. Utilizza il comando gcloud compute start-iap-tunnel per creare un tunnel criptato con la porta RDP dell'istanza VM.

    gcloud compute start-iap-tunnel INSTANCE_NAME 3389 \
        --local-host-port=localhost:LOCAL_PORT \
        --zone=ZONE
    

    Sostituisci INSTANCE_NAME con il nome dell'istanza VM a cui vuoi connetterti. Sostituisci LOCAL_PORT con la porta localhost in cui vuoi associare il proxy o utilizza 0 per selezionarne automaticamente una inutilizzata. Sostituisci ZONE con la zona in cui si trova l'istanza VM.

  2. gcloud esegue un test di connettività con l'istanza VM, quindi apre un tunnel e mostra un numero di porta.

    Listening on port [LOCAL_PORT].
    

    Tutto il traffico inviato all'host locale: LOCAL_PORT viene inoltrato all'istanza VM. La porta è accessibile solo dalle applicazioni in esecuzione sul tuo computer locale.

  3. Lascia in esecuzione gcloud e apri l'app Connessione desktop remoto di Microsoft Windows.

  4. Inserisci l'endpoint del tunnel come nome del computer:

    localhost:LOCAL_PORT
    

    Sostituisci LOCAL_PORT con il numero di porta mostrato quando il tunnel è stato aperto da gcloud.

  5. Fai clic su Connect (Connetti).

Tunneling Altre connessioni TCP

Puoi utilizzare il forwarding TCP da IAP per altri protocolli basati su TCP utilizzando il comando gcloud compute start-iap-tunnel per allocare una porta locale. La porta locale esegue il tunneling del traffico dei dati dalla macchina locale alla macchina remota in uno stream HTTPS. IAP riceve quindi i dati, applica i controlli di accesso e inoltra i dati non aggregati alla porta remota. Al contrario, tutti i dati provenienti dalla porta remota vengono aggregati anche prima che vengano inviati alla porta locale in cui vengono decriptati.

gcloud

Crea un tunnel criptato con una porta dell'istanza VM:

gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT \
    --local-host-port=localhost:LOCAL_PORT \
    --zone=ZONE

Sostituisci INSTANCE_NAME e INSTANCE_PORT con il nome e la porta dell'istanza VM a cui vuoi connetterti. Sostituisci LOCAL_PORT con la porta localhost in cui vuoi associare il proxy. Sostituisci ZONE con la zona in cui si trova l'istanza VM.

gcloud esegue un test di connettività con l'istanza VM, quindi apre un tunnel e mostra un numero di porta.

Listening on port [LOCAL_PORT].

Tutto il traffico inviato a localhost: LOCAL_PORT viene inoltrato all'istanza VM. La porta è accessibile solo dalle applicazioni in esecuzione sul tuo computer locale.

Aumento della larghezza di banda di caricamento TCP IAP

Per aumentare la larghezza di banda del caricamento TCP IAP, considera l'installazione di NumPy nella stessa macchina in cui è installato l'interfaccia a riga di comando gcloud.

Linux

Per installare NumPy utilizzando pip nelle piattaforme Unix, esegui il comando seguente in una nuova istanza del terminale:

$(gcloud info --format="value(basic.python_location)") -m pip install numpy
Per ulteriori informazioni, visita il sito NumPy.org.

Se il messaggio di errore persiste dopo l'installazione di NumPy, completa il seguente passaggio: Esegui il seguente comando per consentire a gcloud di accedere ai pacchetti esterni:

export CLOUDSDK_PYTHON_SITEPACKAGES=1

Windows

Per installare NumPy mediante pip nelle piattaforme Windows, esegui il comando seguente in una nuova istanza di PowerShell:

start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
Per ulteriori informazioni, visita il sito NumPy.org.

Se il messaggio persiste dopo l'installazione di NumPy, è necessario un altro passaggio. Esegui il comando seguente per consentire a gcloud di accedere ai pacchetti esterni:

$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"

Limitazioni note

Larghezza di banda: la funzionalità di inoltro TCP di IAP non è destinata al trasferimento collettivo di dati. IAP si riserva il diritto di limitare il servizio per gli utenti che ne abusano.

Durata della connessione: IAP disconnette automaticamente le sessioni dopo 1 ora di inattività. Ti consigliamo di utilizzare la logica nelle applicazioni per gestire il ripristino di un tunnel quando viene disconnesso.

Passaggi successivi