I microservizi dovrebbero essere utenti?

13

Stiamo cercando di determinare il modo migliore per autorizzare gli utenti in un'architettura di microservizio, garantendo al contempo che i microservizi abbiano autorizzazioni limitate. La nostra architettura utilizza un servizio di autorizzazione centrale per gestire l'emissione di token JWT.

Abbiamo i seguenti requisiti:

  1. Gli utenti dovrebbero essere limitati a svolgere determinati ruoli. per esempio. un utente dovrebbe essere in grado di creare / modificare / leggere il contenuto che possiede.

  2. I microservizi dovrebbero essere limitati solo alle autorizzazioni che richiedono. per esempio. un microservizio che deve solo leggere i dati da un altro servizio dovrebbe essere esplicitamente vietato dalla scrittura di dati su quel servizio.

Ad esempio, supponiamo di disporre di un sistema in cui gli utenti possono caricare immagini su un servizio di archivio di immagini. Abbiamo un servizio di tagging che tagga automaticamente le immagini con una posizione. Gli utenti possono solo CRUD le proprie immagini. Il servizio di tagging può leggere qualsiasi immagine dal servizio di archiviazione di immagini, tuttavia non dovrebbe essere in grado di modificare / eliminare.

Quale è un buon modo per ottenere quanto sopra usando i token JWT? Alcune soluzioni che abbiamo discusso sono:

  1. Il servizio di archiviazione di immagini espone 2 API, una disponibile esternamente (che consente l'accesso utente a CRUD) e una disponibile internamente (che fornisce l'accesso di sola lettura interno). Sembra inflessibile - cosa succede se un altro servizio interno necessita dell'accesso in lettura / scrittura a tutte le immagini (ad esempio, quello che cancella automaticamente le immagini esplicite)?

  2. Abbiamo impostato due permessi nel JWT dell'utente, uno dei quali è CRUD_OwnImages, l'altro è READ_ForAnalysis. Il servizio di tagging può vedere se l'utente ha le autorizzazioni READ_ForAnalysis e, in tal caso, effettuare la richiesta appropriata. Abbiamo un altro microservizio che controlla se l'utente ha CRUD_OwnImages per le operazioni CRUD sulle immagini dell'utente. Ciò pone la responsabilità su ciascun microservizio per garantire che l'utente sia limitato alle azioni che richiede. L'archivio immagini non ha modo di restringere ogni microservizio con questo approccio, quindi è potenzialmente flakey e soggetto ad errori.

  3. Diamo al tagging microservice il proprio utente, con READ_ForAnalysis come permesso. Quindi, quando il servizio di tagging richiede immagini dall'archivio immagini, gli viene concesso l'accesso a quelle, ma è vietato modificarle. L'utente dell'utente ha solo l'autorizzazione CRUD_OwnImages, quindi è in grado di recuperare e ottenere accesso solo alle sue immagini dal frontend. Se un altro servizio ha bisogno di CRUD per tutti i dati, possiamo dargli CRUD_AllData o simili. Ci piace questo approccio poiché ogni servizio è ora responsabile dei propri dati (piuttosto che la logica viene duplicata su più servizi), ma cosa succede se il servizio richiede sia permessi utente che autorizzazioni microservice? Possiamo inviare due token JWT (sia dell'utente che del microservizio) in modo sicuro? C'è un modo per combinare le autorizzazioni in modo sicuro e inviarlo tramite? per esempio. il servizio di tagging può leggere tutte le immagini ma può anche scrivere le immagini dell'utente con la posizione?

Il problema è aggravato se le informazioni dell'utente sono necessarie più a valle (2 o 3 microservizi di distanza). Riteniamo solo che spetti ai singoli microservizi limitarsi alle azioni di cui hanno bisogno e non renderlo esplicito?

    
posta awr 28.10.2017 - 11:35
fonte

1 risposta

6

In generale, quante più operazioni possibili dovrebbero essere legate a un vero utente umano. Costringe le persone ad autenticare correttamente, spinge verso un'unica strategia di autorizzazione coerente, ed è una parte importante del fornire una traccia di controllo coerente.

E in generale, hai tre tipi di scenari con microservizi:

1. L'utente arriva, carica una foto e deve essere taggato. Grande. Il servizio fotografico può semplicemente passare il JWT al servizio di tagging (o viceversa a seconda della direzione della dipendenza) e se l'utente non ha i diritti per eseguire la sotto operazione, si prende l'azione appropriata (magari caricare la foto senza tag , forse restituire l'errore, forse qualcos'altro).

2. L'utente arriva, carica una foto e deve essere taggato ... ma non ora. Cool. Adesso gestisci la foto normalmente. Successivamente, quando si verifica la codifica (gestione di eventi / messaggi, elaborazione di comandi di stile CQRS, elaborazione di processi periodici, qualunque) il servizio di tagging impersonerà l'utente (molto probabilmente utilizzando un segreto condiviso per richiedere un JWT personalizzato da auth) e quindi eseguirà la sotto-operazione per conto del richiedente originale (con tutte le sue autorizzazioni e limitazioni). Questo metodo presenta il solito problema con le operazioni asincrone in cui è difficile restituire gli errori all'utente se le cose non vanno a buon fine, ma se si utilizza questo modello per le operazioni cross-service, avresti già risolto.

3. Alcuni sottosistemi devono fare cose al di fuori del contesto di un utente. Forse hai qualche lavoro notturno per archiviare vecchie immagini. Forse i tuoi tag devono essere consolidati ... In questo caso, probabilmente vorrai che ognuno di questi attori abbia il proprio pseudo-utente con autorizzazioni limitate e un ID univoco per la traccia di controllo.

Quale usare varia a seconda del tuo scenario, delle tue esigenze e della tua tolleranza al rischio. E, naturalmente, questi sono solo un insieme incompleto di generalizzazioni a tratto ampio.

Ma in generale, i microservizi stessi non dovrebbero essere utenti se possibile.

    
risposta data 28.10.2017 - 19:13
fonte

Leggi altre domande sui tag