%compilé avec rubber ("rubber --pdf LDAP_2011.pdf")

\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\usepackage{graphicx}
\usepackage{pstricks}
\usepackage{tikz}
\usepackage{alltt}
\usetikzlibrary{automata}
\usetikzlibrary{positioning}

\usetheme{Warsaw}
\usecolortheme{dolphin}
\usepackage{palatino}
\setbeamercovered{transparent}
%\setbeamercolor{section in head/foot}{use=structure,bg=structure.fg!25!bg}
%\useoutertheme[subsection=false,footline=authortitle]{miniframes}
\setbeamertemplate{frametitle}[default]
\logo{\includegraphics[width=2cm]{images/logoCrans.png}}
\definecolor{dark_green}{RGB}{0,128,0}
%\setbeamertemplate{background}{%
%\begin{pspicture}
% \put(1.5,9.8){\includegraphics[width=7cm]{images/fondSwitchs.png}}
%\end{pspicture}}

\author{Aurore Moisy-Mabille}
\institute{encadrant : Nicolas Dandrimont\\Cr@ns}
\title{La base LDAP}


\begin{document}
\begin{frame}
 \maketitle
\end{frame}


\begin{frame}
 \frametitle{Introduction}

Stockage des données aux Cr@ns 
 
\begin{itemize}[<+->]
 \item Fichiers plats~: gérable pour un serveur, pas pour 20
 \item Base de données classique (SGBDR)~: Pratique pour le stockage de données, mais peu d'interfaçage avec les applications
 \item LDAP~: le choix le plus simple, on va voir pourquoi.
\end{itemize}

\end{frame}


\begin{frame}
 \frametitle{Introduction}

LDAP ?
 
\begin{itemize}
  \item L~: Lightweight
  \item D~: Directory
  \item A~: Access
  \item P~: Protocol
\end{itemize}

\end{frame}


\section{Fonctionnement général}

\subsection{Structure}


\begin{frame}
 \frametitle{Structure}
 \begin{itemize}
  \item Constituée de champs : nom du champ : contenu
  \pause
  \item Champs de base :
   \begin{itemize}
    \item le dn (Distinguished Name) doit être unique et identifie l’entrée
    \item le(s) type(s) d’objet : objectClass
   \end{itemize}
  \pause
  \item Les autres champs possibles et obligatoires sont définis par le type d’objet.
 \end{itemize}

\end{frame}

\begin{frame}
 \frametitle{Distinguished Name et Structure}
 \begin{itemize}[<+->]
  \item le dn est constitué de champs séparés par des virgules
  \item le premier champ doit faire parti de l’entrée correspondante
  \item les dn permettent de constituer un arbre avec la base
 \end{itemize}

\end{frame}


\begin{frame}

 \frametitle{Organisation de l'annuaire}

Fortement hiérarchique, comme on le voit ici~:
\tiny{
\begin{tikzpicture}[->,>=stealth,shorten >=1pt,auto,on grid,node distance=0.3cm, semithick, every state/.style={shape=rectangle,fill=none,draw=none,text=black}]

\node[state] (root) {dc=crans,dc=org};
\node[state] (data) [below=of root.south] {ou=data,dc=crans,dc=org};
\node[state] (group) [left=of data.west] {ou=Group,dc=crans,dc=org};
\node[state] (postfix) [right=of data.east] {cn=postfix,dc=crans,dc=org};
\node[state] (toto) [below=of data.south] {aid=1948,ou=data,dc=crans,dc=org};
\node[state] (adm) [left=of toto.west] {cn=adm,ou=Group,dc=crans,dc=org};
\node[state] (gastin) [below=of toto.south] {mid=14,aid=1948,ou=data,dc=crans,dc=org};

\path[->] (root) edge node {} (group)
          (root) edge node {} (data)
          (root) edge node {} (postfix)
          (group) edge node {} (adm)
          (data) edge node {} (toto)
          (toto) edge node {} (gastin);

\end{tikzpicture}
}
\end{frame}


\subsection{Schéma}

\begin{frame}[fragile]
 \frametitle{Schéma de la base}
 \begin{itemize}[<+->]
  \item Chaque objet a une ou plusieurs \texttt{objectClass}es
  \item Schéma~: définition des attributs de chaque \texttt{objectClass}
  \item []
\begin{semiverbatim}
{\tiny
objectclass ( 1.3.6.1.4.1.25368.3.2 NAME {\color{red}'adherent'} SUP {\color{green}proprio}
    DESC {\color{red}'Adhérent'}
    MUST ( {\color{blue}aid} $ {\color{blue}prenom} $ {\color{blue}tel} $ {\color{blue}mail} )
    MAY ( {\color{blue}carteEtudiant} $ {\color{blue}etudes} $ {\color{blue}postalAddress} $ {\color{blue}mailInvalide} $ {\color{blue}charteMA} $ 
          {\color{blue}adherentPayant} $ {\color{blue}typeAdhesion} $  {\color{blue}carteRFID} ) )
}
\end{semiverbatim}
 \end{itemize}
\end{frame}

\begin{frame}[fragile]
 \frametitle{Définition des attributs}
 \begin{itemize}[<+->]
  \item Chaque attribut a un nom, un type
  \item[]
\begin{semiverbatim}
{\tiny
attributetype ( 1.3.6.1.4.1.25368.2.10 NAME {\color{red}'chbre'}
    DESC {\color{red}'Chambre adhérent'}
    EQUALITY {\color{blue}caseIgnoreMatch}
    SUBSTR {\color{blue}caseIgnoreSubstringsMatch}
    SYNTAX {\color{red}1.3.6.1.4.1.1466.115.121.1.44\{16\}} {\color{green}SINGLE-VALUE} )
}
\end{semiverbatim}
  \item \texttt{/etc/ldap/schema/crans.schema}
 \end{itemize}
\end{frame}


\subsection{Sécurité}

\begin{frame}
 \frametitle{Sécurité des données}
 \begin{itemize}[<+->]
  \item Réplicas sur \texttt{sable}, \texttt{radius}, \texttt{ovh}, \texttt{vo} (base de tests)
  \item Transit des données uniquement sur le vlan adm ou par une socket Unix
  \item Accès à seulement certains attributs et à certaines opération...
 \end{itemize}
\end{frame}

\begin{frame}
 \frametitle{Listes d'accès}
 \begin{itemize}[<+->]
  \item Accès à la base en lecture seule~: attributs «~publics~» - connexion sous le dn \texttt{cn=readonly,dc=crans,dc=org}
  \item Accès tous ses propres attributs en lecture
  \item Accès à tous les attributs en lecture pour la réplication \texttt{cn=replica,dc=crans,dc=org}
  \item Accès en lecture/écriture à certains attributs pour certaines applications spécifiques...
  \item Défini dans \texttt{/etc/ldap/slapd.conf}
 \end{itemize}
\end{frame}


\subsection{Performances}

\begin{frame}
 \frametitle{Performances}
 \begin{itemize}[<+->]
  \item Les objets de la base sont stockés dans des fichiers \texttt{BDB (Berkley DB)}
  \item La recherche dans ces fichiers est lente...
  \item ...mais on peut les indexer...
  \item ...ce qui \emph{peut} ralentir le serveur lors des écritures
  \item Les attributs de recherche principaux sont indexés pour les recherches typiques (cf \texttt{/etc/ldap/slapd.conf})
 \end{itemize}
\end{frame}



\section{Les applications utilisant directement LDAP}


\subsection{NIS}

\begin{frame}
 \frametitle{NSS}
% \begin{itemize}[<+->]
%  \item Sous UNIX, base de données d'informations système (Network Information Service)
%  \item Permet d'associer un host à une ip...
%  \item \texttt{libnss-ldap(d)} : mapper les recherches dans NIS à des recherches dans la base LDAP, sous Linux (à l’aide de NSS, système de modules pour NIS).
%  \item Accès en \texttt{cn=readonly,dc=crans,dc=org}.
% \end{itemize}
\end{frame}


\subsection{PAM}

\begin{frame}
 \frametitle{PAM}
 \begin{itemize}[<+->]
  \item Sous Linux (ou *BSD), modules d'authentification «~branchables~» (Pluggable Authentication Modules)
  \item Permet d'identifier -quelque chose- (le plus souvent un utilisateur) à l'aide d'un mot de passe, d'une empreinte digitale, ...
  \item \texttt{pam-ldap}~: mapper les requêtes d'authentification PAM avec une authentification LDAP.
  \item Accès en \texttt{cn=readonly,dc=crans,dc=org}.
 \end{itemize}
\end{frame}


\subsection{Postfix}

\begin{frame}
 \frametitle{Postfix}
 \begin{itemize}[<+->]
  \item Gère la réception des mails
  \item Postfix va faire certaines requêtes directement dans la base LDAP
  \item Existence d'un utilisateur
  \item Conversion des alias
  \item Contournement de greylist
  \item Réécriture des entêtes
  \item Accès en \texttt{cn=postfix,dc=crans,dc=org}
 \end{itemize}
\end{frame}

\subsection{Dovecot}
\begin{frame}
 \frametitle{Dovecot et LDAP}
 \begin{itemize}[<+->]
  \item Logiciel de POP/IMAP
  \item Le serveur POP/IMAP fait ses requêtes directement à la base LDAP
  \item Existence/Authentification d'un utilisateur
  \item ...
  \item Accès en \texttt{cn=dovecot,dc=crans,dc=org}
 \end{itemize}
\end{frame}



\section{Le reste... Python et Crans\_LDAP}


\subsection{Accès direct à la base}

\begin{frame}
 \frametitle{Accès direct à la base}
Requêtes à la base de données via LDAP :
 \begin{itemize}
\pause
  \item Bind : Établit la connexion avec la base.
\pause
  \item Add : Ajoute une nouvelle entrée dans la base.
\pause
  \item Modify : Modifie une entrée dans la base.
\pause
  \item Delete : Supprime une entrée dans la base.
\pause
  \item Search : Recherche une valeur et en renvoie les occurrences.
\pause
  \item Abandon : Abandonne l'opération en cours.
\pause
  \item Unbind : Clôture la connexion à la base.
 \end{itemize}
\pause
Le protocole LDAP est limité (pas de jointures).\\
\pause
Les données doivent être vérifiées avant d'être insérées dans la base.
\end{frame}


\subsection{Accès haut-niveau}

\begin{frame}
 \frametitle{Accès haut-niveau}
 \begin{itemize}[<+->]
  \item Utilisation de Python, puissant et facile d'accès
  \item Abstraction totale du protocole LDAP à travers le modèle objet Python
  \item Recherches simplifiées dans la base, jointures, ...
  \item Vérification des données avant l'insertion dans la base de données
 \end{itemize}
\end{frame}

\begin{frame}[fragile]
 \frametitle{Recherche dans la base}
\begin{semiverbatim}
{\tiny
{\color{dark_green}In [41]:} import ldap_crans_test

{\color{dark_green}In [42]:} db = ldap_crans_test.crans_ldap()

{\color{dark_green}In [43]:} resultat = db.search('nom=moisy-mabille & prenom=Aurore')

{\color{dark_green}In [44]:} resultat
{\color{red}Out[44]:}
\{'adherent': [<ldap_crans_test.Adherent instance at 0x2a90248>],
 'borneWifi': [],
 'club': [],
 'facture': [],
 'machine': [],
 'machineCrans': [],
 'machineFixe': [],
 'machineWifi': []\}

{\color{dark_green}In [45]:} adh=resultat['adherent'][0]

{\color{dark_green}In [46]:} adh.alias()
{\color{red}Out[46]:} [u'zelda', u'zeldaurore']
}
\end{semiverbatim}
\end{frame}

\begin{frame}[fragile]
 \frametitle{Écriture dans la base}
\begin{semiverbatim}
{\tiny
{\color{dark_green}In [47]:} resultat = db.search('nom=moisy-mabille & prenom=Aurore', 'w')

{\color{dark_green}In [48]:} adh=resultat['adherent'][0]

{\color{dark_green}In [49]:} adh.tel('0605619481')
{\color{red}Out[49]:} '0605619481' '0605619481'

{\color{dark_green}In [50]:} adh.save()
{\color{red}Out[50]:} '0605619481' u'\\x1b[1;32mModification Aurore Moisy-mabille effectu\\xe9e
avec succ\\xe8s.\\x1b[1;0m'
}
\end{semiverbatim}
\end{frame}

\begin{frame}[fragile]
 \frametitle{Création d'un nouvel adhérent}
\begin{semiverbatim}
{\tiny
{\color{dark_green}In [51]:} nouvel_adh=ldap_crans_test.Adherent()

{\color{dark_green}In [52]:} nouvel_adh.nom('Passoire')
{\color{red}Out[52]:} 'Passoire'

{\color{dark_green}In [53]:} nouvel_adh.prenom('Toto')
{\color{red}Out[53]:} 'Toto'

{\color{dark_green}In [54]:} nouvel_adh.chbre('EXT')
{\color{red}Out[54]:} 'EXT'

{\color{dark_green}In [55]:} nouvel_adh.mail('popol@fatzorzdptinfo.ens-cachan.fr')
{\color{red}Out[55]:} 'popol@fatzorzdptinfo.ens-cachan.fr'

{\color{dark_green}In [56]:} nouvel_adh.tel('1337421337')
{\color{red}Out[56]:} '1337421337'

{\color{dark_green}In [57]:} nouvel_adh.save()
}
\end{semiverbatim}
\end{frame}


\begin{frame}
 \frametitle{Questions ?}
\end{frame}

\end{document}
