Applicazioni multicloud con Istio

Utilizzando l'App Identity and Access Adapter, è possibile centralizzare tutta la gestione delle identità in un unico luogo.

L'App Identity and Access Adapter non è attualmente supportato.

Poiché le aziende utilizzano i cloud da più fornitori o una combinazione di soluzioni on-premises e off-premises, dei modelli di distribuzione eterogenei possono aiutarti a preservare l'infrastruttura esistente ed evitare condizioni di dipendenza da uno specifico fornitore (vendor lock-in). L'adattatore può essere configurato per funzionare con qualsiasi provider di identità conforme a OIDC, come App ID. Il servizio consente all'adattatore di controllare le politiche di autenticazione e di autorizzazione in tutti gli ambienti, incluse le applicazioni di frontend e backend. Inoltre, esegue tutto ciò senza alcuna modifica al tuo codice o che occorra ridistribuire la tua applicazione.

Architettura multicloud

Un ambiente di elaborazione multicloud combina più ambienti di elaborazione cloud e/o privati in un'unica architettura di rete. Distribuendo i carichi di lavoro su più ambienti, è possibile migliorare la resilienza, la flessibilità e l'efficienza economica. Per ottenere i vantaggi, è prassi comune utilizzare applicazioni basate sui contenitori con un livello di orchestrazione, come ad esempio Kubernetes.

Diagramma dell'architettura dell'App Identity and Access Adapter*Distribuzione
- ottenuta con l'App Identity and Access

Descrizione di Istio e dell'adattatore

Istio è una rete di servizi open source che si dispone in modo trasparente sulle applicazioni distribuite esistenti che possono integrarsi con Kubernetes. Per ridurre la complessità delle implementazioni, Istio fornisce approfondimenti comportamentali e controllo operativo sull'intera rete di servizi. Quando App ID viene combinato con Istio, diventa una soluzione di identità integrata e scalabile per architetture multicloud che non richiede modifiche del codice applicativo personalizzate. Per ulteriori informazioni, consultare il sito Istio.

Istio utilizza un sidecar proxy Envoy per mediare tutto il traffico in entrata e in uscita per tutti i servizi nella rete di servizi. Utilizzando il proxy, Istio estrae le informazioni sul traffico (la cosiddetta telemetria) che vengono inviate al componente Istio chiamato Mixer per implementare le decisioni delle politiche. L'adattatore Identità and Access estende la funzionalità Mixer analizzando la telemetria (attributi) rispetto alle politiche personalizzate per controllare la gestione di identità e accesso all'interno e nell'ambito della rete di servizi. Le politiche di gestione dell'accesso sono collegate a specifici servizi Kubernetes e possono essere regolate con precisione a specifici endpoint del servizio. Per ulteriori informazioni sui criteri e sulla telemetria, consultare il sito Istio documentazione.

A causa di una limitazione di Istio, l'adattatore App Identity and Access attualmente archivia le informazioni sulla sessione utente internamente e non rende persistenti le informazioni nelle repliche o sulle configurazioni di failover. Quando utilizzi l'adattatore, limita i tuoi carichi di lavoro a una singola replica finché la limitazione non verrà risolta.

Protezione delle applicazioni front-end

Se si utilizza un'applicazione basata su browser, è possibile utilizzare il flusso Open ID Connect(OIDC) / OAuth 2.0 authorization_grant per autenticare gli utenti. Quando viene rilevato, un utente non autenticato viene reindirizzato automaticamente alla pagina di autenticazione. Quando l'autenticazione viene completata, il browser viene reindirizzato ad un endpoint /oidc/callback implicito dove l'adattatore intercetta la richiesta. A questo punto, l'adattatore ottiene i token dal provider di identità e quindi reindirizza l'utente al suo URL richiesto in origine.

Per visualizzare le informazioni sulla sessione utente, inclusi i token di sessione, puoi consultare l'intestazione Authorization.

Authorization: Bearer <accessToken> <IDToken>

Puoi anche disconnettere gli utenti autenticati. Quando un utente autenticato accede a qualsiasi endpoint protetto con oidc/logout accodato come mostrato nel seguente esempio, viene disconnesso.

https://myhost/path/oidc/logout

Se necessario, può essere utilizzato un token di aggiornamento per automatizzare l'acquisizione di nuovi token di accesso e identità senza che il tuo utente debba rieseguire l'autenticazione. Se il provider di identità configurato restituisce un token di aggiornamento, viene reso persistente nella sessione e utilizzato per richiamare i nuovi token quando il token di identità scade.

Protezione delle applicazioni di backend

L'adattatore può essere utilizzato in collaborazione con OAuth 2.0 Flusso del portatore JWT per proteggere le API dei servizi convalidando i token JWT Bearer. Il flusso di autorizzazione di autenticazione prevede che una richiesta contenga un'intestazione di autorizzazione con un token di accesso valido e un token di identità facoltativo. La struttura di intestazione prevista è Authorization=Bearer {access_token} [{id_token}]. Ai client non autenticati viene restituito uno stato della risposta HTTP 401 con un elenco degli ambiti necessari per ottenere l'autorizzazione. Se i token non sono validi o sono scaduti, la strategia API restituisce una risposta HTTP 401 con un componente di errore facoltativo che indica Www-Authenticate=Bearer scope="{scope}" error="{error}".

Per ulteriori informazioni sui token e sul modo in cui vengono utilizzati, vedi descrizione dei token.

Prima di iniziare

Prima di iniziare, assicuratevi di aver installato i seguenti prerequisiti.

Installazione dell'adattatore

Per installare il grafico, inizializza Helm nel tuo cluster, definisci le opzioni che vuoi utilizzare ed esegui quindi il comando di installazione.

  1. Se stai lavorando con IBM Cloud Kubernetes Service, assicurati di eseguire l'accesso e di impostare il contesto per il tuo cluster.

  2. Verificare che sia stata attivata l'applicazione dei criteri di Istio. In caso contrario, attivala.

  3. Aggiungi il repository.

    helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter
    
  4. Installa il grafico.

    helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapter
    

    Puoi specificare una tag di immagine durante l'installazione impostando l'indicatore image.tag . Ad esempio, --set image.tag=0.5.0. Puoi anche installare il grafico localmente. Per farlo, clona il repository eseguendo git clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.git prima di eseguire il comando di installazione.

Applicazione di una politica di autorizzazione e di autenticazione

Una politica di autenticazione o di autorizzazione è una serie di condizioni che deve essere soddisfatta prima che una richiesta possa accedere a una risorsa. Definendo la configurazione del servizio di un identity provider e una politica che delinea quando un particolare flusso deve essere utilizzato, è possibile controllare l'accesso a qualsiasi risorsa nella rete di servizi. Per vedere esempi di CRD, consultare la directory dei campioni.

Per creare una politica:

  1. Definisci una configurazione.
  2. Registra l'endpoint.

Definizione di una configurazione

A seconda del fatto che tu stia proteggendo applicazioni front-end o backend, crea una configurazione della politica con una delle seguenti opzioni.

  • Per le applicazioni front-end: le applicazioni basate sul browser che richiedono l'autenticazione utente possono essere configurate per utilizzare il flusso di autenticazione OIDC / OAuth 2.0. Per definire una CRD OidcConfig che contiene il client utilizzato per facilitare il flusso di autenticazione con il provider di identità, utilizza il seguente esempio come una guida.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: OidcConfig
    metadata:
       name:      oidc-provider-config
       namespace: sample-namespace
    spec:
       discoveryUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/.well-known/openid-configuration
       clientId:     <clientID>
       clientSecret: <randomlyGeneratedClientSecret>
       clientSecretRef:
             name: <nameOfKubeSecret>
             key: <keyInKubeSecret>
    
    I componenti del file di configurazione YAML spiegati
    Campo Immettere Obbligatorio Descrizione
    discoveryUrl stringa Un endpoint ben noto che fornisce un documento JSON di informazioni sulla configurazione di OIDC/OAuth 2.0.
    clientId stringa Un identificativo per il client che viene utilizzato per l'autenticazione.
    clientSecret stringa *No Un segreto in testo semplice che viene utilizzato per autenticare il client. Se non viene fornito, deve esistere un clientSecretRef.
    clientSecretRef oggetto No Un segreto di riferimento che viene utilizzato per autenticare il client. Il riferimento può essere utilizzato al posto di clientSecret.
    clientSecretRef.name stringa Il nome del segreto Kubernetes che contiene il clientSecret.
    clientSecretRef.key stringa Il campo all'interno di Kubernetes Secret che contiene l'indirizzo clientSecret.
  • Per le applicazioni di backend: La specifica OAuth 2.0 Bearer token definisce un modello per proteggere le API utilizzando i JSON Web Token(JWT). Utilizzando la seguente configurazione come esempio, definisci una CRD JwtConfig che contiene la risorsa chiave pubblica, che viene utilizzata per convalidare le firme dei token.

    apiVersion: "security.cloud.ibm.com/v1"
    kind: JwtConfig
    metadata:
       name:      jwt-config
       namespace: sample-app
    spec:
       jwksUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/publickeys
    

Registrazione degli endpoint dell'applicazione

Registra gli endpoint dell'applicazione all'interno di una CRD Policy per convalidare le richieste in entrata e implementare le regole di autenticazione. Ogni Policy si applica esclusivamente allo spazio dei nomi Kubernetes in cui risiede l'oggetto e può specificare i servizi, i percorsi e i metodi che vuoi proteggere.

apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
  name:      samplepolicy
  namespace: sample-app
spec:
  targets:
    -
      serviceName: <svcSampleApp>
      paths:
        - exact: /web/home
          method: ALL
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              rules:
                - claim: scope
                  match: ALL
                  source: access_token
                  values:
                    - appid_default
                    - openid
                - claim: amr
                  match: ANY
                  source: id_token
                  values:
                    - cloud_directory
                    - google

        - exact: /web/user
          method: GET
          policies:
            - policyType: oidc
              config: <oidcProviderConfig>
              redirectUri: https://github.com/ibm-cloud-security/app-identity-and-access-Adapter
        - prefix: /
          method: ALL
          policies:
            -
              policyType: jwt
              config: <jwtConfig>
Comprendere i componenti dell'oggetto servizio
Oggetto servizio Immettere Obbligatorio Descrizione
serviceName string Il nome del servizio Kubernetes nello spazio dei nomi Policy che vuoi proteggere.
paths array[Path Object] Un elenco di oggetti percorso che definiscono gli endpoint che vuoi proteggere. Se non viene specificato, tutti i percorsi sono protetti.
Comprendere i componenti dell'oggetto percorso
Oggetto percorso Immettere Obbligatorio Descrizione
exact or prefix string Il percorso su cui vuoi applicare le politiche. Le opzioni includono exact e prefix. exact corrisponde esattamente agli endpoint forniti con l'ultimo / ritagliato. prefix corrisponde agli endpoint che iniziano con il prefisso di instradamento che fornisci.
method enum No Il metodo HTTP protetto. Opzioni valide ALL, GET, PUT, POST, DELETE, PATCH - Il valore predefinito è ALL:
policies array[Policy] No Le politiche OIDC/JWT che vuoi applicare.
Comprensione dei componenti dell'oggetto della policy
Oggetto politica Immettere Obbligatorio Descrizione
policyType enum Il tipo di politica OIDC. Le opzioni includono: jwt o oidc.
config string Il nome della configurazione provider che vuoi utilizzare.
redirectUri string No L'URL a cui vuoi che venga reindirizzato l'utente dopo un'autenticazione eseguita correttamente: il valore predefinito è l'URL della richiesta originale.
rules array[Rule] No La serie di regole che vuoi utilizzare per la convalida del token.
Comprensione dei componenti dell'oggetto della policy
Oggetto regola Immettere Obbligatorio Descrizione
claim string L'attestazione che vuoi convalidare.
match enum No I criteri richiesti per la convalida dell'attestazione. Le opzioni includono: ALL, ANY o NOT. Il valore predefinito è impostato su ALL.
source enum No Il token dove vuoi applicare la regola. Le opzioni includono: access_token o id_token. Il valore predefinito è impostato su access_token.
values array[string] La serie richiesta di valori per la convalida.

Eliminazione dell'adattatore

Per rimuovere l'adattatore e tutti i CRD associati, è necessario eliminare la tabella Helm e le chiavi di firma e di crittografia associate.

helm delete --purge appidentityandaccessAdapter
kubectl delete secret appidentityandaccessAdapter-keys -n istio-system

Configurazione della registrazione nei log

Per impostazione predefinita, i log sono in formato JSON e hanno un livello di visibilità info per provvedere a facilitare l'integrazione con i sistemi di registrazione esterni. Per aggiornare la configurazione della registrazione, puoi utilizzare il grafico Helm. I livelli di registrazione supportati includono l'intervallo [-1, 7] come mostrato in Zap core. Per ulteriori informazioni sui livelli, consultare il sito Documentazione del nucleo di Zap.

Adattatore

Per visualizzare i log dell'adattatore, puoi utilizzare kubectl oppure accedere al pod appidentityandaccessAdapter dalla console Kubernetes.

alias Adapter_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=appidentityandaccessAdapter -o jsonpath='{.items[0].metadata.name}')"
Adapter_logs | jq

Mixer

Se l'adattatore non sembra ricevere richieste, controllate i log del Mixer per assicurarvi che si sia connesso correttamente all'adattatore.

alias mixer_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=telemetry -o jsonpath='{.items[0].metadata.name}') -c mixer"
mixer_logs | jq