2009-02-24 12 views
4

Je voudrais utiliser un serveur LDAP (probablement Apache directory) pour gérer les connexions et les informations d'identification pour une application. De temps en temps, l'application doit fonctionner hors ligne (sur un ordinateur portable) sans connexion au serveur LDAP.Comment utiliser les informations d'identification LDAP hors connexion?

Quelle est la meilleure façon de répliquer les informations d'identification localement?

Je l'ai déjà pensé:

  • En utilisant Mitosis pour répliquer le serveur LDAP sur l'ordinateur portable.

    Mais ce serait une solution assez "lourde" et compliquée. De plus, Mitosis ne semble pas encore être fini.

  • Exportation des informations d'identification en tant que fichier LDIF pouvant être stocké sur l'ordinateur portable.

    Mais j'aurais besoin d'un moyen de vérifier que le fichier LDIF provient réellement du serveur LDAP (le fichier devrait inclure une sorte de signature). De plus, je voudrais rejeter les fichiers LDIF qui n'ont pas été mis à jour depuis plus d'une semaine. Ce serait bien si je pouvais éviter d'implémenter la signature et le contrôle de l'âge moi-même.

D'autres idées ou des outils qui pourraient me aider?

Modifier Modifiée: J'ai regardé Kerberos parce que le documentation of the Java-Kerberos-API semble dire qu'il est possible d'utiliser un billet mis en cache dans un cache local et je pensais que cela pourrait être une solution pour moi. De plus, Kerberos peut être ajouté en tant que plugin au répertoire Apache. Mais le cache Kerberos stocke les tickets décryptés (visant à les partager avec d'autres applications). J'aurais besoin de la version cryptée du ticket pour pouvoir vérifier le mot de passe de l'utilisateur lors d'une session hors ligne. Conclusion: Kerberos n'offre pas une solution simple à mon problème.

+0

Est-il obligatoire qu'un utilisateur qui n'a jamais ouvert de session avant la mise hors ligne de l'ordinateur portable puisse se connecter après la mise hors ligne du portable? – vladr

+0

Il sera probablement correct si l'utilisateur doit se connecter une fois en ligne avant de pouvoir se connecter hors ligne. – Name

Répondre

1

Voici la solution que je décidé d'utiliser (je l'ai déjà décrit dans une édition à ma question, mais je voudrais en mesure d'accepter une réponse à « fermer » la question):

Comme Je n'ai pas trouvé d'autre solution, j'ai décidé d'utiliser une exportation LDIF, d'ajouter un horodatage comme commentaire au début du fichier, puis de signer le fichier. Pour signer le fichier, je calcule une valeur de hachage (SHA-1) du fichier + une clé secrète. La signature est ajoutée en tant que commentaire au début du fichier. Pour vérifier la signature, je supprime la première ligne du fichier signé et recalcule la valeur de hachage.

4

Sachant que il sera probablement ok si l'utilisateur doit se connecter une fois en ligne avant de pouvoir se connecter en ligne, considèrent l'algorithme suivant:

  1. utilisateur fournit votre application avec un (username + password)
  2. l'application tente de contacter LDAP pour l'authentification
    • en ligne? (Par exemple une connexion réussie)
        l'application
      1. authentifie contre LDAP à l'aide (username + password)
        • d'authentification succesful?
          1. magasins d'applications ou mises à jourhash(password) comme (cached_credentials) pour (username) dans le stockage local sécurisé
          2. produit d'application comme authentifiées[[STOP]]
        • authentification a échoué?
          1. produit d'application comme (informations d'identification incorrectes) non authentifié [[STOP]]
    • mode hors ligne? (Par exemple erreur réseau)
      1. application tente de récupérer (cached_credentials) pour (username) de stockage local sécurisé
        • (cached_credentials) existe AND plus récente que (1 week)?
            l'application
          1. compare (cached_credentials) contre hash(password)
            • match?
              1. produit d'application comme authentifiées[[STOP]]
            • pas de match?
              1. produit d'application comme non authentifiés (informations d'identification incorrectes) [[STOP]]
        • (cached_credentials) n'existe pas OR moins récente que (1 week)?
          1. produit d'application que non authentifié (erreur réseau) [[STOP]]

Ceci est (ou était, IDE), par le façon, le même modèle utilisé par Windows NT + pour l'authentification de l'utilisateur ion contre les contrôleurs de domaine. Lors de la connexion, une tentative d'authentification est effectuée sur le contrôleur de domaine et crée ou met à jour la version locale (mise en cache) du profil utilisateur. Si le contrôleur de domaine n'est pas disponible, l'utilisateur est invité à procéder à l'authentification contre les informations d'identification saisies dans le profil local (en cache) (le cas échéant.)


EDIT

  • Oui , c'est, dans l'esprit, la même solution que la copie locale d'un fichier ldif, sauf que vous n'avez pas besoin d'analyser ldif lorsque vous êtes hors ligne. :)
  • Il est entendu que vous pouvez stocker des attributs supplémentaires (autorisations, etc.) dans votre cache
  • Il est également entendu que «stockage sécurisé» est au moins signé. :) Vous pouvez le faire assez facilement avec un hachage SHA-1 et un secret, ou vous pouvez utiliser des fournisseurs cryptographiques à part entière disponibles sur votre plate-forme (ou en Java, si vous utilisez Java.) Vous n'avez pas besoin de crypter aussi longtemps car aucune information secrète n'est stockée à l'intérieur.
+0

Merci d'avoir écrit l'algorithme détaillé. Mais en réalité, il s'agit de la même solution qu'avec un fichier ldif: Considérons le fichier ldif comme étant le "stockage sécurisé local". Je dois encore gérer moi-même ce stockage sécurisé local (le signer ou le crypter pour éviter la falsification et y ajouter un horodatage). – Name

+0

Une précision: les informations d'identification incluent plus de nom d'utilisateur + mot de passe. Ils incluent également une liste des droits de l'utilisateur. Un mot de passe haché n'est pas suffisant pour éviter la falsification, car un utilisateur peut simplement ajouter un nouveau droit à sa propre liste si le "stockage sécurisé local" n'est pas signé. – Name

+0

Oui, je sais. :) Voir ma mise à jour. Il est vraiment trivial de sécuriser tout votre stockage avec un hachage sha-1. – vladr

Questions connexes