Configurazione dell'accesso sensibile al contesto con Identity-Aware Proxy

Questa guida descrive come estendere i criteri di accesso di Identity-Aware Proxy (IAP) utilizzando i livelli di accesso e il framework delle condizioni di Identity and Access Management (IAM). I livelli di accesso consentono limitazioni di accesso alle risorse in base all'indirizzo IP e agli attributi dei dispositivi degli utenti finali. Le condizioni IAM consentono limitazioni di accesso basate su host URL, percorsi, data e ora.

Ad esempio, a seconda della configurazione dei criteri, la tua app sensibile può:

  • Concedi l'accesso a tutti i dipendenti che utilizzano un dispositivo aziendale attendibile della tua rete aziendale.
  • Concedi l'accesso ai dipendenti del gruppo di accesso remoto se utilizzano un dispositivo aziendale attendibile con una password sicura e un livello patch aggiornato, da qualsiasi rete.
  • Concedi l'accesso solo ai dipendenti del gruppo Accesso con privilegi se il percorso dell'URL inizia con /admin.

Prima di iniziare

Prima di iniziare, avrai bisogno di:

  • Un'app protetta da IAP a cui vuoi aggiungere l'accesso individuale o di gruppo.
  • Nomi degli utenti o dei gruppi a cui vuoi concedere l'accesso.

Configurazione di un livello di accesso

Per limitare l'accesso in base all'indirizzo IP o agli attributi del dispositivo dell'utente finale, devi creare un livello di accesso. Per scoprire come creare un livello di accesso, consulta la guida Gestore contesto accesso. IAP utilizza il nome del livello di accesso per associarlo a un'app protetta da IAP.

L'utilizzo di criteri con ambito non è supportato da IAP. I livelli di accesso devono essere impostati nel criterio di accesso dell'organizzazione. Per ulteriori informazioni, consulta Creare un criterio di accesso.

Modifica del criterio IAM

Un'app protetta da IAP ha un criterio IAM che associa il ruolo IAP all'app.

Se aggiungi un'associazione condizionale IAM al criterio IAM, l'accesso alle risorse viene ulteriormente limitato in base agli attributi della richiesta. Questi attributi della richiesta includono:

  • Livelli di accesso
  • Host/percorso URL
  • Data/ora

Tieni presente che i valori della richiesta confrontati con request.host e request.path specificati in un'associazione condizionale IAM devono essere esatti. Ad esempio, se limiti l'accesso ai percorsi che iniziano con /internal admin, è possibile bypassare la limitazione andando all'indirizzo /internal%20admin. Per saperne di più sulle condizioni dei nomi host e del percorso, consulta la sezione Utilizzare le condizioni relative ai nomi host e al percorso.

Aggiungi e modifica le associazioni condizionali sul tuo criterio IAM seguendo la procedura riportata di seguito.

Console

Per aggiungere un'associazione condizionale utilizzando la console Google Cloud:

  1. Vai alla pagina di amministrazione di IAP.

    Vai alla pagina di amministrazione di IAP

  2. Seleziona la casella di controllo accanto alle risorse per cui vuoi aggiornare le autorizzazioni IAM.

  3. Nel riquadro delle informazioni a destra, fai clic su Aggiungi entità.

  4. Nella casella Nuova entità, inserisci le entità a cui vuoi assegnare un ruolo.

  5. Nell'elenco a discesa Seleziona un ruolo, seleziona il ruolo Utente applicazione web con protezione IAP e specifica le condizioni del livello di accesso che le entità devono soddisfare per accedere alla risorsa.

    • Per specificare i livelli di accesso esistenti, selezionali dall'elenco a discesa Livelli di accesso. Per visualizzare i livelli di accesso esistenti, devi selezionare il ruolo Utente applicazione web con protezione IAP e disporre delle autorizzazioni a livello di organizzazione. Devi concedere uno dei seguenti ruoli:
      • Amministratore Gestore contesto accesso
      • Editor Gestore contesto accesso
      • Lettore Gestore contesto accesso
    • Per creare e gestire i livelli di accesso, utilizza Gestore contesto accesso.
  6. Se vuoi aggiungere altri ruoli alle entità, fai clic su Aggiungi un altro ruolo.

  7. Una volta completata l'aggiunta dei ruoli, fai clic su Salva.

    Ora hai aggiunto un'associazione condizionale alla risorsa.

Per rimuovere un'associazione condizionale:

  1. Vai alla pagina di amministrazione di IAP.

    Vai alla pagina Amministrazione di IAP

  2. Seleziona la casella di controllo accanto alla risorsa da cui vuoi rimuovere il ruolo IAM di un'entità.

  3. Nel riquadro Informazioni a destra, in Ruolo / Entità, fai clic sul ruolo che vuoi rimuovere dall'entità.

  4. Fai clic su Rimuovi accanto all'entità.

  5. Nella finestra di dialogo Rimuovi ruolo dall'entità visualizzata, fai clic su Rimuovi. Per rimuovere tutti i ruoli non ereditati dall'entità nella risorsa selezionata, seleziona la casella di controllo prima di fare clic su Rimuovi.

gcloud

Al momento, puoi utilizzare lo strumento gcloud solo per impostare le associazioni condizionali a livello di progetto.

Per impostare associazioni condizionali, modifica il file policy.yaml del progetto seguendo la procedura riportata di seguito:

  1. Apri il criterio IAM per l'app utilizzando il seguente comando gcloud:

    gcloud iap web get-iam-policy PROJECT_ID > policy.yaml

  2. Modifica il file policy.yaml per specificare quanto segue:

    • Gli utenti e i gruppi a cui vuoi applicare la condizione IAM.
    • Il ruolo iap.httpsResourceAccessor per concedere l'accesso alle risorse.
    • La condizione IAM.

      Lo snippet seguente mostra una condizione IAM con un solo attributo specificato. Questa condizione concede l'accesso all'utente e al gruppo se i requisiti per il livello di accesso ACCESS_LEVEL_NAME sono soddisfatti e il percorso dell'URL della risorsa inizia con /.

    bindings:
    ...
      - members:
        - group:EXAMPLE_GROUP@GOOGLE.COM
        - user:EXAMPLE_USER@GOOGLE.COM
        role: roles/iap.httpsResourceAccessor
        condition:
                  expression: "accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in
                              request.auth.access_levels && request.path.startsWith("/")
                  title: CONDITION_TITLE
    ...
    
  3. Associa il criterio all'applicazione utilizzando il comando set-iam-policy.

    gcloud iap web set-iam-policy --project PROJECT_ID policy.yaml

Il criterio IAM ora include un'associazione condizionale.

API

Per modificare il file policy.json dell'app, svolgi la procedura riportata di seguito per il tuo tipo di app. Consulta Gestione dell'accesso alle risorse protette con IAP per ulteriori informazioni sull'utilizzo dell'API IAM per gestire i criteri di accesso.

Prima di eseguire i passaggi per l'API specifici per l'applicazione riportati di seguito, esporta le seguenti variabili:

 export PROJECT_NUM=PROJECT_NUMBER
 export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/${PROJECT_NUM}/iap_web
 # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
 export JSON_NEW_POLICY=POLICY_FILE.JSON
 

App Engine

  1. Esporta le seguenti variabili di App Engine:

    # The APP_ID is usually the project ID
    export GAE_APP_ID=APP_ID
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}

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

    curl -i -H "Authentication: Bearer $(gcloud auth print-access-token)" \
    ${GAE_BASE_URL}/:getIamPolicy -d ''
    

  3. Aggiungi l'associazione condizionale IAM al file JSON dei criteri IAM. Di seguito è riportato un esempio di file policy.json modificato che associa il ruolo iap.httpsResourceAccessor a due utenti, concedendo loro l'accesso alle risorse protette da IAP. È stata aggiunta una condizione IAM per concedere loro l'accesso alle risorse solo se il requisito relativo al livello di accesso ACCESS_LEVEL_NAME è soddisfatto e il percorso dell'URL della risorsa inizia con /. Può esistere una sola condizione per associazione.

    File policy.json di esempio

    {
    "policy": {
    "bindings": [
    {
      "role": "roles/iap.httpsResourceAccessor",
      "members": [
          "group:EXAMPLE_GROUP@GOOGLE.COM",
          "user:EXAMPLE_USER@GOOGLE.COM"
      ],
      "condition": {
        "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
        "title": "CONDITION_NAME"
      }
    }
    ]
    }
    }

  4. Imposta il nuovo file policy.json con il metodo setIamPolicy.

    curl -i -H "Authentication: Bearer $(gcloud auth print-access-token)" \
    ${GAE_BASE_URL}:setIamPolicy -d @${JSON_NEW_POLICY}

Servizi e versioni di App Engine

Puoi anche aggiornare il criterio IAM di un servizio App Engine, di tutte le versioni o di una versione specifica di un servizio. Per eseguire questa operazione per una versione specifica di un servizio:

  1. Esporta le seguenti variabili aggiuntive.
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
    
  2. Aggiorna la variabile GAE_BASE_URL esportata.
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
  3. Ottieni e imposta il criterio IAM per la versione utilizzando i comandi getIamPolicy e setIamPolicy mostrati sopra.

GKE e Compute Engine

  1. Esporta l'ID progetto del tuo servizio di backend.

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. Ottieni il criterio IAM per l'app 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 "Authentication: Bearer $(gcloud auth print-access-token)" \
     ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
     -d ''

  3. Aggiungi l'associazione condizionale IAM al file JSON dei criteri IAM. Di seguito è riportato un esempio di file policy.json modificato che associa il ruolo iap.httpsResourceAccessor a due utenti, concedendo loro l'accesso alle risorse protette da IAP. È stata aggiunta una condizione IAM per concedere loro l'accesso alle risorse solo se il requisito relativo al livello di accesso ACCESS_LEVEL_NAME è soddisfatto e il percorso dell'URL della risorsa inizia con /. Può esistere una sola condizione per associazione.


    File policy.json di esempio

    {
    "policy": {
    "bindings": [
    {
    "role": "roles/iap.httpsResourceAccessor",
    "members": [
      "group":EXAMPLE_GROUP@GOOGLE.COM,
      "user:EXAMPLE_USER@GOOGLE.COM"
    ],
    "condition": {
      "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
      "title": "CONDITION_NAME"
    }
    }
    ]
    }
    }

  4. Imposta il nuovo file policy.json con il metodo setIamPolicy.

    curl -i -H "Content-Type:application/json" \
         -H "Authentication: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}

Utilizzo delle condizioni per nomi host e percorso

L'accesso alla tua app può essere protetto utilizzando il nome host e il percorso di un URL di richiesta. Ad esempio, la condizione IAM request.path.startsWith può essere utilizzata per concedere l'accesso solo ai dipendenti del gruppo Accesso con privilegi se il percorso dell'URL inizia con /admin.

Per maggiori informazioni sull'utilizzo delle condizioni per nomi host e percorso, consulta la pagina relativa agli attributi di richiesta.

Normalizzazione delle stringhe

Un URL ha un nome host e un percorso. Ad esempio, l'URL https://sheets.google.com/create?query=param ha un nome host sheets.google.com e un percorso /create.

I backend possono interpretare i nomi host e i percorsi in modi diversi. Per rimuovere l'ambiguità, IAP normalizza le stringhe del nome host e del percorso durante il controllo dei criteri.

IAP esegue due controlli dei criteri quando una richiesta ha un percorso non normalizzato. Se il percorso non normalizzato supera il controllo dei criteri, IAP normalizza il percorso ed esegue un secondo controllo dei criteri. L'accesso viene concesso se sia i percorsi non normalizzati che quelli normalizzati superano il controllo del criterio.

Ad esempio, se il percorso di una richiesta è /internal;some_param/admin, IAP esegue prima un controllo dei criteri sul percorso non normalizzato (/internal). Se il percorso supera, IAP esegue un secondo controllo dei criteri sul percorso normalizzato (/internal/admin).

Nomi host

I nomi host sono normalizzati per:

  • Rimozione dei punti finali
  • Caratteri minuscoli
  • Conversione in formato ASCII

I nomi host che includono caratteri non ASCII vengono ulteriormente normalizzati con punizione. Per creare una corrispondenza, devi inserire la punycode della stringa del nome host.

Per punycode la stringa del nome host, utilizza un convertitore come Punycoder.

Di seguito sono riportati alcuni esempi di nomi host normalizzati:

  • FOO.com è normalizzato in foo.com
  • café.fr è normalizzato in xn--caf-dma.fr

Percorsi

I percorsi sono normalizzati per:

  • Rimozione dei parametri del percorso
  • Risolvere i percorsi relativi all'equivalente assoluto

Un parametro percorso include tutti i caratteri da un elemento ; a quello successivo (/) o alla fine del percorso.

Le richieste che contengono ..; all'inizio di una sezione del percorso sono considerate non valide. Ad esempio, /..;bar/ e /bar/..;/ restituiscono l'errore HTTP 400: Bad Request.

Di seguito sono riportati alcuni esempi di percorsi normalizzati:

  • /internal;some_param/admin è normalizzato in /internal/admin
  • /a/../b è normalizzato in /b
  • /bar;param1/baz;baz;param2 è normalizzato in /bar/baz

Suffissi di sottodominio

Un criterio impostato con request.host.endsWith("google.com") corrisponderà sia a sub_domain.google.com sia a testgoogle.com. Se il tuo obiettivo è limitare il criterio a tutti i sottodomini alla fine con google.com, imposta il criterio su request.host.endsWith(".google.com").

Tieni presente che l'impostazione del criterio su request.host.endsWith(".google.com") corrisponderà a sub_domain.google.com, ma non a google.com a causa dell'elemento . aggiuntivo.

Cloud Audit Logs e livelli di accesso

L'abilitazione di Cloud Audit Logs per il tuo progetto protetto con IAP consente di visualizzare le richieste di accesso autorizzate e non autorizzate. Visualizza le richieste e tutti i livelli di accesso soddisfatti da un richiedente seguendo la procedura riportata di seguito:

  1. Vai a Esplora log della console Google Cloud per il tuo progetto.
    Vai alla pagina dei log
  2. Nell'elenco a discesa del selettore delle risorse, seleziona una risorsa. Le risorse HTTPS protette con IAP si trovano in Applicazione GAE e nel servizio di backend GCE. Le risorse SSH e TCP protette con IAP si trovano in un'istanza VM GCE.
  3. Nell'elenco a discesa tipo di log, seleziona data_access.
    • Il tipo di log data_access viene visualizzato solo se, dopo l'abilitazione di Cloud Audit Logs per IAP, c'è stato traffico verso la tua risorsa.
  4. Fai clic per espandere la data e l'ora dell'accesso che vuoi rivedere.
    • L'accesso autorizzato è contrassegnato da un'icona i blu.
    • L'accesso non autorizzato è contrassegnato da un'icona !! arancione.
  5. Visualizza i livelli di accesso soddisfatti dal richiedente facendo clic per espandere le sezioni fino a raggiungere protoPayload > requestMetadata > requestAttributes > auth > accessLevels.

Tieni presente che tutti i livelli di accesso soddisfatti da un utente sono visibili durante la visualizzazione di una richiesta, inclusi i livelli di accesso non necessari per accedervi. La visualizzazione di una richiesta non autorizzata non indica quali livelli di accesso non sono stati soddisfatti. Questo viene determinato confrontando le condizioni nella risorsa con i livelli di accesso visibili nella richiesta.

Per ulteriori informazioni sui log, consulta la guida Cloud Audit Logs.