Strategia di autenticazione dei microservizi


138

Sto facendo fatica a scegliere una strategia di autenticazione decente / sicura per un'architettura a microservizi. L'unico post SO che ho trovato sull'argomento è questo: Single Sign-On in Microservice Architecture

La mia idea qui è quella di avere in ogni servizio (es. Autenticazione, messaggistica, notifica, profilo ecc.) Un riferimento univoco a ciascun utente (abbastanza logicamente quindi il suo user_id) e la possibilità di ottenere l'utente corrente idse ha effettuato l'accesso.

Dalle mie ricerche, vedo che ci sono due possibili strategie:

1. Architettura condivisa

Architettura condivisa

In questa strategia, l'app di autenticazione è un servizio tra l'altro. Ma ogni servizio deve essere in grado di rendere la conversione session_id=> user_idquindi deve essere semplice. Ecco perché ho pensato a Redis, che avrebbe archiviato la chiave: valore session_id:user_id.

2. Architettura del firewall

Architettura firewall

In questa strategia, l'archiviazione delle sessioni non ha molta importanza, poiché è gestita solo dall'app di autenticazione. Quindi user_idpuò essere inoltrato ad altri servizi. Ho pensato a Rails + Devise (+ Redis o mem-cache, o cookie storage, ecc.) Ma ci sono tonnellate di possibilità. L'unica cosa che conta è che Service X non dovrà mai autenticare l'utente.


Come si confrontano queste due soluzioni in termini di:

  • sicurezza
  • robustezza
  • scalabilità
  • facilità d'uso

O forse suggeriresti un'altra soluzione che non ho menzionato qui?

Mi piace di più la soluzione n. 1 ma non ho trovato molte implementazioni predefinite che mi garantirebbero il fatto che sto andando nella giusta direzione.

Spero che la mia domanda non venga chiusa. Non so davvero dove altro chiederlo.

Grazie in anticipo


1
Vorresti per favore fornire ulteriori dettagli su ciò che stai cercando di ottenere? Nel primo caso l'autenticazione avviene contro Redis o nei servizi stessi? Redis manca nel secondo diagramma, è intenzionale?
Plamen Petrov,

Ho aggiunto alcune informazioni. Per favore fatemi sapere che non è ancora chiaro. Grazie!
Augustin Riedinger,

Stai pensando all'idea di creare un microservizio che utilizza il protocollo OAuth e l'altro servizio utilizza il token creato?
Tiarê Balbi,

Sono curioso di questa soluzione, ma ancora non capisco come funzionerà in pratica. Sai dove ho potuto trovare alcune implementazioni standard di esso?
Augustin Riedinger,

@AugustinRiedinger, grazie per averlo segnalato. Sto anche rompendo la mia applicazione web monolitica in micro servizi facendo piccoli passi. Nel tuo caso, i Servizi 1-n sono apolidi o pieni di stato. Nel caso siano pieni di stato, hai pensato di gestire le sessioni in ciascuno di questi servizi. Grazie
Manchanda. P

Risposte:


61

Sulla base di quello che ho capito, un buon modo per risolverlo è usare il protocollo OAuth 2 (puoi trovare qualche informazione in più su http://oauth.net/2/ )

Quando l'utente accede all'applicazione riceverà un token e con questo token sarà in grado di inviare ad altri servizi per identificarli nella richiesta.

Modello OAuth 2

Esempio di design a microservizio incatenato Modello di architettura

risorse:


1
Grazie è abbastanza chiaro. Ho trovato questo ottimo articolo che decompone praticamente la stessa soluzione: dejanglozic.com/2014/10/07/…
Augustin Riedinger

16
La tua risposta è ottima, ma in che modo il token generato dall'API Gateway (dall'interno di esso o in un AuthMicroService) può essere gestito da un microservizio casuale, il cui scopo non è quello di autenticarsi, e probabilmente non ha una gestione diretta all'interno di il suo codice aziendale?
mfrachet,

Ad esempio puoi usare Netflix Zuul per inviare il token ricevuto nel gateway a tutti i servizi e loro conosceranno le informazioni dell'utente. docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…
Tiarê Balbi

Un'altra cosa bella dell'uso di OAuth2 tra i servizi è che puoi avere endpoint che distinguono tra azioni autenticate dal servizio e autenticate dall'utente.
cmp

2
OAuth si occupa principalmente di garantire a un sistema l'accesso ai dati di un utente conservati in un altro sistema. Questo per me sembra un buon caso per SAML.
Rob Grant,

8

Risposta breve: utilizzare l'autenticazione basata su token di tipo Oauth2.0, che può essere utilizzata in qualsiasi tipo di applicazione come un'app Web o un'app mobile. La sequenza dei passaggi necessari per un'applicazione Web sarebbe quindi

  1. autenticare con il provider di ID
  2. mantenere il token di accesso nei cookie
  3. accedere alle pagine in webapp
  4. chiama i servizi

Lo schema seguente mostra i componenti che sarebbero necessari. Tale architettura che separa il web e le API dei dati fornirà una buona scalabilità, resilienza e stabilità

inserisci qui la descrizione dell'immagine


AWS Lambda non diventa "freddo" e richiede tempo per avviarsi? Ciò renderebbe lento l'accesso, no?
Tsuz,

@tsuz, AWS ha ora introdotto la funzionalità di concorrenza in lambda dove è possibile prenotare la concorrenza. Con questo potresti risolvere il problema dell'avvio a freddo. docs.aws.amazon.com/lambda/latest/dg/…
Sandeep Nair

Mi sarebbe piaciuto vedere questa risposta anni prima, è incredibilmente semplice capire come l'architettura dei microservizi con autenticazione e autorizzazione possa essere orchestrata da microservizi indipendenti per dare accesso ad altri servizi
brayancastrop

@Sandeep, penso che ti riferisci alla concorrenza fornita e non riservata.
Anil Kumar

0

Il modello di gateway API deve essere utilizzato per implementarlo utilizzando OpenID Connect. L'utente verrà autenticato da IDP e otterrà il token JWT dal server di autorizzazione. Ora il sistema gateway API può memorizzare questo token nel database Redis e impostare il cookie sul browser. Il gateway API utilizzerà il cookie per convalidare la richiesta dell'utente e invierà il token ai microservizi.

API Gateway funge da punto di accesso unico per tutti i tipi di app client come l'app client java script pubblica, l'app Web tradizionale, l'app mobile nativa e le app client di terze parti nell'architettura Microservice.

Puoi trovare maggiori dettagli a riguardo su http://proficientblog.com/microservices-security/


-2

è possibile utilizzare idenitty server 4 per scopi di autenticazione e autorizzazione

devi usare Firewall Architecture quindi hai un maggiore controllo su sicurezza, robustezza, scalabilità e facilità d'uso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.