Wir planen, unser Unternehmenssystem in ein auf Mikroservices basierendes System umzugestalten. Diese Mikrodienste werden von unseren firmeninternen Anwendungen und bei Bedarf von Drittanbietern genutzt. Eins für Buchung, eins für Produkte etc.
Wir sind uns nicht sicher, wie wir mit Rollen und Bereichen umgehen sollen. Die Idee ist, drei grundlegende Benutzerrollen wie Admins, Agents und Endbenutzer zu erstellen und den Consumer-Apps bei Bedarf die Feinabstimmung der Bereiche zu ermöglichen.
- Administratoren können standardmäßig alle Ressourcen (für ihr Unternehmen) erstellen, aktualisieren, lesen und löschen.
- Agenten können Daten für ihr Unternehmen erstellen, aktualisieren und lesen.
- Endbenutzer können Daten erstellen, aktualisieren, löschen und lesen, jedoch nicht auf dieselben Endpunkte wie Agenten oder Administratoren zugreifen. Sie können auch Daten erstellen oder ändern, nur nicht auf derselben Ebene wie Agenten oder Administratoren. Beispielsweise können Endbenutzer ihre Kontoinformationen aktualisieren oder lesen, genauso wie der Agent dies für sie tun kann, sie können jedoch keine Administratornotizen anzeigen oder aktualisieren.
Angenommen, Agenten können standardmäßig jede Ressource für ihr Unternehmen erstellen, lesen und aktualisieren. Dies ist der maximale Bereich, der für ihr Token / ihre Sitzung angefordert werden kann. Entwickler von Clientanwendungen (API-Consumer-Anwendungen) haben jedoch entschieden, dass einer ihrer Agenten dies kann Lesen und erstellen Sie nur bestimmte Ressourcen.
Ist es eine bessere Praxis, dies in unserer internen Sicherheit zu behandeln und diese Daten in unsere Datenbank schreiben zu lassen, oder lassen Sie die Clients dies intern tun, indem Sie ein Token mit geringerem Umfang anfordern, und schreiben, welcher Agent welchen Umfang in ihrer Datenbank hat ? Auf diese Weise müssten wir nur Token-Bereiche verfolgen.
Der Nachteil dabei ist, dass unser Team auch in unseren internen Anwendungen genau abgestimmte Zugriffsmechanismen erstellen muss.
Mit dieser Denkweise sollten Mikrodienste und ihr Autorisierungssystem nicht mit den Kundenbedürfnissen belastet werden, da sie nur Verbraucher sind und nicht Teil des Systems (auch wenn einige dieser Verbraucher unsere eigenen internen Apps sind).
Ist diese Delegation ein guter Ansatz?
payment:[read]
, hat Verkäuferpayment: [create]
. Sammeln Sie in diesem Fall Berechtigungen?(resource/action)
, müssen Sie diese zusammenführen. Wenn sich die Berechtigungen überschneiden, müssen Sie sie aggregieren. Die Idee besteht darin, nur die Ressourcen und Aktionen zu definieren, die im Token zulässig sind, und die Rollen als Abstraktion zu belassen, die den Kunden eine weniger komplizierte Möglichkeit zum Umgang mit Berechtigungen bietet.user
Eigenschaft in seiner Nutzlast. Die Art und Weise, wie ich eine Ressource sperre, die einem Benutzer gehört, besteht darin, denuser
Anspruch der URL zuzuordnen. Zum Beispiel:/users/coyote/back-account
wäre nur mit einem Token mituser
Anspruch gleich zugänglichcoyote
. Ich hoffe das hilft.Ich denke, egal was passiert, Sie möchten, dass Ihre Dienste ein Authentifizierungstoken akzeptieren, das von einem Authentifizierungsdienst bereitgestellt wird, den Sie schreiben, um Benutzer zu validieren. Dies ist der einfachste und sicherste Weg, um einen Missbrauch Ihrer Microservices zu verhindern. Wenn Sie möchten, dass ein Kunde eine gute Erfahrung macht, sollten Sie die kritischen Funktionen im Allgemeinen selbst implementieren und gründlich testen, um sicherzustellen, dass die von Ihnen angebotenen Funktionen gut implementiert sind.
Da alle Anrufer Ihre Microservices nachweisen müssen, dass sie authentifiziert wurden, können Sie auch Berechtigungen an diese Authentifizierung binden. Wenn Sie die Möglichkeit bieten, einen Benutzer an eine beliebige Zugriffsgruppe zu binden (oder Gruppen, wenn Sie Lust haben, Berechtigungen hinzuzufügen oder zu subtrahieren, ist hier schwieriger), werden von Ihren Kunden weniger Fragen dazu gestellt, warum der Benutzer berechtigt ist x konnte eine unerwünschte Operation ausführen. In jedem Fall muss jemand die Zugriffsliste für jeden Dienst überprüfen, also können Sie es auch sein. Es ist etwas, das am Anfang aller Dienste sehr leicht codiert werden würde (
if ( !TokenAuthorized(this.ServiceName, this.token) { Raise error }
) Dass Sie es genauso gut tun und die Benutzergruppen selbst im Auge behalten können. Es ist richtig, dass Sie über einen Berechtigungsgruppen-Manager verfügen und ihn in die Benutzerverwaltungs-Benutzeroberfläche einbinden müssen (vorhandene verwenden / neue Gruppe für Benutzerberechtigungen erstellen). Listen Sie beim Bearbeiten der Definition unbedingt die Benutzer auf, die an eine Gruppe gebunden sind, um Verwirrung zu vermeiden . Aber es ist kein harter Job. Halten Sie einfach Metadaten für alle Services bereit und verknüpfen Sie das Nachschlagen der Zuordnung zwischen Gruppe und Service mit der Authentifizierungstoken-Verarbeitung.Okay, es gibt einige Details, aber jeder Ihrer Clients, der diese Funktionalität wünscht, müsste dies auf jeden Fall codieren. Wenn Sie die dreistufigen Benutzerberechtigungen unterstützen, können Sie sie auch einfach so erweitern, dass sie pro Benutzerzugriff verfügbar sind Gruppen. Wahrscheinlich ist eine logische Schnittstelle zwischen Basisgruppenberechtigungen und benutzerspezifischen Berechtigungen die richtige Zusammenfassung. Wenn Sie jedoch Basisberechtigungen für Administrator-, Agenten- und Endbenutzerbasisberechtigungen hinzufügen und entfernen möchten, müssen Sie dies tun Das Tristate-Flag für die Verwendung in den Berechtigungsgruppen: "Berechtigung hinzufügen", "Berechtigung verweigern", "Standardberechtigung" und "Berechtigungen entsprechend kombinieren".
(Hinweis: Dies sollte alles über SSL oder sogar über bidirektionales SSL geschehen, wenn Sie sich Sorgen über die Sicherheit beider Gesprächsenden machen. Wenn Sie diese Token an einen Angreifer "lecken", ist er in der Situation, als ob er d hat ein Passwort geknackt.)
quelle
Meiner Ansicht nach haben Sie hier zwei Möglichkeiten.
Wenn Sie nur konfigurierbaren Zugriff auf im Wesentlichen dieselbe Anwendung benötigen, lassen Sie die Dienste die Berechtigungen überprüfen und geben Sie Ihren Kunden eine Schnittstelle, über die sie die Berechtigungen für jede Rolle ändern können. Auf diese Weise können die meisten Benutzer die Standardrollenkonfiguration verwenden, mit der die Kunden die Rollen optimieren oder neue Rollen erstellen können, die ihren Anforderungen entsprechen.
Wenn Ihre Kunden ihre eigenen Anwendungen entwickeln, sollten sie ihre eigenen Zwischen-APIs einführen. Dieser stellt eine Verbindung zu Ihrem Administrator her, überprüft die eingehende Anforderung jedoch anhand der eigenen benutzerdefinierten Authentifizierungsanforderungen, bevor er Ihre Dienste aufruft
quelle
Sicherheitsüberlegung
Wenn ich Ihr Design gut verstehe, beabsichtigen Sie, einige Mechanismen zur Ressourcenzugriffskontrolle an den Client zu delegieren, dh eine aufwendige App reduziert die Elemente, die ein Benutzer sehen kann. Ihre Annahme ist:
Ich sehe hier zwei ernsthafte Probleme für ernsthafte Geschäfte:
Aus diesem Grund empfehle ich, solche Ereignisse zu antizipieren und Autorisierungsanfragen zu bearbeiten. Sie befinden sich in einer frühen Phase des Reengineerings und es wird viel einfacher sein, diese in Ihrer Architektur zu berücksichtigen (auch wenn Sie nicht alle implementieren) als später.
Wenn Sie Ihre derzeitige Position weiter verfolgen, wenden Sie sich mindestens an Ihren Informationssicherheitsbeauftragten.
Wie setzt man das um?
Sie haben den Trick:
Ok, Sie beabsichtigen, einige allgemeine Token zu verwenden, die vom Client ausgewählt wurden. Wieder eine Schwäche in meinem Auge, weil einige Kunden außerhalb Ihrer Kontrolle sein können.
Ich weiß nicht, ob Sie JWT bereits verwenden oder ob Sie andere Techniken anwenden. Wenn Sie jedoch JWT verwenden, verfügen Sie möglicherweise über ein Identitätstoken, das die Identität des Benutzers enthält (und sogar über ein zweites Token, mit dem die Ursprungs-App sicher identifiziert wird, sodass Sie das Vertrauensniveau zwischen Inhouse-Clients und externen Clients unterscheiden können ).
Wenn Sie sich für eine Microservice-Architektur entscheiden, möchte ich vorschlagen, den Unterschied zwischen dem Benutzerverwaltungs- und Authentifizierungsprozess (der als dedizierter Dienst ausgeführt werden sollte) und der Zugriffskontrolle (die für jeden Microservice spezifisch ist und sollte) zu verdeutlichen von jedem von ihnen vor Ort gehandhabt werden). Natürlich sollte ein Admin-Client einen umfassenden Überblick über mehrere Dienste geben, um die Verwendung zu vereinfachen.
quelle
Hier gibt es auch eine kurze Antwort. Sie sollten alle Kernfunktionen, die Sie Ihren "Kunden" anbieten möchten, selbst implementieren . Es scheint problematisch zu sein, dass Clients ein so grundlegendes Verhalten wie Benutzerberechtigungen selbst hinzufügen, da Sie bereits eine Benutzerauthentifizierung durchführen. Wenn Sie es dem Client überlassen, es zu implementieren, werden möglicherweise mehrere Implementierungen desselben Berechtigungscodes "unterstützt". Auch wenn Sie es nicht "besitzen", wird es Fehler im Code geben, und Sie möchten, dass Ihre Clients die Funktionalität haben, die sie erwartet hatten, und dass Sie die Lösung der Probleme unterstützen, die ein Client hat. Es macht keinen Spaß, mehrere Codebasen zu unterstützen.
quelle