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.
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.
-
Un cluster Kubernetes a pagamento
-
Attualmente, IBM Cloud Kubernetes Service Managed Istio non supporta l'implementazione delle politiche. Per utilizzare l'adattatore, è necessario utilizzare il sito Istio installato manualmente.
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.
-
Se stai lavorando con IBM Cloud Kubernetes Service, assicurati di eseguire l'accesso e di impostare il contesto per il tuo cluster.
-
Verificare che sia stata attivata l'applicazione dei criteri di Istio. In caso contrario, attivala.
-
Aggiungi il repository.
helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter -
Installa il grafico.
helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapterPuoi 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 eseguendogit clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.gitprima 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:
- Definisci una configurazione.
- 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
OidcConfigche 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 discoveryUrlstringa Sì Un endpoint ben noto che fornisce un documento JSON di informazioni sulla configurazione di OIDC/OAuth 2.0. clientIdstringa Sì Un identificativo per il client che viene utilizzato per l'autenticazione. clientSecretstringa *No Un segreto in testo semplice che viene utilizzato per autenticare il client. Se non viene fornito, deve esistere un clientSecretRef.clientSecretRefoggetto No Un segreto di riferimento che viene utilizzato per autenticare il client. Il riferimento può essere utilizzato al posto di clientSecret.clientSecretRef.namestringa Sì Il nome del segreto Kubernetes che contiene il clientSecret.clientSecretRef.keystringa Sì 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
JwtConfigche 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>
| Oggetto servizio | Immettere | Obbligatorio | Descrizione |
|---|---|---|---|
serviceName |
string |
Sì | Il nome del servizio Kubernetes nello spazio dei nomi Policy che vuoi proteggere. |
paths |
array[Path Object] |
Sì | Un elenco di oggetti percorso che definiscono gli endpoint che vuoi proteggere. Se non viene specificato, tutti i percorsi sono protetti. |
| Oggetto percorso | Immettere | Obbligatorio | Descrizione |
|---|---|---|---|
exact or prefix |
string |
Sì | 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. |
| Oggetto politica | Immettere | Obbligatorio | Descrizione |
|---|---|---|---|
policyType |
enum |
Sì | Il tipo di politica OIDC. Le opzioni includono: jwt o oidc. |
config |
string |
Sì | 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. |
| Oggetto regola | Immettere | Obbligatorio | Descrizione |
|---|---|---|---|
claim |
string |
Sì | 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] |
Sì | 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