\documentclass{beamer}

\usetheme{Warsaw}

\usepackage[italian]{babel}
\usepackage[utf8]{inputenc}
\usepackage{url}


\def\tild{\char'176}
\def\bslash{\char'134}

\setbeamercovered{transparent}

\title{LDAP: caratteristiche e funzionalità}
\author{Simone Piccardi}
\institute{Truelite Srl\\
Via Monferrato, 6 Firenze\\
\url{www.truelite.it}
}

\date{\today}

\logo{\includegraphics[height=0.5cm,keepaspectratio]{../images/logo.png}}

\begin{document}

\frame{\titlepage}

\section[Sommario]{}
\frame{\tableofcontents}

\section{LDAP}
\subsection{Panoramica}

\frame
{
  \frametitle{Cos'è LDAP}
  \begin{itemize}
  \item un protocollo di comunicazione, indipendente dalla piattaforma
    hardware e software, per interrogare un \textit{directory server}
  \item un derivato del protocollo DAP (X.500 OSI), considerato al tempo
    troppo complesso per la realizzazione su computer
  \item una rappresentazione di dati in forma di \textsl{directory} che
    consente ricerche generiche, ottimizzata per la velocità di risposta
  \end{itemize}
}

\frame
{
  \frametitle{Cos'è una \textit{directory}}

  \begin{itemize}
  \item un insieme di oggetti e relativi attributi organizzato
    gerarchicamente, in maniera analoga a file e directory di un filesystem 
  \item non è un database relazionale, gli oggetti possono avere un numero
    variabile di attributi e contenere più valori per lo stesso attributo
  \item un \textit{directory server} è ottimizzato per la velocità di risposta
    con un numero molto alto di ricerche rispetto al numero di aggiornamenti
  \end{itemize}
}

\frame
{
  \frametitle{Come è fatta una \textit{directory}}
  
  I dati sono organizzati in un albero (DIT):
  \begin{center}
  \includegraphics[width=6cm]{../ldap/images/geo_tree}
  \end{center}
}

\frame[containsverbatim]{
  \frametitle{Com'è fatto un oggetto}
  Un oggetto espresso in formato LDIF:
  \footnotesize
  \begin{verbatim}
    dn: uid=piccardi,ou=People,dc=truelite,dc=it
    cn: Simone Piccardi
    objectClass: account
    objectClass: posixAccount
    objectClass: top
    objectClass: shadowAccount
    loginShell: /bin/bash
    uidNumber: 1002
    gidNumber: 1002
    homeDirectory: /home/piccardi
    uid: piccardi
    description: IT Manager
    o: Truelite
    ou: sistemi
  \end{verbatim}
  \normalsize
\end{frame}


\frame
{
  \frametitle{Perché LDAP}

  \begin{itemize}
  \item un \textit{directory server} è ottimizzato per la velocità di risposta
    e per un rapporto molto alto fra ricerche e aggiornamenti
  \item consente una distribuzione dei dati su più server mantenendo una
    gerarchia unificata (analogo al DNS)
  \item l'organizzazione gerarchica (ad albero) dei dati e gli oggetti con un
    numero variabile di attributi e valori multipli possono risultare più
    conformi a certe esigenze
  \item la standardizzazione di alcuni tipi di dato rende più semplice la loro
    centralizzazione su LDAP rispetto ad un database relazionale.
  \end{itemize}
}

\frame[containsverbatim]
{
  \frametitle{Nomenclatura/1}
  \begin{itemize}
  \item[DIT] o \textit{data information tree}, la struttura ad albero su cui
    sono organizzati i dati di un albero LDAP
  \item[LDIF] o \textit{LDAP data interchange format}, formato testuale in cui
    posso essere rappresentati gli oggetti contenuti in un albero
  \item[DN] o \textit{disintinguished name}; è l'identificatore di un oggetto,
    costituito dalla base di ricerca e da un attributo dello stesso che lo
    renda unico rispetto a tutti gli oggetti sulla stessa base:
    \begin{verbatim}
       uid=piccardi,dc=truelite,dc=it
    \end{verbatim}
  \item[RDN] o \textit{relative disintinguished name} è l'attributo che
    identifica univocamente un oggetto rispetto ad una data base di ricerca:
%     (cioè in quella base non possono esservi due oggetti con valore identico
%     di quell'attributo):
    \begin{verbatim}
       uid=piccardi
    \end{verbatim}
  \end{itemize}
}


\frame
{
  \frametitle{Nomenclatura/2}
  \begin{itemize}
  \item[base] da solo rappresenta la radice dell'albero dei dati presenti su
    un \textit{directory server}, si chiama invece \textit{base di ricerca} il
    punto dell'albero dei dati da cui si fa iniziare la ricerca stessa
  \item[scope] o \textsl{profondità}, indica quanto scendere nell'albero
    nell'eseguire una ricerca, assume i valori \textsl{base}, che non scende
    oltre la base indicata, \textsl{one} che scende anche al livello
    successivo, \textsl{sub} che esamina tutta la parte di albero sottostante
  \item[filtro] una espressione che permette di eseguire una selezione (lato
    server) degli oggetti restituiti come risultati di una ricerca
  \item[schema] un file che contiene la definizione dei tipi di oggetti (le
    \textit{objectclass}) e dei relativi attributi (\textit{attributes}) da
    poter inserire nel \textit{directory server}
  \end{itemize}
}

\subsection{Il modello dei dati}

\frame
{
  \frametitle{Gli \textit{schema}}
  \begin{itemize}
  \item uno \textit{schema} definisce una o più classi di oggetti
    (\textit{objectclass}) che possono far parte di un DIT, specificando quale
    tipo di dati questi contengono (gli \textsl{attributi})
  \item ogni \textit{objectclass} ed ogni \textsl{attributo} hanno un nome che
    deve essere univocamente determinato a livello globale
  \item lo \textit{schema} definisce le modalità con cui si confrontano i
    valori degli attributi (es. \textit{case sensitive} o \textit{case
      insensitive})
  \end{itemize}
}


\frame
{
  \frametitle{Gli \textit{Object IDentifier} (OID)}
  \begin{itemize}
  \item ogni elemento di uno \textit{schema} (\textit{objectclass} o
    attributo) è identificato da un OID globalmente unico
  \item se si vuole creare uno \textit{schema} occorre farsi assegnare dalla
    IANA un OID, gratis all'indirizzo:
    \url{http://www.iana.org/cgi-bin/enterprise.pl}
  \item esiste la gerarchia di OID 1.1.x che è libera e può essere utilizzata
    per sperimentare propri \textit{schema}
  \end{itemize}
}

\frame { 
  \frametitle{Le caratteristiche delle \textit{objectclass}}
  \begin{itemize}
  \item sono gli elementi di uno \textit{schema} che definiscono attributi
    obbligatori e opzionali di un oggetto, sono identificate da un OID e da
    un nome
  \item un oggetto può appartenere a diverse \textit{objectclass}, ottenendo
    la ``somma'' degli attributi definiti dalle stesse
  \item si possono definire \textit{objectclass} derivate di una
    \textit{objectclass} di livello superiore, che ereditano gli attributi
    definiti da questa e ne definiscono di nuovi
  \end{itemize}
}

\frame[containsverbatim]
{
  \frametitle{Un esempio di \textit{objectclass}}
  La voce che definisce la classe \texttt{posixAccount}:
  \begin{center}
  \includegraphics[width=12cm]{../ldap/images/ObjectClass}
  \end{center}
}


\frame
{
  \frametitle{Le caratteristiche degli attributi}
  \begin{itemize}
  \item definiscono un tipo di dato membro di un oggetto, vengono identificati
    da un OID e da un nome
  \item a seconda di quanto specificato in una  \textit{objectclass} gli
    attributi possono essere obbligatori o opzionali
  \item un attributo può comparire una sola o più volte come membro di un
    oggetto
  \item al tipo di dato definito da un attributo si può associare un criterio
    di \textsl{corrispondenza} che indica come controllarne il valore
  \item ogni attributo per cui sia specificato un criterio di
    \textsl{corrispondenza} è soggetto alla relativa sintassi
  \end{itemize}
}


\frame
{
  \frametitle{Un esempio di attributo}
  La voce che definisce l'attributo \texttt{homeDirectory}
  \begin{center}
  \includegraphics[width=12cm]{../ldap/images/Attribute}
  \end{center}
}



\frame
{
  \frametitle{I tipi di \textit{objectclass}}
  \begin{itemize}
  \item \texttt{STRUCTURAL}: definisce le caratteristiche di base di un
    oggetto, che può appartenere ad una sola classe di questo tipo
  \item \texttt{AUXILIARY}: definisce degli attributi ulteriori di un oggetto,
    a supplemento di quelli di una classe \texttt{STRUCTURAL}; un oggetto può
    appartenere a più classi di questo tipo
  \item \texttt{ABSTRACT}: sono classi speciali usate soltanto per definire il
    modello di dati di LDAP, come \texttt{top} e \texttt{alias}
  \end{itemize}
}


\frame
{
  \frametitle{La strutturazione del DIT}
  \begin{itemize}
  \item ogni DIT deve avere una radice, la cosiddetta \textsl{base}
    dell'albero, che ogni DN dovrà contenere
  \item in genere si usa la stessa struttura dei nomi a dominio con gli
    oggetti di classe \texttt{domainComponent} (ad esempio
    \texttt{dc=truelite,dc=it})
  \item è possibile \textsl{partizionare} un DIT su più server attraverso il
    meccanismo dei \textit{referral}
  \end{itemize}
}

\frame{

  \frametitle{Il partizionamento}
  Esempio di partizionamento di un DIT su tre server:
  \begin{center}
  \includegraphics[width=5cm]{../ldap/images/partitioning}
  \end{center}
}


\frame
{
  \frametitle{Regole per il partizionamento}

  Si può eseguire il partizionamento solo suddividendo un DIT in vari rami di
  albero, vale a dire che:
  \begin{itemize}
  \item tutti gli oggetti posti in una partizione devono derivare da un
    antenato comune
  \item l'antenato comune deve essere presente nella partizione come radice
    della partizione stessa
  \end{itemize}
}



\frame[containsverbatim]
{
  \frametitle{Tipologie di riferimenti}

  Ci sono due tipi di \textsl{riferimenti} (\textit{referral}):
  \begin{itemize}
  \item riferimento \textsl{superiore}, quando si esegue una richiesta per un
    oggetto che sta al di sopra o fuori dall'ambito del DIT gestito dal server
    (a chi inviare la richiesta è specificato nella configurazione del server)
  \item riferimento \textit{inferiore}, quando si esegue una richiesta per un
    oggetto che è stato inserito in una partizione diversa, in tal caso viene
    usato un oggetto di tipo \textit{referral}:
    \footnotesize
    \begin{verbatim}
dn: ou=sistemi,dc=truelite,dc=it
objectClass: referral
objectClass: extensibleObject
dc: subtree
ref: ldaps://ldap2.truelite.it/ou=sistemi,dc=truelite,dc=it/
    \end{verbatim}
  \end{itemize}
}



\subsection{Il protocollo}

\frame
{
  \frametitle{LDAP come protocollo di rete}
  \begin{itemize}
  \item prevede la comunicazione fra un client ed un server con un protocollo
    standardizzato la prima volta dall'RFC~1777
  \item evolutosi attraverso diverse versioni, quella corrente è la terza
    (LDAPv3), solo applicazioni obsolete usano la precedente LDAPv2.
  \item gli è stata riservata la porta 389 per la comunicazione in chiaro e la
    porta 636 per la comunicazione su SSL
  \item sono definite le rispettive URL generalizzate
    \texttt{ldap://ldap.server.ex/} e \texttt{ldaps://ldap.server.ex/}
  \end{itemize}
}

% \frame
% {
%   \frametitle{LDAPv3 verso LDAPv2}
%   Tutte le versioni recenti di OpenLDAP supportano LDAPv3:
%   \begin{itemize}
%   \item migliori specificazioni per gli \textit{schema}
%   \item meccanismo di \textit{schema discovery} integrato
%   \item supporto per la cifratura con SSL/TLS
%   \item autenticazione con SASL
%   \end{itemize}
% }

\frame
{
  \frametitle{Le sessioni su LDAP}
  Una sessione di lavoro con LDAP è suddivisa in tre fasi
  \begin{itemize}
  \item apertura della connessione (e collegamento)
  \item esecuzione di una o più richieste
  \item chiusura della connessione
  \end{itemize}
}


\frame[containsverbatim]
{
  \frametitle{L'apertura della connessione}

  É suddivisa in due fasi distinte, eseguite in sequenza:
  \begin{itemize}
  \item \textsl{connessione al server}: può essere effettuata in chiaro, su
    SSL, e con TLS su una sessione in chiaro, ad esempio per SSL:
    \footnotesize
\begin{verbatim}
  ldapsearch -x -H ldaps://ldap.truelite.it
\end{verbatim}
    \normalsize
  \item \textsl{collegamento al server}: consiste nell'autenticazione presso
    il server, ad esempio: \footnotesize
\begin{verbatim}
  ldapsearch -x -D"cn=admin,dc=truelite,dc=it" -w pwdsegreta
\end{verbatim}
  \end{itemize}
  \footnotesize (il collegamento può essere anche fatto in forma anonima,
  eseguendolo senza inviare utente e password)
 

}


\frame[containsverbatim]
{
  \frametitle{Esecuzione delle richieste}
  \begin{itemize}
  \item il client invia una ricerca, specificando la base della stessa, un
    eventuale filtro, e quali attributi cercare; ad esempio: \footnotesize
\begin{verbatim}
  ldapsearch -x '(uid=piccardi)' homeDirectory loginShell
\end{verbatim}
    \normalsize 
  \item se non si specifica una base di ricerca viene usata la radice
    dell'albero
  \item il server restituisce i risultati corrispondenti al filtro di ricerca
    sempre una voce alla volta 
  \item vengono restituiti solo gli attributi accessibili all'utente per conto
    del quale si è eseguito il collegamento
  \end{itemize}
}


\frame
{
  \frametitle{Gestione della connessione}

  \begin{itemize}
  \item una volta stabilita, una connessione viene mantenuta attiva e può
    essere utilizzata per eseguire più ricerche (anche in maniera concorrente)

  \item in caso di più ricerche attive sulla stessa connessione i risultati
    vengono restituiti in maniera asincrona (ma restano associati a ciascuna
    ricerca)

  \item completate le operazioni la chiusura avviene in due fasi, lo
    \textsl{scollegamento} dal server (\texttt{unbind}) e la chiusura della
    connessione di rete
  \end{itemize}
}

\frame
{
  \frametitle{Struttura di una richiesta}
  Comprende sempre un filtro ed una lista di attributi:
  \begin{itemize}
  \item se non viene specificato nessun filtro il default è
    \texttt{(objectclass=*)} che indica tutti gli oggetti presenti nell'albero
  \item se non viene richiesto nessun attributo vengono restituiti tutti
    quelli leggibili (a seconda dei permessi assegnati all'utente con cui si è
    collegati)
  \item può essere indicata una profondità (\texttt{scope}) della ricerca
  \end{itemize}
}

\frame
{
  \frametitle{Struttura di un filtro}

  Sempre nella forma di una espressione fra parentesi tonde
  \begin{itemize}
  \item per gli attributi si possono usare le condizioni ``\texttt{=}'',
    ``\texttt{\tild=}'', ``\texttt{>=}'', ``\texttt{<=}'' posto che ci siano i
    rispettivi criteri di corrispondenza
  \item si può selezionare per tipo di oggetto invece che per valore degli
    attributi con \texttt{objectclass=nomeclasse}
  \item è supportato il carattere jolly ``\texttt{*}'' per i dati che
    prevedono valori in forma di stringhe
  \item più espressioni possono essere combinate con gli operatori
    ``\texttt{|}'' (OR), ``\texttt{\&}'' (AND) o negate con``\texttt{!}''
    (NOT).
  \end{itemize}
}

\frame
{
  \frametitle{Un esempio concreto}
  Una ricerca eseguita attraverso il programma \texttt{ldapsearch}:
  \begin{center}
  \includegraphics[width=12cm]{../ldap/images/ldapsearch}
  \end{center}
}


\subsection{Esempi di utilizzo}

\frame
{
  \frametitle{Rubrica centralizzata}

  Con la \textit{objectclass} \texttt{organizationalPerson} su può
  centralizzare un indirizzario con dati come:
  \begin{itemize}
  \item Nome e Cognome
  \item Istituzione
  \item Indirizzo e telefono
  \item email e homepage
  \end{itemize}
}


\frame
{
  \frametitle{Autenticazioni utenti Unix}
  
  Con le \textit{objectclass} \texttt{posixAccount}, \texttt{shadowAccount} e
  \texttt{posixGroup} per centralizzare i dati degli utenti e dei gruppi come:
  \begin{itemize}
  \item Username e UID
  \item Password (e relative informazioni di scadenza)
  \item Gruppi e GID
  \item Dati dell'account (home directory, shell, ...)
  \end{itemize}
}

\frame
{
  \frametitle{Autenticazioni utenti}
  
  Una volta inseriti gli i dati degli utenti unix su LDAP questi possono
  essere riusati anche per:
  \begin{itemize}
  \item Pagine web ad accesso autenticato (Apache)
  \item Autenticazione utenti per proxy web (Squid)
  \item Autenticazione utenti per IMAP/POP (Courier, Dovecot)
  \item Autenticazione utenti per RADIUS (FreeRadius)
  \item Autenticazione applicazioni web (Drupal, Wordpress, ecc.) 
  \end{itemize}
}

\frame
{
  \frametitle{Autenticazioni utenti Windows}
  
  Se alle precedenti per unix si aggiungono le \textit{objectclass}
  distribuite da Samba si possono autenticare in maniera centralizzata anche
  gli utenti Windows e gestire un PDC con informazioni come:
  \begin{itemize}
  \item Password in formato Windows (e relative informazioni)
  \item Macchine nel dominio
  \item Gruppi Windows
  \item Dati dell'account
  \end{itemize}
}


\frame
{
  \frametitle{Gestione centralizzata informazioni}
  
  Possono essere centralizzati su LDAP informazioni generiche, facendo
  riferimento a delle \textit{objectclass} specifiche:
  \begin{itemize}
  \item Domini e indirizzi di posta elettronica
  \item Dati delle zone di un dominio DNS
  \item Attributi di un KDC Kerberos
  \end{itemize}
  Ed in generale qualunque cosa sia definita in uno ``\textit{schema}''
  adeguato alle proprie esigenze.

 }





% \section{OpenLDAP}
% \subsection{Le basi}

% \frame
% {
%   \frametitle{}
%   \begin{itemize}
%   \item 
%   \item
%   \item 
%   \end{itemize}
% }

\frame
{
  \frametitle{Alcuni link interessanti}
  \begin{itemize}
  \item \url{http://www.openldap.org}
  \item \url{http://labs.truelite.it/truedoc}
  \item \url{http://www.wikipedia.org/wiki/LDAP}
  \end{itemize}
}



\end{document}
