\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. oct. 20 16:39:23 CEST 2013}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={slapd-meta},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={Backend meta},
CreationDate={D:20131020163923},
ModDate={D:20131020163923},
Keywords={LDAP;OpenLDAP;Lightweight Directory Access Protocol}
}}
\begin{document}
 
\begin{center}
{\Huge slapd-meta }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large Backend meta}
 
\vspace{10mm}
 
\hspace{1mm}  Effectue un proxy LDAP en respectant un jeu de serveurs LDAP distant, appelés target. Les informations contenues par ces serveurs peuvent être présentés comme appartenant à un simple DIT. Il a été conçu comme un amélioration de slapd-ldap. Ces 2 backends partagent de nombreuses fonctionnalités. L'instance proxy doit contenir le schéma pour les attributs et objectClass utilisés dans les filtres. Il doit également avoir le schéma pour les données retournées par les serveurs proxifiés
\vspace{5mm} \\
 
 
\vspace{1cm}{\huge Directives de configuration spécial }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} conn-ttl <time>]{Force la suppression d'une connexion en cache et la recrée après le ttl donné, sans regarder s'il elle est active ou non.}
\item[\hspace{1mm} default-target none]{Force le backend à rejeter toutes les opérations qui doivent être résolues à un simple target dans le cas ou aucun ou plusieurs target sont sélectionnés. Cette directive permet également de marquer un target spécifique comme défaut.}
\item[\hspace{1mm} dncache-ttl \{DISABLED|forever|<ttl>\}]{Définis le TTL du cache de DN. (0 désactive le cache)}
\item[\hspace{1mm} onerr \{CONTINUE|report|stop\}]{Mode en cas d'erreur retournée par une target durant un recherche. Continue, continue la recherche et tente de retourner le plus de données possible. Stop, stop la recherche et retourne une erreur. report, la recherche se poursuit mais si une target retourne une erreur, le premier code d'erreur retourné est envoyé au client.}
\item[\hspace{1mm} norefs <NO|yes>]{à yes, ne retourne pas de référence de recherche}
\item[\hspace{1mm} noundeffilter <NO|yes>]{à yes, retourne success au lieu de rechercher si un filtre est indéfinis ou contient des portions indéfinies. Par défaut, la recherche est propagée après avoir remplacée les portions indéfinies avec (!(objectClass=*)), qui correspond à un résultat vide.}
\item[\hspace{1mm} protocol-version \{0,2,3\}]{Indique quel protocole utiliser pour contacter le serveur distant (0, le protocole utilisé est le même que celui utilisé par le client)}
\item[\hspace{1mm} pseudoroot-bind-defer \{YES|no\}]{à yes, l'authentification sur le serveur distant avec une identité pseudo-root (idassert-bind) est déférée jusqu'à ce qu'il soit nécessaire. Sinon, tous les binds root sont propagés aux target.}
\item[\hspace{1mm} quarantine <interval>,<num>\texttt{[} ;<interval>,<num>\texttt{[}...\texttt{]}\texttt{]}]{Met en quarantaine les URI qui ont retourné LDAP\_UNAVAILABLE. retente seulement à interval seconde depuis la dernière tentative, pour exactement num fois ; puis utilise le prochain pattern. si num vaut +, retente indéfiniment.}
\item[\hspace{1mm} rebind-as-user \{NO|yes\}]{à yes, les crédentials du client sont mémorisés pour rebind, en tentant de re-établir une connexion perdue, ou lors de la poursuite d'aiguillage si chase-referrals est à yes.}
\item[\hspace{1mm} session-tracking-request \{NO|yes\}]{Ajoute un contrôle de traçage de session pour toutes les requêtes. l'IP/hostname du client et l'identité associée à chaque requête sont envoyés au serveur distant pour information. Est incompatible avec protocol-version 2.}
\item[\hspace{1mm} single-conn \{NO|yes\}]{Annule toute connexion en cache si le client se rebind}
\item[\hspace{1mm} use-temporary-conn \{NO|yes\}]{Créé une connexion temporaire en compétition avec d'autres threads pour une connexion partagée. Sinon, attend jusqu'à ce qu'une connexion partagée soit disponible.}
\end{description}
 
\vspace{1cm}{\huge Spécification de target }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} uri <protocol>://\texttt{[}<host>\texttt{]}/<naming context> \texttt{[}...\texttt{]}]{naming context est mandatoire pour la première uri, et omis pour les autres}
\item[\hspace{1mm} acl-authcDN <administrative DN for access control purposes>]{DN utilisé pour requêter le serveur distant pour vérifier les ACL. Doit avoir les accès read sur le serveur cible sur les attributs utilisés dans le proxy pour la vérification des acl.}
\item[\hspace{1mm} acl-passwd <password>]{Mot de passe utilisé avec acl-authcDN}
\item[\hspace{1mm} bind-timeout <microseconds>]{Timeout en micro-secondes, utilisé lors du vote pour la réponse après une connexion bind asynchrone. L'appel initial à ldap\_result(3) est effectué avec un timeout de 100000us. Si le résultat excède ce timeout, les appels suivants utilisent la valeur de bind-timeout.}
\item[\hspace{1mm} chase-referrals \textbf{YES|no}]{Active/désactive le repérage de référence automatique, qui est déléguée à libldap, avec un rebinding éventuel si la directive rebind-as-user est utilisée. défaut: yes}
\item[\hspace{1mm} client-pr \{accept-unsolicited|DISABLE|<size>\}]{Permet d'utiliser le contrôle paged result en requêtant un target. Le client n'est pas soumis à ce contrôle.}
\item[\hspace{1mm} default-target \texttt{[}<target>\texttt{]}]{Sans argument, indique que le target courant est le défaut. target est un numéro du target par défaut.}
\item[\hspace{1mm} filter <pattern>]{regex pour indiquer quels termes de filtre de recherche sont servis par le target.}
\item[\hspace{1mm} idassert-authzFrom <authz-regexp>]{Sélectionne quels identités local sont autorisées à exploiter la fonctionnalité d'assertion d'identité. l'expressions suit la règle définis pour authzFrom}
\item[\hspace{1mm} idassert-bind bindmethod=none|simple|sasl \texttt{[}binddn=<simpleDN>\texttt{]} \texttt{[}credentials=<simple password>\texttt{]}]{}
\item[\hspace{1mm} \texttt{[}saslmech=<SASL mech>\texttt{]} \texttt{[}secprops=<properties>\texttt{]} \texttt{[}realm=<realm>\texttt{]} \texttt{[}authcId=<authenticationID>\texttt{]}]{}
\item[\hspace{1mm} \texttt{[}authzId=<authorization ID>\texttt{]} \texttt{[}authz=native|proxyauthz\texttt{]} \texttt{[}mode=<mode>\texttt{]} \texttt{[}flags=<flags>\texttt{]} \texttt{[}starttls=no|yes|critical\texttt{]}]{}
\item[\hspace{1mm} \texttt{[}tls\_cert=<file>\texttt{]} \texttt{[}tls\_key=<file>\texttt{]} \texttt{[}tls\_cacert=<file>\texttt{]} \texttt{[}tls\_cacertdir=<path>\texttt{]} \texttt{[}tls\_reqcert=never|allow|try|demand\texttt{]}]{}
\item[\hspace{1mm} \texttt{[}tls\_ciphersuite=<ciphers>\texttt{]} \texttt{[}tls\_protocol\_min=<version>\texttt{]} \texttt{[}tls\_crlcheck=none|peer|all\texttt{]}]{Permet de définir les paramètres de la méthode d'authentification utilisée en interne par le proxy pour autoriser les connexions qui sont authentifiées par d'autres bases de données. L'identité définie doit avoir l'accès auth sur le serveur cible sur les attributs utilisés et doit avoir le droit d'authoriser d'autres users (proxyAuth sur tout le DN, ex : authzTo=dn.subtree :"") et le serveur distant doit avoir authz-policy mis à to ou both.}
\item[\hspace{1mm} <mode> := \{legacy|anonymous|none|self\}]{legacy implique que le proxy va effectuer un simple bind (authcDN) ou SASL (authcID) et assert l'identité du client quand il n'est pas anonyme. Anonymous et self, assert une chaîne vide ou l'identité du client, respectivement.}
\item[\hspace{1mm} <flag> := \{override|\texttt{[}non-\texttt{]}prescriptive|proxy-authz-\texttt{[}non-\texttt{]}critical\}]{override, l'assertion de l'identité prend place même quand la base est autorisée pour l'identité du client. Quand prescriptive est utilisé, les opérations échouent avec inappropriateAuthentication pour les identités dont l'assertion n'est pas permise par le motif idassert-authzFrom. non-prescriptive, les opérations sont effectuées anonymement pour les identité dont l'assertion n'est pas permise par le pattern idassert-authzFrom. proxy-authz-non-critical, le contrôle proxyAuthz contrôle n'est pas marqué comme critique, en violation de la RFC 4370. il est recommandé d'utiliser proxy-authz-critical}
\item[\hspace{1mm} idle-timeout <time>]{Force une connexion en cache à être supprimée puis recrée après une timeout}
\item[\hspace{1mm} keepalive <idle>:<probes>:<interval>]{Définis les valeurs de idle, probes et interval utilisés pour cérifier si un socket est actif. idle est le nombre de seconde avant qu'une connexion non-active reçoive un keepalive. probes et le nombre maximum de keepalive, et interval est le nombre de seconde entre chaque keepalive.}
\item[\hspace{1mm} map \{attribute|objectclass <local name> <foreign name>|*\}]{Map des classes d'objet et des attributs comme dans le backend ldap}
\item[\hspace{1mm} network-timeout <time>]{Définis la valeur timeout réseau après que poll(2)/select(2) suivant un retour connect(2) en cas d'inactivité, en seconde}
\item[\hspace{1mm} nretries \{forever|never|<nretries>\}]{Définis le nombre de fois qu'un bind doit être retenté en cas d'échec temporaire. (défaut : 3)}
\item[\hspace{1mm} rewrite*...]{Permet de réecrire des requêtes}
\item[\hspace{1mm} subtree-\{exclude|include\} <rule>]{Permet d'indiquer quels subtrees sont actuellement servis par un target. Peut être spécifié plusieurs fois. les syntaxes supportées sont:}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{6mm} <rule>: \texttt{[}dn\texttt{[}.<style>\texttt{]}:\texttt{]}<pattern>]{}
\item[\hspace{6mm} <style>: subtree|children|regex]{style est soit subtree, children ou un regexp. pattern est un DN qui doit être dans le contexte de nommage servis par le target, ou un regex si style vaut regex. Si dn.<style> est omis, dn.subtree est implicite}
\item[\hspace{6mm} ]{Dans la forme subtree-exclude, si le DN demandé match au moins une règle, la cible n'est pas considérée pour remplir la requête.}
\item[\hspace{6mm} ]{Dans la forme subtree-include, si le DN demandé match au moins une règle, la cible est considérée basée sur la valeur du request DN.}
\end{description}
 
\begin{description} \normalsize
\item[\hspace{1mm} suffixmassage <virtual naming context> <real naming context>]{Toutes les directives commençant par "rewrite" obsolète par slapo-rwm.}
\item[\hspace{1mm} t-f-support \{NO|yes|discover\}]{Permet le support des filtres absolus des serveur distant}
\item[\hspace{1mm} timeout \texttt{[}<op>=\texttt{]}<val> \texttt{[}...\texttt{]}]{Définis un timeout par opération. Les opérations peuvent être : <op> ::= bind, add, delete, modrdn, modify, compare, search}
\item[\hspace{1mm} tls \{\texttt{[}try-\texttt{]}start|\texttt{[}try-\texttt{]}propagate\}]{Exécute StartTls quand la connexion est initialisée. Ne fonctionne qu'avec ldaps://}
\end{description}
 
\vspace{1cm}{\huge scénarios }
 
\
 
\hspace{1mm} 1. 2 serveurs partagent 2 niveaux de contexte de nommage, "dc=a,dc=foo,dc=com" et "dc=b,dc=foo,dc=com". Un meta annuaire peut être configuré comme: \\
\hspace{1mm} \textbf{database meta} \\
\hspace{1mm} \textbf{suffix "dc=foo,dc=com"} \\
\hspace{1mm} \textbf{uri "ldap://a.foo.com/dc=a,dc=foo,dc=com"} \\
\hspace{1mm} \textbf{uri "ldap://b.foo.com/dc=b,dc=foo,dc=com"} \\
\hspace{1mm} Les opérations dirigées vers un target spécifique peuvent facilement être résolus parce qu'il n'y pas d'ambiguïté. La seule opération qui peut résoudre plusieurs target est une recherche avec une base "dc=foo,dc=com". qui résulte de 2 recherches dans les targets. \\
 
\hspace{1mm} 2. 2 serveurs ne partagent aucune portion du contexte de nommage, mais ils se présentent en un simple DIT. "dc=bar,dc=org" et "o=Foo,c=US" qui apparaissent comme des branches de "dc=foo,dc=com", disons "dc=a,dc=foo,dc=com" et "dc=b,dc=foo,dc=com". On doit configurer le backend meta comme suit: \\
\hspace{1mm} \textbf{database meta} \\
\hspace{1mm} \textbf{suffix "dc=foo,dc=com"} \\
\hspace{1mm} \textbf{uri "ldap ://a.bar.com/dc=a,dc=foo,dc=com"} \\
\hspace{1mm} \textbf{suffixmassage "dc=a,dc=foo,dc=com" "dc=bar,dc=org"} \\
\hspace{1mm} \textbf{uri "ldap ://b.foo.com/dc=b,dc=foo,dc=com"} \\
\hspace{1mm} \textbf{suffixmassage "dc=b,dc=foo,dc=com" "o=Foo,c=US"} \\
\hspace{1mm} De même, les opérations peuvent être résolus sans ambiguïté, bien qu'une réécriture soit requise. Noter que le contexte de nommage de chaque cible est une branche du contexte de nommage de la base. lors d'une recherche avec la base "dc=foo,dc=com" et un scope base, une erreur no such object est générée. Si le scope est one, les 2 targets sont contactés. \\
 
\hspace{1mm} 3. En utilisant le scénario précédent avec 2 serveurs partageant le même contexte de nommage: \\
\hspace{1mm} \textbf{database meta} \\
\hspace{1mm} \textbf{suffix "dc=foo,dc=com"} \\
\hspace{1mm} \textbf{uri "ldap ://a.bar.com/dc=foo,dc=com"} \\
\hspace{1mm} \textbf{suffixmassage "dc=foo,dc=com" "dc=bar,dc=org"} \\
\hspace{1mm} \textbf{uri "ldap ://b.foo.com/dc=foo,dc=com"} \\
\hspace{1mm} \textbf{suffixmassage "dc=foo,dc=com" "o=Foo,c=US"} \\
\hspace{1mm} Toutes les considérations précédente sont maintenues, excepté que maintenant il n'y a plus d'ambiguïté pour résoudre un DN \\
 
\vspace{1cm}{\huge ACL }
 
\
 
\hspace{1mm}  Vous pouvez ajouter toutes les ACL au backend meta. Cependant, la signification d'un ACL sur un proxy peut nécessiter certaines considérations.
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} -]{Le serveur distant dicte les permissions ; le proxy passe simplement ce qu'il reçoit au serveur distant}
\item[\hspace{1mm} -]{Le serveur distant dévoile tout, le proxy est responsable de la protection des accès non autorisés.}
\end{description}
 
\vspace{1cm}{\huge rewriting }
 
\
 
\hspace{1mm}  La syntaxe et le fonctionnement est le même que slapo-rwm
\vspace{5mm} \\
 
\end{flushleft}
\end{document}
