Stratégie d'authentification des microservices

138

J'ai du mal à choisir une stratégie d'authentification décente / sécurisée pour une architecture de microservices. Le seul article SO que j'ai trouvé sur le sujet est celui-ci: Single Sign-On dans Microservice Architecture

Mon idée ici est d'avoir dans chaque service (ex. Authentification, messagerie, notification, profil etc.) une référence unique à chaque utilisateur (assez logiquement alors le sien user_id) et la possibilité d'obtenir l'utilisateur actuel ids'il est connecté.

D'après mes recherches, je vois qu'il y a deux stratégies possibles:

1. Architecture partagée

Architecture partagée

Dans cette stratégie, l'application d'authentification est un service parmi d'autres. Mais chaque service doit être capable de faire la conversion session_id=> user_iddonc ça doit être très simple. C'est pourquoi j'ai pensé à Redis, qui stockerait la clé: valeur session_id:user_id.

2. Architecture du pare-feu

Architecture de pare-feu

Dans cette stratégie, le stockage de session n'a pas vraiment d'importance, car il n'est géré que par l'application d'authentification. Ensuite, le user_idpeut être transmis à d'autres services. J'ai pensé à Rails + Devise (+ Redis ou mem-cached, ou cookie storage, etc.) mais il y a des tonnes de possibilités. La seule chose qui compte, c'est que Service X n'aura jamais besoin d'authentifier l'utilisateur.


Comment ces deux solutions se comparent-elles en termes de:

  • Sécurité
  • robustesse
  • évolutivité
  • facilité d'utilisation

Ou peut-être suggéreriez-vous une autre solution que je n'ai pas mentionnée ici?

J'aime mieux la solution n ° 1, mais je n'ai pas trouvé beaucoup d'implémentation par défaut qui me garantirait le fait que je vais dans la bonne direction.

J'espère que ma question ne sera pas close. Je ne sais pas vraiment où le demander.

Merci d'avance

Augustin Riedinger
la source
1
Voudriez-vous s'il vous plaît fournir plus de détails sur ce que vous essayez d'accomplir? Dans le premier cas, l'authentification se produit-elle contre Redis, ou dans les services eux-mêmes? Redis est absent du deuxième diagramme, est-ce intentionnel?
Plamen Petrov
J'ai ajouté quelques informations. Veuillez me faire savoir que ce n'est toujours pas clair. Merci!
Augustin Riedinger
Avez-vous pensé à l'idée de créer un microservice qui utilise le protocole OAuth et le service de votre autre utilise le jeton créé?
Tiarê Balbi
Je suis curieux de connaître cette solution, mais je ne comprends toujours pas comment cela fonctionnera dans la pratique. Savez-vous où je pourrais trouver des implémentations standard de celui-ci?
Augustin Riedinger
@AugustinRiedinger, merci d'avoir mis ça en place. Je décompose également mon application Web monolithique en micro-services en faisant des petits pas. Dans votre cas, les Services 1-n sont-ils sans état ou sans état. Dans le cas où ils sont pleins d'état, avez-vous pensé à gérer les sessions dans chacun de ces services. Merci
Manchanda. P

Réponses:

61

D'après ce que je comprends, un bon moyen de le résoudre est d'utiliser le protocole OAuth 2 (vous pouvez trouver un peu plus d'informations à ce sujet sur http://oauth.net/2/ )

Lorsque votre utilisateur se connecte à votre application, il recevra un jeton et avec ce jeton, il pourra l'envoyer à d'autres services pour les identifier dans la demande.

Modèle OAuth 2

Exemple de conception de microservices chaînés Modèle d'architecture

Ressources:

Tiarê Balbi
la source
1
Merci c'est assez clair. J'ai trouvé ce très bon article décomposant à peu près la même solution: dejanglozic.com/2014/10/07/…
Augustin Riedinger
16
Votre réponse est excellente, mais comment le jeton généré à partir de la passerelle API (de l'intérieur de celle-ci ou dans un AuthMicroService) peut-il être géré par un microservice aléatoire, dont le but n'est pas de s'authentifier, et qui n'a probablement pas de gestion oauth à l'intérieur de son code commercial?
mfrachet
Par exemple, vous pouvez utiliser Netflix Zuul pour envoyer le jeton reçu dans la passerelle à tous les services et ils connaîtront les informations de l'utilisateur. docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…
Tiarê Balbi
Une autre bonne chose à propos de l'utilisation d'OAuth2 entre les services est que vous pouvez avoir des points de terminaison qui distinguent les actions authentifiées par le service et les actions authentifiées par l'utilisateur.
cmp
2
OAuth consiste davantage à accorder à un système l'accès aux données d'un utilisateur stockées dans un autre système. Cela me semble être un bon cas pour SAML.
Rob Grant
8

Réponse courte: utilisez l'authentification basée sur un jeton de type Oauth2.0, qui peut être utilisée dans tout type d'application comme une application Web ou une application mobile. La séquence des étapes impliquées pour une application Web serait alors de

  1. s'authentifier auprès du fournisseur d'identité
  2. conserver le jeton d'accès dans le cookie
  3. accéder aux pages dans webapp
  4. appeler les services

Le diagramme ci-dessous montre les composants qui seraient nécessaires. Une telle architecture séparant les API web et data donnera une bonne évolutivité, résilience et stabilité

entrez la description de l'image ici

Sandeep Nair
la source
AWS Lambda ne devient-il pas «froid» et prend du temps à démarrer? Cela ralentirait la connexion, n'est-ce pas?
tsuz le
@tsuz, AWS a maintenant introduit la fonctionnalité de concurrence dans lambda où vous pouvez réserver la concurrence. Avec cela, vous pouvez résoudre le problème de démarrage à froid. docs.aws.amazon.com/lambda/latest/dg/…
Sandeep Nair
J'aurais adoré voir cette réponse des années auparavant, cela rend incroyablement simple de comprendre comment l'architecture de microservices avec des microservices indépendants d'authentification et d'autorisation peut être orchestrée pour donner accès à d'autres services
brayancastrop
@Sandeep, je pense que vous faites référence à la simultanéité provisionnée et non réservée.
Anil Kumar
0

Le modèle de passerelle API doit être utilisé pour implémenter cela à l'aide d'OpenID Connect. L'utilisateur sera authentifié par IDP et obtiendra le jeton JWT du serveur d'autorisation. Désormais, le système de passerelle API peut stocker ce jeton dans la base de données Redis et définir le cookie sur le navigateur. La passerelle API utilisera le cookie pour valider la demande de l'utilisateur et enverra le jeton aux microservices.

API Gateway agit comme un point d'entrée unique pour tous les types d'applications clientes telles que l'application cliente de script java publique, l'application Web traditionnelle, l'application mobile native et les applications clientes tierces dans l'architecture Microservice.

Vous pouvez trouver plus de détails à ce sujet sur http://proficientblog.com/microservices-security/

ManishSingh
la source
-2

vous pouvez utiliser le serveur idenitty 4 à des fins d'authentification et d'autorisation

vous devez utiliser l' architecture de pare-feu, vous avez donc plus de contrôle sur la sécurité, la robustesse, l'évolutivité et la facilité d'utilisation

Vijay Parmar
la source