\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{dim. sept. 22 18:28:02 CEST 2013}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={slapd-access},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Configuration d'accès pour slapd},
CreationDate={D:20130922182802},
ModDate={D:20130922182802},
Keywords={LDAP;OpenLDAP;Lightweight Directory Access Protocol}
}}
\begin{document}
 
\begin{center}
{\Huge slapd-access }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Configuration d'accès pour slapd}
 
\vspace{10mm}
 
\vspace{1cm}{\huge Structure }
 
\
 
\hspace{1mm}  \textbf{access to <what> [ by <who> [ <access> ] [ <control> ] ]+}
\vspace{5mm} \\
 
 
\hspace{1mm}  Donne accès à un jeu d'entrées et/ou attributs (what) par des demandeurs (who). Les ACL sont évaluées dans l'ordre auxquelles elles apparaissent. lors qu'un what match, who est vérifié. puis les clauses access et control sont évaluées
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Le champ WHAT }
 
\
 
\hspace{1mm} Spécifie l'entité à laquelle cette ACL s'applique. Il peut avoir les formes suivante:
 
{\ttfamily
dn\texttt{[}.<dnstyle>\texttt{]}=<dnpattern>\\ filter=<ldapfilter>\\ attrs=<attrlist>\texttt{[} val\texttt{[}/matchingRule\texttt{]}\texttt{[}.<attrstyle>\texttt{]}=<attrval>\texttt{]}\\
}
\vspace{8mm}
 
\hspace{1mm} avec:
 
{\ttfamily
<dnstyle>=\{\{exact|base(object)\}|regex|one(level)|sub(tree)|children\}\\ <attrlist>=\{<attr>|\texttt{[}\{!|@\}\texttt{]}<objectClass>\}\texttt{[},<attrlist>\texttt{]}\\ <attrstyle>=\{\{exact|base(object)\}|regex|one(level)|sub(tree)|children\}\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{1mm} dn=<dnpattern>]{Sélectionne les entrées basées sur leur contexte de nommage}
\item[\hspace{1mm} <dnstyle>]{(optionnel). \textbf{Base} (synonymes de baseObject) ou exact (alias de base) indique l'entrée dont le DN est égal à <dnpattern>. \textbf{one} (synonyme de onelevel) indique toutes les entrées immédiatement sous le <dnpattern>, \textbf{sub} (synonyme de subtree) indique toutes les entrées dans la sous-arborescence de <dnpattern>, \textbf{children} indique toutes les entrées subordonnées à <dnpattern> Si dnstyle est un regex, <dnpattern> est une expression étendue POSIX et match une représentation du DN.}
\item[\hspace{1mm} filter=<ldapfilter>]{Sélectionne les entrées basée sur un filtre LDAP}
\item[\hspace{1mm} attrs=<attrlist>]{sélectionne les attributs auxquels la règle s'applique. Le signe \textbf{+} indique l'accès à l'entrée elle-même. \textbf{children} indique l'accès à l'entrée de l'enfant. Les classes d'objet peuvent être spécifiés également. Les noms préfixés par '\textbf{@}' sont directement traités comme nom de classe d'objet. un nom préfixé par '\textbf{!}' et traité comme classe d'objet mais la règle affecte les attributs non requis ni permis. sans cette liste, assume \textbf{attrs=@extensibleObject}}
\item[\hspace{1mm} attrs=<attrlist>\texttt{[} val\texttt{[}/matchingRule\texttt{]}\texttt{[}.<attrstyle>\texttt{]}=<attrval>\texttt{]}]{Cette forme spécifie un accès à une valeur particulière d'un simple attribut. seul l'attribut est donnée.}
\item[\hspace{1mm} dn, filter, attrs]{sont additifs. les sous-match résultant de regex peuvent être dé-référencés dans \textbf{<who>} avec la syntaxe \$\verb|{|v\_n\_\verb|}| où \textbf{\_n\_} est le numéro de sous-match.}
\end{description}
 
\vspace{1cm}{\huge Le champ WHO }
 
\
 
\hspace{1mm} Indique à qui la règle s'applique. Plusieurs who peuvent apparaîtrent dans l'acl. Il a la forme:
 
{\ttfamily
*\hspace{2mm}\\ anonymous\\ users\\ self\texttt{[}.<selfstyle>\texttt{]}\\ \hspace{2mm}\\ dn\texttt{[}.<dnstyle>\texttt{[},<modifier>\texttt{]}\texttt{]}=<DN>\\ dnattr=<attrname>\\ \hspace{2mm}\\ realanonymous\\ realusers\\ realself\texttt{[}.<selfstyle>\texttt{]}\\ \hspace{2mm}\\ realdn\texttt{[}.<dnstyle>\texttt{[},<modifier>\texttt{]}\texttt{]}=<DN>\\ realdnattr=<attrname>\\ \hspace{2mm}\\ group\texttt{[}/<objectclass>\texttt{[}/<attrname>\texttt{]}\texttt{]}\texttt{[}.<groupstyle>\texttt{]}=<group>\\ peername\texttt{[}.<peernamestyle>\texttt{]}=<peername>\\ sockname\texttt{[}.<style>\texttt{]}=<sockname>\\ domain\texttt{[}.<domainstyle>\texttt{[},<modifier>\texttt{]}\texttt{]}=<domain>\\ sockurl\texttt{[}.<style>\texttt{]}=<sockurl>\\ set\texttt{[}.<setstyle>\texttt{]}=<pattern>\\ \hspace{2mm}\\ ssf=<n>\\ transport\_ssf=<n>\\ tls\_ssf=<n>\\ sasl\_ssf=<n>\\ \hspace{2mm}\\ dynacl/<name>\texttt{[}/<options>\texttt{]}\texttt{[}.<dynstyle>\texttt{]}\texttt{[}=<pattern>\texttt{]}\\ avec:\\ <style>=\{exact|regex|expand\}\\ <selfstyle>=\{level\{<n>\}\}\\ <dnstyle>=\{\{exact|base(object)\}|regex|one(level)|sub(tree)|children|level\{<n>\}\}\\ <groupstyle>=\{exact|expand\}\\ <peernamestyle>=\{<style>|ip|ipv6|path\}\\ <domainstyle>=\{exact|regex|sub(tree)\}\\ <setstyle>=\{exact|expand\}\\ <modifier>=\{expand\}\\ <name>=aci <pattern>=<attrname>\texttt{]}\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{1mm} * ]{Indique tout le monde}
\item[\hspace{1mm} realanonymous]{Les mots clé préfixés par real agissent comme leur homologue non préfixés. La vérification se produit avec le DN authentification et le DN authorisation}
\item[\hspace{1mm} anonymous]{référence les clients non authentifiés}
\item[\hspace{1mm} users]{Références les clients authentifiés}
\item[\hspace{1mm} self]{Référence l'entrée elle-même (l'entrée demandée et l'entrée qui requête doit correspondre). Accepte le style level\verb|{|<n>\verb|}|, où \_n\_ indique que l'ancêtre du DN est utilisé dans le match. Une valeur positive indique que le <n>-ième ancêtre du DN de l'utilisateur est considéré; une valeur négative indique que le <n>-ième ancêtre de la cible doit être considéré. (ex: "by self.level\verb|{|1\verb|}| ..." matche quand l'objet "dc=example,dc=com" est accédé par cn=User,dc=example,dc=com") (ex: "by self.level\verb|{|-1\verb|}| ..." matche quand le même user accède à "ou=Address Book,cn=User,dc=example,dc=com"}
\item[\hspace{1mm} dn=<DN>]{L'accès est donnée au DN qui matche.}
\item[\hspace{1mm} dnstyle]{(optionnel) autorise le même choix que pour WHAT. le style regex exploit la substitution de sous-match dans le dn.regex de WHAT en utilisant la forme \$<digit>, de 0 à 9 où 0 match toute la chaîne. \$\verb|{|<digit>+\verb|}| pour les sous-matches > 9, \$\verb|{|v<digit>+\verb|}| pour la substitution de chaîne de valeur d'attributs. le \$ de fin de chaîne doit être spécifié par '\$\$'}
\end{description}
 
\hspace{1mm} \textbf{access to dn.regex="\textasciicircum (.+,)?uid=([\textasciicircum ,]+),dc=[\textasciicircum ,]+,dc=com\$" by dn.regex="\textasciicircum uid=\$2,dc=[\textasciicircum ,]+,dc=com\$\$" write} \\
\hspace{1mm} \textbf{access to dn.regex="\textasciicircum (.+,)?uid=([\textasciicircum ,]+),dc=example,dc=com\$" by dn.exact,expand="uid=\$2,dc=example,dc=com" write} \\
\hspace{1mm} \textbf{access to dn.regex="\textasciicircum (.+,)?uid=([\textasciicircum ,]+),dc=([\textasciicircum ,]+),dc=com\$" by dn.exact,expand="uid=\$2,dc=\$3,dc=com" write} \\
 
\begin{description} \normalsize
\item[\hspace{1mm} level\{n\}]{est une extension de la forme onelevel, où l'ancêtre n est le pattern. Donc level\verb|{|1\verb|}| est équivalent à onelevel et level\verb|{|0\verb|}| vaut base}
\item[\hspace{1mm} dnattr=<attrname>]{L'accès est donné aux requêtes dont le DN est listé dans l'entrée accédée sous l'attribut <attrname>}
\item[\hspace{1mm} group=<group>]{L'accès est donné aux requêtes dont le DN est listé dans l'entrée group dont le DN est donné par <group> <objectclass> et <attrname> donnent la classe objet et l'attribut des membres.(défaut: groupOfNames et member). <style> peut être expand qui signifie que <group> sera étendu comme remplacement (mais non comme expression régulière), et exact, qui signifie que le match exacte sera utilisé. Pour des groupes statiques, le type d'attribut spécifié doit avoir la syntaxe DN ou NameAndOptionalUID. pour les groupes dynamiques, le type d'attribut doit être un sous-type de labeledURI}
\item[\hspace{1mm} peername=<peername>]{L'IP de l'hôte contactant (sous la forme IP=<ip>:<port> ou IP=[<ipv6>]:<port>) ou le nom de l'hôte contactant (PATH=<path>)}
\item[\hspace{1mm} sockname=<sockname>]{Le nom du fichier de pipe nommé}
\item[\hspace{1mm} domain=<domain>]{Le nom d'hôte du contactant}
\item[\hspace{1mm} sockurl=<sockurl>]{l'URL du contactant, sont comparés avec le pattern pour déterminer l'accès. Le style décrit pour group et regex s'appliquent. Le cas spécial pour ip: <peername>=<ip>[\%<mask>][\verb|{|<n>\verb|}|] où n est le nom du port optionnel (ex: peername.ip=192.168.1.16\%255.255.255.240\verb|{|9009\verb|}|). (ex: domain.subtree=example.com match www.example.com)}
\item[\hspace{1mm} set=<pattern>]{}
\item[\hspace{1mm} dynacl/<name>\texttt{[}/<options>\texttt{]}\texttt{[}.<dynstyle>\texttt{]}\texttt{[}=<pattern>\texttt{]}]{Indique que la vérification de l'accès est déléguée à une méthode définies indiquée par <name>, qui peut être enregistrée en temps réel au moyen de déclarations moduleload. <options>, <dynstyle> et <pattern> sont optionnels et sont passés directement à la routine de parsing enregistrée}
\item[\hspace{1mm} dynacl/aci\texttt{[}=<attrname>\texttt{]}]{Signifie que le contrôle d'accès est déterminé par les valeurs dans attrnames de l'entrée elle-même. <attrname> indique quel type d'attribut maintient l'ACI dans l'entrée. Par défaut, OpenLDAPaci est utilisé}
\item[\hspace{1mm} ssf=<n>]{}
\item[\hspace{1mm} transport\_ssf=<n>]{}
\item[\hspace{1mm} tls\_ssf=<n>]{}
\item[\hspace{1mm} sasl\_ssf=<n>]{Définissent le SSF minimum pour obtenir l'accès}
\end{description}
 
\vspace{1cm}{\huge Le champ ACCESS }
 
\
 
\hspace{1mm} Optionnel. Détermine le niveau d'accès ou le privilège que who aura. Il a la forme:
 
{\ttfamily
<access> ::= \texttt{[}\texttt{[}real\texttt{]}self\texttt{]}\{<level>|<priv>\}\\ où:\\ <level> ::= none|disclose|auth|compare|search|read|\{write|add|delete\}|manage\\ <priv> ::= \{=|+|-\}\{0|d|x|c|s|r|\{w|a|z\}|m\}+\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{1mm} self]{Permet des opération spéciales pour le DN autorisé}
\item[\hspace{1mm} realself]{Réfère au DN authentifié}
\item[\hspace{1mm} level]{ce modèle d'accès s'assure d'une interprétation incrémentale des privilèges. Les niveaux possibles sont none (aucun accès, disclose ( divulgation d'information en cas d'erreur), auth (permettre l'authentification), compare, search, read, write (add+delete) et manage (inclus des accès administratifs).}
\item[\hspace{1mm} priv]{le modèle d'accès priv se base sur des paramètres explicites de privilèges pour chaque clause. = réinitialise les accès définis précédemment, + et - ajoute/supprime des privilèges. m (manage), w (write), a (add), z (delete), r (read), s (search), c (compare), x (authentification), d (disclose), 0 ( aucun privilège) (défaut: +0)}
\end{description}
 
\vspace{1cm}{\huge Le champ Control }
 
\
 
\hspace{1mm}  Optionnel. Contrôle le flux de règles d'accès. Peut être:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} stop]{Stop en cas de match}
\item[\hspace{1mm} continue]{Permet à d'autres clause <who> dans le même <access> d'être considérés}
\item[\hspace{1mm} break]{Permet à d'autres clauses <access> qui matchent la même cible d'être traités}
\end{description}
 
\hspace{1mm} exemple break: \\
\hspace{1mm} \textbf{access to dn.subtree="dc=example,dc=com" attrs=cn by * =cs break} \\
\hspace{1mm} \textbf{access to dn.subtree="ou=People,dc=example,dc=com" by * +r} \\
\hspace{1mm} exemple continue: \\
\hspace{1mm} \textbf{access to dn.subtree="dc=example,dc=com" attrs=cn by * =cs continue by users +r} \\
 
\vspace{1cm}{\huge Scopes }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} base]{correspond seulement à l'entrée avec le DN fournit}
\item[\hspace{1mm} one]{correspond aux entrées dont le parent est le DN fournit}
\item[\hspace{1mm} subtree]{correspond à toutes les entrées dans l'arbre dont le root est le DN fournit}
\item[\hspace{1mm} children]{correspond à toutes les entrées sous le DN (mais pas l'entrée nommée par le DN)}
\end{description}
 
\hspace{1mm} Par exemple, si l'annuaire contient les entrées nommées :
 
{\ttfamily
o=suffix\\ cn=Manager,o=suffix\\ ou=people,o=suffix\\ uid=kdz,ou=people,o=suffix\\ cn=addresses,uid=kdz,ou=people,o=suffix\\ uid=hyc,ou=people,o=suffix\\
}
\vspace{8mm}
 
\begin{description} \normalsize
\item[\hspace{1mm} ]{alors:}
\item[\hspace{1mm} dn.base="ou=people,o=suffix"]{match 2 ;}
\item[\hspace{1mm} dn.one="ou=people,o=suffix]{match 3, and 5 ;}
\item[\hspace{1mm} dn.subtree="ou=people,o=suffix]{match 2, 3, 4, and 5 ; and}
\item[\hspace{1mm} dn.children="ou=people,o=suffix]{match 3, 4, and 5.}
\end{description}
 
\vspace{1cm}{\huge cibles }
 
\
 
{\ttfamily
*\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_All, including anonymous and authenticated users\\ anonymous\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_Anonymous (non-authenticated) users\\ users\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_Authenticated users\\ self\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_User associated with target entry\\ dn\texttt{[}.<basic-style>\texttt{]}=<regex>\_Users matching a regular expression\\ dn.<scope-style>=<DN>\_\_\_\_\_\_Users within scope of a DN\\
}
\vspace{8mm}
 
\vspace{1cm}{\huge Correspondance des droits }
 
\
 
\hspace{1mm} Level\_\_\_\_\_Privileges\_\_\_\_\_\_Description
 
{\ttfamily
none\_\_\_\_\_\_0\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_no access\\ disclose\_\_d\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_needed for information disclosure on error\\ auth\_\_\_\_\_\_dx\_\_\_\_\_\_\_\_\_\_\_\_\_\_needed to authenticate (bind)\\ compare\_\_\_cdx\_\_\_\_\_\_\_\_\_\_\_\_\_needed to compare\\ search\_\_\_\_scdx\_\_\_\_\_\_\_\_\_\_\_\_needed to apply search filters\\ read\_\_\_\_\_\_rscdx\_\_\_\_\_\_\_\_\_\_\_needed to read search results\\ write\_\_\_\_\_wrscdx\_\_\_\_\_\_\_\_\_\_needed to modify/rename\\ manage\_\_\_\_mwrscdx\_\_\_\_\_\_\_\_\_needed to manage\\
}
\vspace{8mm}
 
\vspace{1cm}{\huge Opérations requises }
 
\
 
\hspace{1mm}  Les opérations nécessitent différents privilèges sur différentes portions d'entrées.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} add]{nécessite le privilège add sur le pseudo-attribut de l'entrée à ajouter, et add sur le pseudo-attribut children du parent de l'entrée.}
\item[\hspace{1mm} bind]{quand les accréditifs sont stockés dans l'annuaire, nécessite les privilèges auth sur l'attribut où sont stockés ces accréditifs.}
\item[\hspace{1mm} Compare]{nécessite compare sur l'attribut à comparer}
\item[\hspace{1mm} delete]{nécessite delete sur le pseudo-attribut de l'entrée à supprimer et sur le pseudo-attribut children du parent de l'entrée}
\item[\hspace{1mm} modify]{nécessite write (add pour ajouter, delete pour supprimer, les 2 pour modifier)}
\item[\hspace{1mm} modrdn]{nécessite write sur le pseudo-attribut de l'entrée à supprimer, delete sur le pseudo-attribut Children de l'ancien parent de l'entrée, et add sur le pseudo-attribut Children du nouveau parent de l'entrée. delete est aussi requis sur les attributs qui sont présent dans l'ancien RDN si deleteoldrdn et à 1.}
\item[\hspace{1mm} search]{nécessite search sur le pseudo-attribut entry du searchBase. Les entrées résultantes sont ensuite testé sur read sur le pseudo-attribut entry et sur chaque valeurs de chaque attribut demandé pour chaque referral utilisé pour générer des références continues, read sur le pseudo-attribut entry et les attributs du referral.}
\item[\hspace{1mm} authzID, proxyAuthz]{necessitent auth sur tous les attributs présents dans la recherche et sur authzTo et/ou authzFrom de l'identité autorisant.}
\end{description}
 
\vspace{1cm}{\huge Exemples }
 
\
 
\hspace{1mm} Pour matcher la sous-arborescence désirée, la règle serait: \\
\hspace{1mm} \textbf{access to dn.regex="\textasciicircum (.+,)?dc=example,dc=com\$" by ...} \\
\hspace{1mm} Pour des raisons de performance, il est mieux d'écrire: \\
\hspace{1mm} \textbf{access to dn.subtree="dc=example,dc=com" by ...} \\
\hspace{1mm} En écrivant des règles submatch, il peut être préférable d'éviter l'utilisation de <dnstyle>: \\
\hspace{1mm} \textbf{access to dn.regex="\textasciicircum (.+,)?uid=([\textasciicircum ,]+),dc=example,dc=com\$"} \\
\hspace{1mm} \textbf{by dn.regex="\textasciicircum uid=\$2,dc=example,dc=com\$\$" write} \\
\hspace{1mm} \textbf{by ...} \\
\hspace{1mm} Cependant, c'est plus efficace: \\
\hspace{1mm} \textbf{access to dn.regex="\textasciicircum (.+,)?uid=([\textasciicircum ,]+),dc=example,dc=com\$"} \\
\hspace{1mm} \textbf{by dn.exact,expand="uid=\$2,dc=example,dc=com" write} \\
\hspace{1mm} \textbf{by ...} \\
\end{flushleft}
\end{document}
