2017-03-10 1 views
0

Contexte: Je crée un serveur de fichiers. J'utilise Tomcat derrière le proxy inverse Nginx. J'ai un serveur principal qui héberge l'interface utilisateur et beaucoup de serveurs périphériques où j'espère stocker les fichiers téléchargés par l'utilisateur et les servir. C'est un stockage de fichiers privé, donc seul le téléchargeur de fichiers devrait pouvoir télécharger les fichiers téléchargés. Problème: J'authentifie les utilisateurs sur le serveur principal lorsqu'ils se connectent à leur compte en créant une session et en la conservant pour valider d'autres requêtes de la part des utilisateurs (tâches régulières). Cette information n'est pas propagée aux serveurs de périphérie, les serveurs de périphérie servent des fichiers à n'importe quelle demande. Ce n'est pas ce que je veux. Je veux autoriser les téléchargements uniquement pour le propriétaire du fichier.Valider les demandes d'un utilisateur entre les serveurs

Maintenant, ici j'essaie d'éviter le clustering Tomcat où les bords et les serveurs principaux configurent comme un cluster qui a des sessions distribuées. Le site est pris en charge par SSL. Existe-t-il un moyen de valider l'état de connexion d'un utilisateur lorsqu'une demande de téléchargement de fichier atteint un serveur Edge d'un utilisateur déjà connecté (créé une session) sur le serveur principal?

+0

Où se situe votre limite de confiance? Est-ce que votre requête de main à edge contient simplement l'ID utilisateur et que edge peut le vérifier avant de servir le fichier ou de renvoyer le fichier 401 Non autorisé lorsque l'utilisateur donné n'est pas autorisé? Ou devez-vous rendre les fichiers utilisateur aussi sûrs que possible, même contre les personnes ayant accès aux serveurs (administrateurs, opérateurs, employés, etc.)? – diginoise

+0

Quelque chose entre les deux. userId est trop faible comme on peut le deviner. Interdire l'accès admin au fichier nécessiterait de crypter le fichier entier en utilisant une clé connue uniquement du propriétaire du fichier et de le décrypter sur le navigateur des clients.Ce que je veux empêcher quelqu'un (autre que le propriétaire) de le télécharger sur Internet en utilisant un direct comme le fichier. – printfmyname

+1

Vous devez faire en sorte que les transactions de sécurité des serveurs de périphérie soient en quelque sorte prises en compte ... Un cookie dont l'heure d'expiration est chiffrée avec la clé privée du serveur principal; Les serveurs Edge déchiffreraient alors le cookie à l'aide de la clé publique de Main. – diginoise

Répondre

1

Je vois plusieurs approches que vous pouvez utiliser

Vous pouvez utiliser une forme de « l'authentification basée sur des demandes » ou un jeton d'accès aux ressources.

Authentification basée sur les revendications - vous pouvez utiliser par ex. un jeton JWT, qui doit contenir certaines informations nécessaires (identifiant utilisateur, identifiant de compte, autorisation, expiration, ..) et est signé par un secret partagé (entre le serveur principal et les serveurs de fichiers) ou par une clé privée du serveur principal.

L'avantage est que le serveur de périphérie peut valider le jeton en fonction du hachage ou de la signature sans contacter le serveur principal. Inconvénient, c'est qu'il doit y avoir de la logique pour décider si l'utilisateur a accès à la ressource demandée.

voir: https://jwt.io/

jeton d'accès à la ressource - cette approche qui est utilisée certains fournisseurs de stockage en nuage (AWS S3, IBM Object Storage, ...) - le site principal retourne une ressource URL avec quelques paramètres supplémentaires - par exemple compte, nonce, expiration, signature. Le serveur ressource (Edge) doit vérifier l'expiration et la signature et fournir ou refuser la ressource

L'avantage est que le serveur de périphérie ne se soucie pas de toute authentification et que l'authentification et l'autorisation sont complètement dans la portée du serveur principal. Le désavantage est que l'URL de ressource fournie doit avoir une durée d'expiration limitée.

voir: http://s3-expiry.50projects.com/

Note:

  • placer la condition que le serveur de ressources ne peut pas communiquer avec le serveur principal, vous êtes effectivement incapable de vérifier si l'utilisateur est connecté, sauf en utilisant SAML SSO avec SLO (single logout) ou OIDC avec gestion de session
+0

JWT semble prometteur et dispose également d'une bibliothèque Java. Merci, je peux construire un schéma sur votre réponse et @diginoise pour authentifier un utilisateur sur les serveurs Edge. Je vais garder ce fil ouvert pour quelques jours de plus juste pour voir si quelqu'un post une meilleure solution .. merci Gabriel – printfmyname