Configurazione dell'autenticazione utente di Cloud Service Mesh

L'autenticazione utente di Cloud Service Mesh è una soluzione integrata per le applicazioni basate su browser l'autenticazione dell'utente finale e il controllo dell'accesso ai carichi di lavoro di cui si esegue il deployment. Consente di l'integrazione con provider di identità (IdP) esistenti per l'autenticazione degli utenti e utilizza le API e i criteri di autorizzazione Istio per la gestione degli accessi. È un'alternativa user-friendly all'autenticazione JWT (JSON Web Token) di Istio.

Un caso d'uso tipico è quando un'organizzazione utilizza Cloud Service Mesh per ospitare un'applicazione web a cui la sua forza lavoro può accedere tramite un browser web. Inoltre, l'organizzazione deve utilizzare il proprio provider di identità esistente per gestire le identità degli utenti. L'autenticazione utente di Cloud Service Mesh semplifica l'autenticazione degli utenti tramite un flusso di accesso e consenso OpenID Connect (OIDC) web standard. Quando l'utente si autentica, Cloud Service Mesh applica i criteri di autorizzazione Istio e, al termine dell'autorizzazione, trasmette l'identità ai carichi di lavoro in un formato di credenziali sicuro.

Come funziona

L'autenticazione utente di Cloud Service Mesh introduce un nuovo componente, authservice. Questo componente si integra con l'ingress basato su Envoy come servizio di autorizzazione esterno che intercetta tutte le richieste in arrivo per l'autenticazione. authservice implementa il lato client del protocollo OIDC e consente agli utenti di accedere alle applicazioni tramite un browser, nel quale gli utenti completano l'autenticazione interattiva e il flusso di consenso per stabilire una sessione di breve durata. authservice implementa protocolli standard del settore per l'integrazione con qualsiasi che può fungere da server di autorizzazione OIDC. Quando l'utente viene autenticato, le informazioni sull'entità vengono incapsulate in un RCToken in formato JWT, firmato da authservice, che viene inoltrato al livello di autorizzazione Istio nell'ingress. Questo modello fornisce il controllo degli accessi al perimetro per il traffico in mesh. Se l'utente è autorizzato ad accedere a una risorsa, questo token RC viene anche inoltrato ai microservizi per ottenere informazioni sull'entità e applicare un controllo dell'accesso granulare.

Il seguente diagramma mostra la posizione di authservice nel mesh e il suo rapporto con le altre parti del mesh, ad esempio l'ingresso, i carichi di lavoro, il browser dell'utente e qualsiasi IdP esistente.

autenticazione dell'utente finale

Gli amministratori possono installare authservice come componente aggiuntivo su un'installazione di Cloud Service Mesh. Una volta installato, authservice legge l'endpoint OIDC configurazione e altre impostazioni associate definite nella configurazione di UserAuth risorsa. L'amministratore può utilizzare le API ExternalAuthorization di Cloud Service Mesh per configurare auth_server come filtro sull'ingresso.

Installa il servizio di autenticazione degli utenti

I passaggi riportati di seguito spiegano come configurare authservice.

Prerequisiti

Segui i passaggi descritti in Installare gli strumenti dipendenti e convalidare il cluster. a:
  • Se utilizzi Cloud Service Mesh gestito su un cluster privato, assicurati che il cluster sia in grado di inviare traffico in uscita all'IDP.

  • Scarica il pacchetto kpt:

    kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth.git/@v1.2.1 .
    cd asm-user-auth/
    

    Questo comando recupera un pacchetto kpt con il configurazione di authservice dal repository pubblico. La contiene i manifest per il deployment del container authservice come pod in lo spazio dei nomi asm-user-auth. Inoltre, configura il gateway in entrata e richiede l'autorizzazione per tutte le richieste.

Personalizza l'overlay di installazione dell'autenticazione utente

Per installare il servizio di autenticazione utente, devi personalizzare l'installazione di Cloud Service Mesh per aggiungere un provider di autorizzazione esterno a livello di mesh. I passaggi necessari dipendono dal fatto che tu stia utilizzando Cloud Service Mesh gestito o in-cluster.

Gestito

  1. Aggiorna il ConfigMap per includere il mesh di autenticazione utente. Nel comando seguente, utilizza lo stesso REVISION_LABEL utilizzato durante il provisioning di Cloud Service Mesh gestito (ad esempio asm-managed, asm-managed-rapid o asm-managed-stable):

    kubectl edit configmap istio-REVISION_LABEL -n istio-system
    
  2. Aggiungi il seguente testo sotto il campo mesh in MeshConfig:

    mesh: |-
    ...
      extensionProviders:
      - name: "asm-userauth-grpc"
        envoyExtAuthzGrpc:
          service: "authservice.asm-user-auth.svc.cluster.local"
          port: "10003"
    
  3. Crea ed etichetta lo spazio dei nomi asm-user-auth.

    kubectl create namespace asm-user-auth
    kubectl label namespace asm-user-auth istio.io/rev=REVISION --overwrite
    

    Per trovare l'etichetta REVISION, consulta Etichette di iniezione.

  4. Installa il gateway Istio nello spazio dei nomi asm-user-auth.

    kubectl apply -n asm-user-auth -f DIR_PATH/samples/gateways/istio-ingressgateway
    

Nel cluster

  1. Ottieni l'esempio overlay autenticazione utente e aggiornalo se ci sono personalizzazioni nella tua rete mesh. È una best practice consigliata per mantenere questo file di overlay nel codice sorgente controllo.

    curl https://raw.githubusercontent.com/GoogleCloudPlatform/asm-user-auth/v1.2.1/overlay/user-auth-overlay.yaml > user-auth-overlay.yaml
    
  2. Segui la procedura per installare Cloud Service Mesh con overlay per utilizzare uno script fornito da Google per installare Cloud Service Mesh con l'overlay di autenticazione utente. Ad esempio:

    ./asmcli install \
      --project_id PROJECT_ID \
      --cluster_name CLUSTER_NAME \
      --cluster_location CLUSTER_LOCATION \
      --fleet_id FLEET_PROJECT_ID \
      --output_dir DIR_PATH \
      --enable_all \
      --custom_overlay user-auth-overlay.yaml
    

    I pacchetti kpt di autenticazione utente creano un AuthorizationPolicy per fare riferimento al provider di autorizzazione esterno specificato pkg/ext-authz.yaml.

  3. Crea ed etichetta lo spazio dei nomi asm-user-auth.

    kubectl create namespace asm-user-auth
    kubectl label namespace asm-user-auth istio.io/rev=REVISION --overwrite
    

    Puoi trovare il valore dell'etichetta REVISION selezionando kubectl get pod -n istio-system -L istio.io/rev

  4. Installa il gateway Istio nello spazio dei nomi asm-user-auth.

    kubectl apply -n asm-user-auth -f DIR_PATH/samples/gateways/istio-ingressgateway
    

Prepara la configurazione del client OIDC

Imposta la configurazione del client OIDC seguendo questi passaggi. Questa guida utilizza Google in qualità di IdP, ma puoi utilizzare qualsiasi IdP che supporti l'autenticazione OIDC.

  1. Nella console Google Cloud, vai a API e servizi > Credenziali.

    Vai a credenziali

  2. Vai a Crea credenziali, quindi scegli ID client OAuth. Se necessario, imposta le opzioni della schermata per il consenso OAuth, quindi configura le seguenti opzioni:

    • Imposta Tipo di applicazione su Applicazione web.
    • Imposta URI di reindirizzamento autorizzato su https://REDIRECT_HOST/REDIRECT_PATH. Ad esempio, per localhost puoi impostare https://localhost:8443/_gcp_asm_authenticate.

    Quindi, fai clic su Salva.

  3. Inoltre, salva la configurazione del client OIDC per utilizzarla in un secondo momento.

    export OIDC_CLIENT_ID=CLIENT_ID
    export OIDC_CLIENT_SECRET=CLIENT_SECRET
    export OIDC_ISSUER_URI=ISSUER_URI
    export OIDC_REDIRECT_HOST=REDIRECT_HOST
    export OIDC_REDIRECT_PATH=REDIRECT_PATH
    

Imposta l'URL di reindirizzamento e il secret per il gateway di ingresso

OAuth2 richiede un URL di reindirizzamento ospitato su un endpoint protetto da HTTPS. Questi sono a scopo di esempio e semplificano la configurazione generando un per il gateway Istio in entrata.

  1. Genera un certificato autofirmato:

    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
     -days 365 -nodes -subj '/CN=localhost'
    
  2. Crea un secret per il gateway in entrata per ospitare il traffico HTTPS:

    kubectl create -n asm-user-auth secret tls userauth-tls-cert --key=key.pem \
    --cert=cert.pem
    

Applica le chiavi di crittografia e firma

authservice ha bisogno di due serie di chiavi per funzionare correttamente. La prima è una chiave simmetrica per la crittografia e la decriptazione. Questa chiave viene utilizzata per criptare lo stato della sessione prima di impostarlo come cookie.

Il secondo set di chiavi è costituito da una coppia di chiave pubblica/privata. Questa chiave viene utilizzata per firmare le informazioni utente autenticate in formato JWT come RCToken. La chiave pubblica di questa coppia viene pubblicata in un endpoint predefinito che i sidecar possono utilizzare per convalidare il JWT.

Il pacchetto kpt di autenticazione utente contiene due chiavi di esempio per una configurazione rapida. Tuttavia, puoi utilizzare il tuo sistema di gestione delle chiavi preferito per generare queste chiavi. .

  1. Prepara la chiave di crittografia della sessione con il seguente formato o utilizza l'esempio del pacchetto, che puoi visualizzare tramite cat ./samples/cookie_encryption_key.json.

    {
      "keys":[
         {
            "kty":"oct",
            "kid":"key-0",
            "k":"YOUR_AES_KEY",
            "useAfter": 1612813735
         }
      ]
    }
    

    Puoi generare una chiave AES di test con il seguente comando:

    openssl rand -base64 32
    
  2. Prepara la chiave di firma RCToken con il seguente formato o utilizza l'esempio dal pacchetto, che puoi visualizzare in base a cat ./samples/rctoken_signing_key.json.

    {
      "keys":[
         {
            "kty":"RSA",
            "kid":"rsa-signing-key",
            "k":"YOUR_AES_KEY",  # k contains a Base64 encoded PEM format RSA signing key.
            "useAfter": 1612813735  # unix timestamp
         }
      ]
    }
    

    Puoi generare una chiave privata RSA di prova a 256 bit con il seguente comando:

    openssl genpkey -algorithm RSA -out rsa_private.pem -pkeyopt rsa_keygen_bits:256
    
  3. Crea il secret Kubernetes, che authservice monterà nel proprio sistema file.

    kubectl create secret generic secret-key  \
        --from-file="session_cookie.key"="./samples/cookie_encryption_key.json" \
        --from-file="rctoken.key"="./samples/rctoken_signing_key.json"  \
        --namespace=asm-user-auth
    

esegui il deployment del servizio di autenticazione degli utenti

I comandi seguenti creano il servizio di autenticazione utente e il deployment lo spazio dei nomi asm-user-auth.

Imposta i valori necessari per la configurazione dell'autenticazione utente. L'ID client e vengono archiviati come secret di Kubernetes, perciò viene utilizzato Base64 per codificarli. Visita il repository pubblico per visualizzare tutti i settati disponibili.

kpt fn eval pkg --image gcr.io/kpt-fn/apply-setters:v0.2 --truncate-output=false -- \
  client-id="$(echo -n ${OIDC_CLIENT_ID} | base64 -w0)" \
  client-secret="$(echo -n ${OIDC_CLIENT_SECRET} | base64 -w0)" \
  issuer-uri="${OIDC_ISSUER_URI}" \
  redirect-host="${OIDC_REDIRECT_HOST}" \
  redirect-path="${OIDC_REDIRECT_PATH}"

Applica il pacchetto kpt:

# Remove the potential alpha version CRD if exists.
kubectl delete crd userauthconfigs.security.anthos.io
kubectl apply -f ./pkg/asm_user_auth_config_v1beta1.yaml
kubectl apply -f ./pkg

authservice utilizza il CRD UserAuthConfig per fornire l'autenticazione degli utenti finali. È possibile configurare UserAuthConfig in fase di esecuzione aggiornalo per modificare il comportamento di authservice e configurarlo con gli endpoint per qualsiasi server di autorizzazione OIDC.

Puoi visualizzare il file cat pkg/user_auth_config.yaml, che contiene i seguenti campi:

apiVersion: security.anthos.io/v1beta1
kind: UserAuthConfig
metadata:
  name: user-auth-config
  namespace: asm-user-auth
spec:
  authentication:
    oidc:
      certificateAuthorityData: ""  # kpt-set: ${ca-cert}
      issuerURI: "<your issuer uri>"  # kpt-set: ${issuer-uri}
      proxy: ""  # kpt-set: ${proxy}
      oauthCredentialsSecret:
        name: "oauth-secret"  # kpt-set: ${secret-name}
        namespace: "asm-user-auth"  # kpt-set: ${secret-namespace}
      redirectURIHost: ""  # kpt-set: ${redirect-host}
      redirectURIPath: "/_gcp_asm_authenticate"  # kpt-set: ${redirect-path}
      scopes: ""  # kpt-set: ${scopes}
      groupsClaim: ""  # kpt-set: ${groups}
  outputJWTAudience: "test_audience"  # kpt-set: ${jwt-audience}

Consulta: dettagli di configurazione dell'autenticazione utente per descrizioni dettagliate dei campi user_auth_config.yaml.

Eseguire attività post-installazione

Dopo aver completato l'installazione precedente, dovrai eseguire le seguenti attività passaggi.

Attivare l'autenticazione utente per le applicazioni

Questa sezione illustra come abilitare l'autenticazione utente utilizzando il metodo httpbin, ad esempio.

L'autenticazione utente di Cloud Service Mesh utilizza un CUSTOM criterio di autorizzazione definito per attivare il flusso OIDC.

Dopo aver installato il gateway Istio, configuralo in modo da gestire il traffico HTTPS utilizzando il certificato TLS userauth-tls-cert che hai creato sopra. Di seguito è riportata la configurazione di pkg/gateway.yaml installato.

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: userauth
  namespace: asm-user-auth
spec:
  selector:
    istio: ingressgateway
  servers:
  - hosts:
    - '*'
    port:
      name: https
      number: 443
      protocol: HTTPS
    tls:
      mode: SIMPLE
      credentialName: userauth-tls-cert
---
# This ensures the OIDC endpoint has at least some route defined.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: userauth-oidc
  namespace: asm-user-auth
spec:
  gateways:
  - userauth
  hosts:
  - '*'
  http:
  - match:
    - uri:
        prefix: /status
    - uri:
        prefix: "your-oidc-redirect-path"
    name: user-auth-route
    route:
    - destination:
        host: authservice
        port:
          number: 10004
  1. Etichetta lo spazio dei nomi default per abilitare l'inserimento automatico di istio-proxy deployment di machine learning.

    kubectl label namespace default istio.io/rev=REVISION --overwrite
    
  2. Esegui il deployment di httpbin nello spazio dei nomi default.

    kubectl apply -f https://raw.githubusercontent.com/istio/istio/master/samples/httpbin/httpbin.yaml -n default
    
  3. Aggiorna httpbin in modo da utilizzare questo gateway per gestire il traffico HTTPS e utilizza il forwarding delle porte per accedere all'applicazione localmente:

    kubectl apply -f./samples/httpbin-route.yaml -n default
    kubectl port-forward service/istio-ingressgateway 8443:443 -n asm-user-auth
    
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: httpbin
      namespace: default
    spec:
      gateways:
      - asm-user-auth/userauth
      hosts:
      - '*'
      http:
      - match:
        - uri:
            prefix: /ip
        - uri:
            prefix: /headers
        name: httpbin-routes
        route:
        - destination:
            host: httpbin.default.svc.cluster.local
            port:
              number: 8000
    

    Il gateway in ingresso sulla porta 8443 verrà inoltrato a localhost per rendere l'applicazione accessibile localmente.

  4. Esegui il deployment di samples/rctoken-authz.yaml per abilitare RequestAuthentication e AuthorizationPolicy per verificare RCToken per le richieste.

    kubectl apply -f ./samples/rctoken-authz.yaml -n asm-user-auth
    

    Esempio di samples/rctoken-authz.yaml:

    apiVersion: security.istio.io/v1beta1
    kind: RequestAuthentication
    metadata:
      name: require-rc-token
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      jwtRules:
      - issuer: "authservice.asm-user-auth.svc.cluster.local"
        audiences:
        - "test_audience"
        jwksUri: "http://authservice.asm-user-auth.svc.cluster.local:10004/_gcp_user_auth/jwks"
        fromHeaders:
        - name: X-ASM-RCTOKEN
        forwardOriginalToken: true
    ---
    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: require-rc-token
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      action: ALLOW
      rules:
      - when:
        - key: request.auth.claims[iss]
          values:
          - authservice.asm-user-auth.svc.cluster.local
        - key: request.auth.claims[aud]
          values:
          - test_audience
    

Verificare l'autenticazione utente

httpbin gestisce due percorsi: /ip è accessibile pubblicamente e /headers richiede che l'utente finale acceda tramite il proprio IdP configurato.

  1. Per verificare di poter accedere direttamente a /ip, visita https://localhost:8443/ip.

  2. Verifica di visualizzare la pagina di accesso OIDC visitando https://localhost:8443/headers.

  3. Dopo aver eseguito l'accesso, fai clic su Avanti e verifica che ti reindirizzi alla pagina /headers.

Configura criteri di autorizzazione

Dopo aver completato la configurazione nei passaggi precedenti, ogni utente reindirizzate tramite un flusso di autenticazione basato sul web. Al termine del flusso, authservice genera un RCToken in formato JWT, che utilizza per trasmettere le informazioni sull'utente autenticato.

  1. Aggiungi i criteri di autorizzazione Istio all'ingresso per garantire che viene eseguita una verifica dell'autorizzazione per ciascun utente autenticato:

    kubectl apply -f ./samples/httpbin-authz.yaml -n asm-user-auth
    
  2. Il file httpbin-authz.yaml configura il gateway in entrata per convalidare il Token RC emesso da authservice e autorizzato solo quando il JWT contiene il valore come segmenti di pubblico e emittenti.

    Vedi l'esempio di criterio di autorizzazione che segue:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: require-rc-token
    spec:
      selector:
        matchLabels:
          istio: ingressgateway
      action: ALLOW
      rules:
      - to:
        - operation:
            paths: ["/ip"]
      - to:
        when:
        - key: request.auth.claims[iss]
          values:
          - authservice.asm-user-auth.svc.cluster.local
        - key: request.auth.claims[aud]
          values:
          - test_audience
        - key: request.auth.claims[sub]
          values:
          - allowed_user_sub_1  # Change this with the "sub" claim in the RC token. Wildcard '*' will match everything.
    

Configura impostazioni specifiche per l'ambiente

I passaggi precedenti utilizzano localhost e un certificato HTTPS autofirmato per una configurazione rapida. Per l'utilizzo in produzione reale, utilizza il tuo dominio, ad esempio example.com.

Inoltre, assicurati che certificateAuthorityData abbia il certificato radice previsto contenuti. Ad esempio, se l'IDP è attendibile con i certificati principali del sistema, puoi lasciare il campo vuoto. Se è presente un proxy HTTPS che termina la connessione HTTPS, deve essere impostato sul certificato principale del proxy.

Gestisci e ruota le chiavi

authservice utilizza due set di chiavi. Puoi ruotare ogni tasto indipendentemente. Tuttavia, prima di ruotare le chiavi, è importante capire come funziona la rotazione.

Entrambe le chiavi sono in formato JSON. Il campo useAfter specifica il timestamp da quando la chiave verrà considerata in uso. Durante una rotazione delle chiavi, devi includere sia le chiavi vecchie che quelle nuove nel file JSON. Ad esempio, nel seguente ad esempio, new-key verrà utilizzato solo dopo il timestamp 1712813735.

{
   "keys":[
      {
         "kty":"RSA",
         "kid":"old-key",
         "K":"...", # k contains a Base64 encoded PEM format RSA signing key.
         "useAfter": 1612813735, # unix timestamp
      }
      {
      "kty":"RSA",
         "kid":"new-key",
         "K":"...", # k contains a Base64 encoded PEM format RSA signing key.
         "useAfter": 1712813735, # unix timestamp
      }
   ]
}

Cloud Service Mesh utilizza la chiave simmetrica per criptare i dati di sessione archiviati nei cookie del browser. Per garantire la validità delle sessioni esistenti, authservice tenta di decriptarli con tutte le chiavi nella chiave impostata. Al momento della rotazione, authservice utilizzerà la nuova chiave per criptare le nuove sessioni e continuerà a tentare la decrittografia con le vecchie chiavi.

La coppia di chiave pubblica/privata viene utilizzata per firmare RCToken. La chiave pubblica viene trasmessa ai sidecar da istiod per la verifica JWT. È fondamentale per file collaterali per ricevere la nuova chiave pubblica prima che authservice inizi a utilizzare la nuova chiave privata per firmare RCToken. A questo scopo, authservice inizia a pubblicare la chiave pubblica subito dopo l'aggiunta, ma attende una di tempo prima di iniziare a utilizzarlo per firmare RCToken.

Per riassumere, quando esegui rotazioni delle chiavi è consigliabile:

  1. Esegui rotazioni regolari delle chiavi o su richiesta, in base alle tue esigenze.
  2. Nel formato JSON, includi sia la chiave corrente che quella nuova. Le nuove chiavi devono essere associate a un timestamp in futuro. Ti consigliamo di specificare un timestamp almeno un paio d'ore prima dell'ora corrente.
  3. Monitora e verifica che i servizi siano ancora operativi dopo l'utilizzo della nuova chiave. Prima di procedere con il passaggio successivo, attendi almeno un giorno dall'utilizzo della nuova chiave.
  4. Rimuovi le vecchie chiavi dalle voci JSON. Non sono più necessari.

Distribuzione multi-cluster

L'autenticazione utente di Cloud Service Mesh supporta il deployment multi-cluster. Devi eseguire il deployment l'autenticazione utente in ogni cluster come descritto sopra. La configurazione dell'autenticazione utente, risorsa personalizzata UserAuth, client secret OIDC, chiavi di crittografia, devono essere replicati in ogni cluster.

Per impostazione predefinita, il gateway di ingresso eseguirà il bilanciamento del carico delle richieste di autenticazione su una qualsiasi delle authservice istanze. Puoi utilizzare la regola di destinazione per configurare il gateway di ingresso in modo che invii le richieste al authservice nello stesso cluster e il failover solo al authservice di altri cluster.

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: authservice-fail-over
  namespace: asm-user-auth
spec:
  host: authservice.asm-user-auth.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      localityLbSetting:
        enabled: true
        failover:
        - from:  us-east
          to: us-west
        - from: us-west
          to: us-east

Come per le altre configurazioni, questa deve essere configurata in ogni cluster.

Mappatura delle attestazioni personalizzate

Per configurare la mappatura delle attestazioni personalizzate, configura spec.authentication.oidc.attributeMapping per definire qualsiasi mapping dall'IDToken del provider di identità originale. La chiave sarà il nome della rivendicazione nell'RCToken e il valore è un'espressione CEL su come analizzare la rivendicazione dall'IDToken. Utilizza assertion per fare riferimento all'IDToken.

Esempio:

spec:
  authentication:
    oidc:
      attributeMapping:
        aud_copy: assertion.aud
        decision: 'assertion.sub.startsWith("123") ? "success" : "fail"'

In RCToken, un'attestazione nidificata attributes contiene le attestazioni che sono state configurate:

"attributes": {
    "aud_copy": "foo.googleusercontent.com",
    "decision": "success"
}

Se l'espressione CEL non riesce ad analizzare il valore dall'IDToken, ignorerà la rivendicazione senza interrompere il flusso di autenticazione.

Upgrade dell'autenticazione utente

  1. Installa di nuovo i pacchetti di autenticazione utente poiché contiene il programma binario aggiornato per la nuova versione di autenticazione utente:

    kpt pkg get https://github.com/GoogleCloudPlatform/asm-user-auth.git/@v1.2.1 .
    cd asm-user-auth/
    
  2. Salva la configurazione del client OIDC:

    export OIDC_CLIENT_ID=CLIENT_ID
    export OIDC_CLIENT_SECRET=CLIENT_SECRET
    export OIDC_ISSUER_URI=ISSUER_URI
    export OIDC_REDIRECT_HOST=REDIRECT_HOST
    export OIDC_REDIRECT_PATH=REDIRECT_PATH
    
  3. Eseguire il deployment del servizio di autenticazione utente di eseguire l'upgrade a una nuova versione.

Dettagli di configurazione dell'autenticazione utente

La tabella seguente descrive ciascun campo nel file CRD:

Nome campo Descrizione
authentication.oidc Questa sezione contiene la configurazione dell'endpoint OIDC e i parametri utilizzati nel flusso OIDC.
authentication.oidc.certificateAuthorityData Questo è il certificato radice SSL del dominio dell'autorizzazione OIDC server web o proxy HTTPS, se presente.
authentication.oidc.oauthCredentialsSecret Riferimenti ai secret di tipo Opaque di Kubernetes che contengono client_id e client_secret di OAuth2 OIDC nel payload JSON.
authentication.oidc.issuerURI L'URI da utilizzare come emittente nell'RCToken di output.
authentication.oidc.proxy Server proxy per l'IdP OIDC, se applicabile. Con il formato http://user:password@10.10.10.10:8888.
authentication.oidc.redirectURIHost L'host da utilizzare per l'URI di terminazione OAuth. Se lasci vuoto questo campo, l'host verrà utilizzato l'URL di destinazione e l'URI di reindirizzamento verrà assemblato in modo dinamico.
Questo valore può essere utilizzato quando si desidera una sessione SSO di autenticazione utente a un livello superiore a livello di dominio. Ad esempio, per attivare l'SSO tra profile.example.com/ e admin.example.com/, questo valore può essere impostato su example.com. Verrà stabilita una sessione di autenticazione dell'utente su example.com che verrà condivisa tra tutti i sottodomini. Nota: se dallo stesso mesh vengono gestiti più domini, example1.com ed example2.com, la funzione non può essere utilizzata ed è è consigliabile lasciare vuoto il campo.
authentication.oidc.redirectURIPath Il percorso dell'endpoint in cui authservice terminerà il flusso OAuth. Devi registrare questo percorso URI più l'host come URI di reindirizzamento autorizzato nel server di autorizzazione per authentication.oidc.clientID.
Inoltre, questo URI deve essere pubblicato dallo stesso servizio mesh e dall'ingress in cui è abilitato authservice.
authentication.oidc.scopes L'ambito OAuth che deve essere richiesto nella richiesta di autenticazione. Elenco separato da virgole di identificatori utilizzati per specificare l'accesso oltre a "openid" ambito, ad esempio "groups,allatclaim".
authentication.oidc.groupsClaim Se idtoken contiene un'attestazione di gruppi, utilizza questo campo per indicare il nome. Se specificato, il servizio trasmetterà i dati in questo nell'attestazione groups nell'RCToken di output. Questa rivendicazione deve contenere un elenco di stringhe separate da virgole, ad es. ["group1", "group2"].
authentication.oidc.attributeMapping Contiene una o più mappature dei claim da idtoken seguite da espressioni CEL. A tutti i claim deve essere fatto riferimento tramite assertion.X, mentre assertion fa riferimento all'IDToken originale, ad esempio aud_copy: assertion.aud.
authentication.outputJWTAudience Il pubblico dell'RCToken generato da authservice. I sidecar possono convalidare l'RCToken in entrata in base a questo valore del segmento di pubblico.

Risoluzione dei problemi

  1. Accessibilità di rete all'IDP.

    Possibile log: error: TLS handshake failed..

    Verifica eseguendo curl dal contenitore istio-proxy all'URI dell'emittente dell'IDP. Se non riesce a connettersi, l'utente può controllare le regole del firewall o altre configurazioni di rete per il cluster.

  2. Certificato CA radice.

    Log possibile: error: The server's TLS certificate did not match expectations. o error: TLS handshake failed..

    Assicurati che certificateAuthorityData contenga il certificato CA radice corretto. In assenza di un proxy HTTPS che termina il traffico HTTPS, questo dovrebbe contenere il percorso radice Certificato CA per l'IdP. Se ce n'è uno, dovrebbe contenere invece quello del proxy.

  3. Configurazione del percorso di reindirizzamento.

    Possibile osservazione: ricezione di una pagina di errore 404 durante il flusso di autenticazione OIDC.

    L'autenticazione utente restituisce l'intestazione "Set-Cookie" senza utilizzare l'attributo path, per impostazione predefinita il browser utilizza la directory dell'URL della richiesta come percorso del cookie (ambito del cookie relativo al percorso). Quindi consigliamo di non includi "/" nel percorso di reindirizzamento, a meno che non sia intenzionale.

  4. Il file collaterale non è in grado di recuperare jwksUri.

    In alcuni scenari, una correlato la limitazione potrebbe causare il mancato recupero di jwksUri. Se lo spazio dei nomi è non presente utilizzando un carattere jolly (ad esempio, ./* o istio-system/*), quindi questa operazione non funzionerà. Devi aggiungere manualmente il relativo spazio dei nomi nel sidecar di uscita.

Domande frequenti

  1. Come faccio a eseguire l'upgrade di Cloud Service Mesh con l'autenticazione utente abilitata?

    Segui le Upgrade di Cloud Service Mesh e specificare il file dell'overlay aggiungendo --custom_overlay user-auth-overlay.yaml sulla riga di comando per asmcli install.

  2. Quante risorse dobbiamo eseguire il provisioning per authservice? E quante richieste al secondo può gestire?

    Per impostazione predefinita, authservice è configurato con 2,0 vCPU e 256 Mi di memoria. Con questa configurazione, authservice è in grado di gestire 500 richieste al secondo. Per gestire un maggior numero di richieste, devi eseguire il provisioning di più CPU, in proporzione alla capacità di gestione delle richieste. Puoi anche configurare più repliche di authservice per aumentare la scalabilità orizzontale.