Apparence
Uubu.fr

Les systèmes Linux, l’open source, les réseaux, l’interopérabilité, etc.
« Il vaut mieux viser la perfection et la manquer que viser l’imperfection et l’atteindre. » (Bertrand Arthur William RUSSEL)
24 septembre 2014

LDAP Lightweight Directory Access Protocol           Standards LDAP


draft-haripriya-dynamicgroup-02

draft-haripriya-dynamicgroup-02

Groupes dynamiques pour LDAPv3

   Ce document décris les pré-requis, les sémantiques, les éléments du schéma, et les opérations nécessaires pour une fonctionnalité de groupe dynamique dans LDAP. Un groupe dynamique est définis ici comme un objet groupe avec une liste de dn qui est dynamiquement générée en utilisant un critère de recherche LDAP. La liste des membres dynamique peut ainsi être interrogée par une opération search ou compare, et peut également être utilisée pour trouver les groupes dont un objet est membre. Cette fonctionnalité élimine une grande quantité d'effort administratif pour maintenir l'appartenance à des groupes et les opérations basées sur les rôles dans une grande entreprise.

   Le schéma décris dans ce document définis 2 classes d'objet: 'groupOfNames', et 'groupOfUniqueNames', qui maintiennent une liste statique de DN dans leur attribut member et uniqueMember, respectivement, et sont typiquement utilisés pour décrire un groupe d'objets pour diverses fonctions. Les groupes dynamique sont des groupes normaux, mais permettent de spécifier des critères à utiliser pour évaluer les membres. Cela peut également être un supplément aux groupes statiques dans LDAP pour fournir de la flexibilité.

Pré-requis

   Les pré-requis suivants devraient être en place:

1. La création et l'administration des groupes dynamique devraient être fait en utilisant des opérations LDAP normales
2. Les applications doivent être capable d'utiliser les groupes dynamique de la même manière qu'avec les groupes statiques pour lister les membres et l'évaluation des membres
3. L'interrogation des membre d'un groupe dynamique devrait être fait en utilisant des opérations LDAP normales, et devraient être consistants.

Définition et sémantique du schéma

   Les classes des groupes dynamique sont définis par le schéma suivant:

ObjectClasses

dynamicGroup Cette objet structurel est utilisé pour créer un objet de groupe dynamique. Il est dérivé de groupOfNames
dynamicGroupOfUniqueNames Cette objet structurel est utilisé pour créer un objet de groupe dynamique dont la liste des membres sont maintenus dans un attribut uniqueMember. Il est dérivé de groupOfUniqueNames
dynamicGroupAux Cette classe auxiliaire est utilisée pour convertir un objet existant en un groupe dynamique. Il est dérivé de groupOfNames
dynamicGroupOfUniqueNamesAux Cette classe auxiliaire est utilisée pour convertir un objet existant en un groupe dynamique de membres uniques. Il est dérivé de groupOfUniqueNames

Attributes

memberQueryURL Décris les membres de la liste une utilisant un LDAPURL
excludedMember Utilisé pour exclure les entrées d'un groupe dynamique.
member il est surchargé lorsqu'utilisé avec un groupe dynamique. Il est utilisé pour lister les membres statiques d'un groupe dynamique. Si la même entrée est listée dans les attributs member et excludedMember, cet attribut a précédence
uniqueMember fonctionne de manière similaire à member. Il a également précédence sur excludedMember
dgIdentity Pour fournir des résultat consistants en traitant les critères de recherche, le serveur doit utiliser une simple identité d'autorisation. Si l'autorisation de l'identité est liée, la liste des membres va varier. Cette identité peut servir pour effectuer la recherche.

format LDAPURL

la notation BNF est listée ici pour référence
ldapurl = scheme COLON SLASH SLASH [host [COLON port]] [SLASH dn [QUESTION [attributes] [QUESTION [scope] [QUESTION [filter] [QUESTION extensions]]]]]
scheme = "ldap"
dn = distinguishedName
attributes = attrdesc *(COMMA attrdesc)
attrdesc = selector *(COMMA selector)
selector = attributeSelector
scope = "base" / "one" / "sub"
extensions = extension *(COMMA extension)
extension = [EXCLAMATION] extype [EQUALS exvalue]
extype = oid
exvalue = LDAPString
EXCLAMATION = %x21 ; exclamation mark ("!")
SLASH = %x2F ; forward slash ("/")
COLON = %x3A ; colon (":")
QUESTION = %x3F ; question mark ("?")

schéma


( ‹OID.TBD› NAME 'memberQueryURL' SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
( ‹OID.TBD› NAME 'excludedMember' SUP distinguishedName )
( 2.5.4.31 NAME 'member' SUP distinguishedName )
( 2.5.4.32 NAME 'uniqueMember' SUP distinguishedName )
( ‹OID.TBD› NAME 'identity' SUP distinguishedName SINGLE-VALUE )
    
( ‹OID.TBD› NAME 'dynamicGroup' SUP groupOfNames STRUCTURAL MAY (memberQueryURL $ excludedMember $ dgIdentity ))
( ‹OID.TBD› NAME 'dynamicGroupOfUniqueNames' SUP groupOfUniqueNames STRUCTURAL MAY (memberQueryURL $ excludedMember $ dgIdentity ))
( ‹OID.TBD› NAME 'dynamicGroupAux' SUP groupOfNames AUXILIARY MAY (memberQueryURL $ excludedMember $ dgIdentity ))
( ‹OID.TBD› NAME 'dynamicGroupOfUniqueNamesAux' SUP groupOfUniqueNames AUXILIARY MAY (memberQueryURL $ excludedMember $ dgIdentity ))

Extension x-chain

   Une nouvelle extension est définie pour utilise memberQueryURL dans les groupes dynamiques, appelé 'x-chain'. Elle ne prend pas de valeur. Si présent, le serveur doit suivre toute référence de continuation de recherche sur d'autres serveurs lors de la recherche de membres.

Multiple valeurs

   memberQueryURL peut avoir plusieurs valeurs, et dans ce cas, les membres du groupe dynamique sera l'union de ces membres calculés.

Condition des membres

Un objet O est un membre d'un groupe dynamique G si et seulement si:
(( O is a value of the 'member' or 'uniqueMember' attribute of G)
OR
(( O is selected by the membership criteria specified in the 'memberQueryURL' attribute values of G)
AND
( O is not listed in the 'excludedMember' attribute of G) ))

   Si un membre M d'un groupe dynamique G apparaît être un groupe dynamique ou statique, les membres statiques et dynamique de M ne devraient pas être considérés membre de G. M est un membre de G cependant. La dernière condition est imposée parce que:

- les membre évalués récursivement peuvent dégrader les performances du serveur
- Des boucles peuvent se produire dans des situations particulières
- L'affirmation des membres dynamique ne peut pas être optimisée si le membership récursif est permis.

dgIdentity - implication de sécurité

   Parce que cet attribut donne indirectement, mais effectivement accès à tout le monde avec les opération read ou compare sur les attributs member ou uniqueMember avec les permissions suffisantes pour obtenir un résultat DN depuis memberQueryURL, les implémentation de serveur ne devraient pas autoriser de populer cet attribut avec le DN de n'importe quel objet qui n'est pas administré par l'identité faisant le changement de cet attribut.

Opérations sur les groupes dynamiques

   Les opérations suivantes devraient exposer la fonctionnalité de groupe dynamique. Cet opérations ne nécessitent pas de changement dans l'annuaire, lorsque le sujet est un objet dynamique, et tous les membres du groupe, incluant les membres dynamiques, auront les mêmes permissions sur l'entrée cible.

Lire un objet dynamique

   Quand les attributs member d'un groupe dynamique est listé par le client en utilisant une opération de recherche, les valeurs de member retournés devraient contenir les membres statiques et dynamiques. Cette fonctionnalité ne nécessite pas de changement au protocole, et les client n'ont pas à se préoccuper des groupes dynamiques pour exploiter cette fonctionnalité. Cette fonctionnalité est utile pour les client qui déterminent les accès privilégiés à une ressource par eux-même, en lisant les membres d'un objet groupe.

   Par exemple: les client qui lisent l'attribut member d'un objet groupe dynamique et tentent de supprimer des valeurs qui sont dynamiquent peuvent reçevoir une erreur spécifiant qu'un telle valeur n'existe pas.

le groupe dynamique cn=dg1,o=myorg avec les attributs suivant:
member: cn=admin,o=myorg
excludedMember: cn=guest,ou=finance,o=myorg
excludedMember: cn=robin,ou=finance,o=myorg
memberQueryURL: ldap:///ou=finance,o=myorg??sub?(objectclass=organizationalPerson)
S'il y a 5 organizationalPerson sous ou=finance,o=myorg avec les noms commun bob, alice, john, robin, et guest, la sortie d'une recherche LDAP sur cn=dg1,o=myorg, avec l'attribut listé contenant 'member' sera la suivante:
dn: cn=dg1,o=myorg
member: cn=admin,o=myorg
member: cn=bob,ou=finance,o=myorg
member: cn=alice,ou=finance,o=myorg
member: cn=john,ou=finance,o=myorg

Fonctionnalité Is Member Of

   L'opération de comparaison LDAP permet de découvrir si un DN est membre d'un groupe dynamique. De même, le serveur devrait produire des résultats consistants avec différentes identités d'autorisation lorsqu'il traite cette requête, tant que ces identités ont le même accès à l'attribut member ou uniqueMember. En utilisant les données de l'exemple plus haut, une comparaison dur cn=dg1,o=myorg, pour l'AVA member=cn=bob,ou=finance,o=myorg va résulter en une réponse compareTrue.

Membres statiques

   Parce qu'un groupe dynamique surcharge la sémantique des attributs member et uniqueMember, un mécanisme est nécessaire pour récupérer les valeurs statiques trouvées dans ces attributs dans un but de gestion. Une nouvelle option d'attribut est définie, appelée 'x-static' qui devrait être spécifié uniquement avec les attributs member et uniqueMember.

Exemples

1. La valeur memberQueryURL spécifie le critère d'appartenance pour une entrée de groupe dynamique comme "toutes les entrée inetOrgPerson qui ont leur attribut title à manager, et sont sous ou=hr,o=myorg":
memberQueryURL: ldap:///ou=hr,o=myorg??sub?(&(objectclass=inetorgperson)(title=manager))?x-chain
2. Cet valeur laisse l'utilisateur spécifier le critère d'appartenance pour une entrée de groupe dynamique comme "toutes les entrées sur le serveur local, qui a soit un compte unix ou appartient au département unix, et sous le conteneur engineering":
memberQueryURL: ldap:///ou=eng,o=myorg??sub?(|(objectclass=posixaccount)(department=unix))
3. Ces valeurs laissent l'utilisateur spécifier le critère de membership comme "toutes les entrées inetOrgPerson sur le serveur local, soit sous ou=eng,o=myorg soit sous ou=support,o=myorg"
memberQueryURL: ldap:///ou=eng,o=myorg??sub?(objectclass=inetorgperson)
memberQueryURL: ldap:///ou=support,o=myorg??sub?(objectclass=inetorgperson)