2016-07-22 6 views
2

Ich habe eine multiple Microservices-Architektur, in der ich Sicherheit anwenden möchte.

Mein Blick auf die Sicherheit Design: Die Authentifizierung mit einem LDAP passieren wird und wenn der Benutzer ein JSON Web Token (JWT) authentifiziert wird, wird einen „geheimen Schlüssel“ und das Token die Rollen mußten erhalten erzeugt mit, Verfallszeit usw. Bei jedem Aufruf an einen Microservice wird dieser Token zur Autorisierung im Header übergeben. Aus meiner Sicht habe ich nur einen einzigen Authentifizierungsserver, der den Benutzer authentifiziert und das JWT generiert.SpringCloud Microservices JSON Web Token (JWT) Sicherheit

Mein Zweifel:
Wenn nun ein Micro einen Anruf (mit der JWT in Header) erhalten wird es trifft immer den Auth-Server das Token überprüft werden?
Wenn ja, wird es nicht zu mehreren Aufrufen an den Auth-Server führen und somit eine schlechte Praxis?
Wenn nein, wie überprüft der Client das Token und was ist der Umfang des Authentifizierungsservers?

Antwort

2

JWTs sind immer signiert, so dass Sie ein bestimmtes Token verifizieren können, ohne eine zentrale Authentifizierungsinstanz anrufen zu müssen. Der Authentifizierungsserver kennt das Geheimnis, um das Token zu signieren, und alle Dienste, die das Token validieren möchten, müssen ebenfalls eine Möglichkeit haben, dies zu überprüfen.

Es gibt zwei verschiedene Ansätze zur Unterzeichnung:

  • Symmetrisch: Ein geheimer Wert vor Hashing die Nutzlast angehängt wird. Der konsumierende Dienst muss dieses Geheimnis auch kennen und kann dies überprüfen, indem er das Geheimnis an die empfangene Nutzlast anhängt und den resultierenden Hash mit dem übertragenen Hash überprüft.
  • asymmetrisch: Durch die Verwendung einiger PKI-Signaturen/Verifizierungen ist es möglich, dass nur der Authentifizierungsserver über den privaten Schlüssel verfügt, um das Token zu signieren. Alle konsumierenden Dienste brauchen dann nur den öffentlichen Teil zu verifizieren.

Ich bevorzuge den zweiten Weg, weil es die Wahrscheinlichkeit reduziert, dass ein Schlüssel gestohlen wird. Wenn einer der konsumierenden Dienste entführt wird, wird kein Geheimnis verloren, so dass der Angreifer gültige Token erzeugen kann. Die Verwendung eines solchen Algorithmus könnte möglicherweise mehr Zeit/CPU-Zyklen zum Validieren erfordern als ein einfacher Hash, der auf symmetrische Weise verwendet wird.

Bitte beachten Sie die offizielle JWT Seite ein Beispiel für die verschiedenen Mechanismen: https://jwt.io/

+0

Danke, diese Antworten die meisten davon. Wenn wir also einen öffentlichen Schlüssel haben, der allen Microservices gemein ist, was ist der beste Weg, den öffentlichen Schlüssel zu verteilen? über einen DB oder über den Config Server bei Microservices? –

+0

Wenn Sie bereits einen laufenden Konfigurationsserver haben und die PKI-Version verwenden, gibt es keine Probleme, den öffentlichen Schlüssel auf diese Weise zu verteilen. Bitte beachten Sie, dass diese Kommunikation sicher sein muss. Ein anderer Ansatz besteht darin, den Schlüssel von einer zentralisierten Schlüsselregistrierung abzurufen. Es gibt eine spezielle Eigenschaft 'kid', die den Namen auflistet. Weitere Details finden Sie im Anhang zu jws: https://tools.ietf.org/html/rfc7515#appendix-D –