2008-09-30 6 views
5

Nous avons un service qui gère l'autorisation basée sur un nom d'utilisateur et un mot de passe. Au lieu de faire partie du nom d'utilisateur et du mot de passe de l'appel, nous le plaçons dans l'en-tête SOAP.Quels sont les problèmes potentiels avec ce schéma de sécurité WebService?

Dans un scénario typique, un service Web appelle le service d'autorisation au début de l'exécution pour vérifier que l'appelant est autorisé à l'appeler. Le problème est cependant que certains de ces services Web s'appellent les uns les autres, et cela signifie qu'à chaque sous-appel, les autorisations de l'utilisateur sont vérifiées, ce qui peut être très coûteux.

Ce que je pensais faire était d'avoir le service d'autorisation retourner un jeton de sécurité après le premier appel. Ensuite, au lieu de devoir appeler le service d'autorisation à chaque fois, le service Web peut valider l'en-tête de sécurité localement.

L'en-tête de sécurité ressemble à ceci (code C# - parés pour illustrer le concept essentiel):

public sealed class SecurityHeader : SoapHeader 
{ 
    public string UserId;  // Encrypted 
    public string Password; // Encrypted; Just realized this field isn't necessary [thanks CJP] 

    public DateTime TimeStamp; // Used for calculating header Expiry 
    public string SecurityToken; 
} 

L'idée générale est que le SecurityHeader est vérifié à chaque appel. Si elle existe, n'a pas expiré et que SecurityToken est valide, la méthode Web se poursuit normalement. Sinon, il retournera une erreur, ou il tentera de réautoriser et de générer un nouveau SecurityHeader

Le SecurityToken est basé sur un hachage salé de UserId, Password et TimeStamp. Le sel est changé tous les jours pour éviter les rejets. Le seul problème que je vois est qu'un utilisateur peut avoir l'autorisation d'accéder au service Web A, mais pas au service Web B. S'il appelle A et reçoit un jeton de sécurité, cela signifie que B le lui permettra à travers s'il utilise le même jeton. Je dois le changer afin que le jeton de sécurité ne soit valide que du service Web au service Web, plutôt que du service Web à l'utilisateur. Cela devrait être OK si l'utilisateur appelle A qui appelle B, mais pas OK si l'utilisateur appelle le service A puis le service D. Un moyen de contourner cela consiste à affecter une clé commune (ou un ensemble de clés) à des services logiquement liés. (c'est-à-dire si le client peut faire A, alors logiquement il peut aussi faire B).

Sinon, je devrais encoder l'ensemble du jeu d'autorisations de l'utilisateur dans le cadre de l'en-tête de sécurité. Je vais devoir enquêter sur ce que seront les frais généraux.

Edit:

Plusieurs personnes ont mentionné la recherche d'autres régimes de sécurité comme WS-Security et SAML etc. Je l'ai déjà. En fait, j'ai eu l'idée de WS-Security. Le problème est que d'autres systèmes ne fournissent pas la fonctionnalité dont j'ai besoin (mise en cache des informations d'autorisation et protection contre les rejets sans base de données intermédiaire). Si quelqu'un connaît un régime qui fait alors je serai heureux de l'utiliser à la place. En outre, c'est pas à propos de l'authentification. Cela est géré par un autre mécanisme indépendant de mon contrôle.

S'il s'avère qu'il n'y a aucun moyen de mettre en mémoire cache les données d'autorisation, cela signifie que je n'aurai qu'à supporter le surcoût d'autorisation à chaque niveau.

+0

Une assertion SAML ressemble à ceci: "Le client X a des rôles A et B. Cette assertion est valide au fil du temps T. Signé, AuthService." Comment est-ce que ce n'est pas ce dont vous avez besoin? – ykaganovich

+0

Je vais revoir SAML et XACML aujourd'hui. – ilitirit

Répondre

1

Personnellement, je ne vous vois pas avoir de problèmes tant que vous avez un cadre sous-jacent centralisé pour prendre en charge la validation des valeurs SecurityToken.

2

Ok, en remplaçant mes réponses plus anciennes avec un meilleur espoir. Ce que vous décrivez devrait fonctionner si vous avez un moyen de partager des données en toute sécurité entre vos services.Par exemple, si vos services partagent une clé secrète avec le service d'autorisation, vous pouvez utiliser cette clé pour obtenir le sel.

BTW, je ne connais pas assez de cryptographie pour dire si c'est assez sûr d'ajouter du sel + hachage secret (bien que cela semble bien); Je suis sûr que c'est sûr HMAC avec une clé secrète ou privée. La rotation des clés est une bonne idée, donc vous auriez toujours une clé principale et propager une nouvelle clé de signature. D'autres problèmes avec votre approche sont que (a) vous codifiez en dur la logique de hachage dans chaque service, et (b) les services peuvent vouloir obtenir des données plus détaillées du service d'autorisation qu'une simple réponse oui/non. Par exemple, vous pouvez souhaiter que le service d'autorisation insère dans l'en-tête que cet utilisateur appartient aux rôles A et B mais pas C.

Vous pouvez également laisser le service d'autorisation créer un nouvel en-tête avec toutes les informations intéressantes qu'il contient. a, et signe ce bloc.

À ce stade, nous discutons d'une implémentation Single Sign-On. Vous connaissez déjà les spécifications WS-Security. Cet en-tête que j'ai décrit ressemble beaucoup à une assertion SAML. À propos de l'utilisation de WS-Security et SAML pour Single Sign-On. Maintenant, je ne sais pas si vous avez besoin de tout ça ... il y a aussi des solutions entre-deux. Par exemple, le service d'autorisation peut signer le bloc Username original; Si vous vous inquiétez des performances de cryptage public/privé et que vous acceptez de partager des clés secrètes, vous pouvez également utiliser une clé secrète pour signer à la place des clés publiques/privées.

4

Le problème fondamental avec votre système est que vous n'utilisez pas un cadre standard ou une implémentation. Ceci est indépendamment des mérites particuliers de votre régime lui-même. La raison est simple, la sécurité (en particulier la cryptographie) est très, très compliquée et pratiquement impossible à obtenir. Utilisez un outil commun robuste, bien compris et éprouvé. Voir: http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=wss pour plus d'informations sur WS-Security.

La plupart des frameworks (.NET/JavaEE etc.) auront un support intégré (dans une certaine mesure) pour WS-Security. Si vous croyez que votre système est meilleur que les normes, je vous suggère de le rédiger comme un document et de le soumettre à un examen par les pairs (avec une mise en œuvre de référence), mais ne l'utilisez PAS pour sécuriser une application.

EDIT pour répondre à l'OP Edit: Je pense que vous confondez les rôles de ce qui est facile à faire authentification et d'autorisation un peu, ...

Le rouleau du jeton de sécurité (ou similaire) en schémas est d'authentifier l'expéditeur du message - fondamentalement, est l'expéditeur qui ils devraient être. Comme vous l'avez souligné à juste titre, l'authentification n'implique aucun élément concernant les ressources sous-jacentes auxquelles l'expéditeur doit avoir accès. L'autorisation est le processus par lequel vous prenez un expéditeur authentifié et appliquez un ensemble d'autorisations afin de restreindre l'étendue de l'accès. En général, les frameworks n'autorisent pas l'autorisation par défaut, vous devez soit l'activer en créant une forme d'ACL, soit en développant une sorte d'interface de type "Security Manager".

En effet, l'idée est que la couche d'authentification vous indique qui tente d'accéder à la page A, et laisse à vous de décider si cette personne est autorisée à accéder à la page A.

Vous ne devriez jamais magasin des informations sur les droits et permissions dans le message lui-même - le destinataire devrait vérifier les droits sur sa liste de contrôle d'accès (ou sur sa base de données ou autre) pour chaque message. Cela limite votre exposition si quelqu'un décide comment modifier le message.

+0

Y a-t-il des problèmes potentiels? – ilitirit

+0

Les problèmes seront probablement dans la mise en œuvre, par ex. si vous êtes ouvert à la relecture, au rembourrage, à la collision, etc. Honnêtement, ça ne vaut pas le drame quand vous pouvez utiliser des choses que d'autres personnes ont déjà fait leur tête dans :) –

+0

Je vois ce que vous voulez dire - Je n'ai pas besoin de stocker le mot de passe après que l'utilisateur a été authentifié. Cela rend les choses un peu plus simples. Cependant, cela n'aide pas avec le problème initial - la mise en cache des permissions pour que je n'ai * pas * à vérifier avec chaque message (c'est une opération coûteuse) – ilitirit

0

Tout d'abord, lisez le post @CJP, il fait un excellent point et valide.
Si vous voulez aller de l'avant et roulez vous-même de toute façon (peut-être vous avez une bonne raison pour cela), je voudrais faire les points suivants:

  • Vous parlez d'un service d'authentification, pas une autorisation un service. Juste pour être sûr de savoir de quoi tu parles ...? Deuxièmement, vous devez séparer entre le sel (qui n'est pas un secret) et la clé (qui est). Vous devriez avoir un hachage à clé (par exemple HMAC), avec du sel (ou un hachis salé avec clé.) Cela ressemble à un sandwich. Le sel, comme indiqué, n'est pas un secret, mais devrait être changé POUR CHAQUE JETON, et peut être inclus dans l'en-tête; la clé DOIT être secrète et être changée tous les jours, c'est bien. Bien sûr, assurez-vous que vous utilisez un hachage fort (par exemple SHA-256), des techniques de gestion de clés appropriées, etc.

Encore une fois, je vous invite à reconsidérer le vôtre, mais si vous devez sortir vous-même ...

+0

Je ne parle pas d'un service d'authentification, je parle d'autorisation (permissions). Les valeurs de sel peuvent être utilisées comme clés (j'ai aussi une clé secrète) .Je n'ai pas rencontré de schéma existant qui gère Autorisations d'autorisation et de rejeu de tierce partie sans base de données intermédiaire. – ilitirit

+0

Ok, après avoir édité, je vois ce que vous voulez dire - mais ce n'est toujours pas vraiment une autorisation à moins d'inclure le "jeu d'autorisations". Tout au plus, son authentification + accès. – AviD

+0

De plus, saler simplement le hachage n'empêchera pas l'usurpation, vous avez besoin d'un hachage à clé pour cela - le sel sert à empêcher les attaques de tables arc-en-ciel, d'où la nécessité qu'il soit unique pour chaque jeton. – AviD

Questions connexes