% LaTeX2e
% `Verzeichnisdienste am Beispiel LDAP, Modul Betriebssysteme 2008'
% 29. Oktober 2008, Peter Schmid
% RCS-Id: $Id: ldap.tex,v 1.1 2008/10/31 08:22:35 pschmid Exp pschmid $

%\documentclass{beamer}
\documentclass[handout]{beamer}

\mode<presentation>
{
  \usetheme{Warsaw}

  \setbeamercovered{transparent}
}

\usepackage[german]{babel}
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage[T1]{fontenc}
\usepackage{alltt}

%\setbeameroption{show notes}

%---------------------------------------------------------------------

\title{Verzeichnisdienste am Beispiel LDAP}

\author{Peter Schmid}

\institute[HSZ-T] 
{
  Hochschule f"ur Technik Z"urich\\
  Studiengang Informatik
}

\date[modbs08]{29.10.2008}

\pgfdeclareimage[height=0.5cm]{university-logo}{fig/hsz-logo}
\logo{\pgfuseimage{university-logo}}

%---------------------------------------------------------------------

\begin{document}

\begin{frame}

  \titlepage

\end{frame}

% ---------------------------------------------------------------------

\begin{frame}{Outline}

  \tableofcontents
  % You might wish to add the option [pausesections]
\end{frame}

% ---------------------------------------------------------------------

\section{Einf"uhrung}

\subsection{Was ist ein Verzeichnisdienst?}
\begin{frame}
  \frametitle{Was ist ein Verzeichnisdienst (Directory Service)?}
  
  \begin{itemize}
  \item<1-> Telefonbuch/Telefonverzeichnis/Phone Directory
  \item<2-> Bekanntester Verzeichnisdienst ist DNS. Umwandlung von
    Hostnames in IP-Adressen und umgekehrt. Verteiltes System.
  \item<3-> LDAP ist lediglich das Protokoll zur Kommunikation
  \end{itemize}
\end{frame}

% ---------------------------------------------------------------------

\subsection{Geschichtlicher R"uckblick}

\begin{frame}
  \frametitle{Geschichtlicher R"uckblick}

  \begin{itemize}
  \item<1-> Verzeichnisse lokal, z.B. \texttt{/etc/passwd}, werden von Hand
    verteilt und synchronisiert.
  \item<2-> Zusammen mit NFS wird NIS 1986 eingef"uhrt (beruht auf RPCs,
    Client-Server Protokoll).
    \begin{itemize}
    \item<2-> \textbf{N}etwork \textbf{I}nformation \textbf{S}ervice, auch
      bekannt unter Yello Pages (YP)
    \item<2-> NIS ist flach organisiert, keine Replikation, unsicheres
      Protokoll, keine Zugriffsberechtigungen
    \end{itemize}
  \item<3-> NIS+
    \begin{itemize}
    \item<3-> Sun Microsystems 1993
    \item<3-> Hierarchisch, sicher (Secure RPC), Zugriffsberechtigungen,
      replizierbar.
    \item<3-> Kompliziert, blieb v.a. auf SUN beschr"ankt
    \end{itemize}
  \end{itemize}
  
\end{frame}


\begin{frame}
  \frametitle{Geschichtlicher R"uckblick, cont.}

  \begin{itemize}
  \item<1-> X.500
    \begin{itemize}
    \item<1-> 1990, ITU-T (vormals CCITT)
    \item<1-> Sehr umfangreicher Standard 
    \item<1-> Wurde nie komplett implementiert.
    \end{itemize}
  \item<2-> LDAP Lightweight Directory Access Protocol
    \begin{itemize}
    \item<2-> 1993, Universit"at von Michigan 
    \item<2-> Basiert auf X.500
    \item<2-> Stark vereinfacht, darum \emph{Lightweight}
    \end{itemize}
  \item<3-> Active Directory Service, AD aka ADS 
    \begin{itemize}
    \item<3-> 2000, Microsoft, zusammen mit Windows 2000 Server eingef"uhrt 
    \item<3-> Integriert Verzeichnisdienst ("ahnlich LDAP),
      Authentifizierung (Kerberos) und DNS.
    \end{itemize}
  \end{itemize}
  
\end{frame}

% ---------------------------------------------------------------------

\subsection{Wieso LDAP?}

\begin{frame}

  \frametitle{Wieso LDAP?}

  \begin{itemize}
  \item<1-> Schneller Lesezugriff: Durch seine nichtnormalisierte
    Datenspeicherung mit einem Lesezugriff auf ein ganzes Objekt.
  \item<2-> Verteilte Datenhaltung, Teile des DITs k"onnen auf
    verschiedenen Servern sein. Proxy m"oglich.
  \item<3-> Flexibles, voll objektorientiertes
    Datenmodell. Aenderungen m"oglich ohne bereits implementierte
    Funktionalit"at zu beeinflussen.
  \item<4-> Breite Anwendungsunterst"utzung,
    Industrie-de-facto-Standard f"ur Authentifizierung, Autorisierung
    und Benutzer- und Adressverzeichnisse.
  \end{itemize}
  
\end{frame}


% ---------------------------------------------------------------------

\section{Technische Details}


\subsection{Information Model}

\begin{frame}
  
  \frametitle{Information Model}
  
  \begin{itemize}
  \item<1-> Directory Information Tree (DIT)
  \item<2-> Hierarchischer Baum mit Wurzeln, Zweigen und Bl"attern.
  \item<3-> Die Wurzel (root, suffix) ist das oberste Datenobjekt,
    kann mehrere Wurzeln haben.
  \item<4-> Verzeichniseintr"age (entries) heissen LDAP-Objekte.
  \item<5-> Jedes Objekt geh"ort zu mindestens einer, in
    der Regel aber zu mehreren Klassen (Object Classes).
  \item<6-> Objekt-Klassen werden durch ihre Attribute bestimmt.
  \end{itemize}
\end{frame}

\begin{frame}
  
  \frametitle{Information Model, cont.}

  \begin{itemize}
  \item<1-> Die Definitionen von Objekt-Klassen und Attributen werden
    zu Schemas zusammengefasst.
  \item<2-> Attribute k"onnen obligatorisch (mandatory) oder optional sein.
  \item<3-> Objekte, die selbst Objekte enthalten, werden als
    \emph{Containerobjekte} bezeichnet.
  \item<4-> Die Enden des Baumes heissen \emph{Blattobjekte}.
  \item<5-> Jedes Objekt ist eigenst"andig und aus Attributen zusammengesetzt.
  \item<6-> Jedes Attribut eines Objekts hat einen bestimmten Typ und
    einen oder mehrere Werte.
  \end{itemize}
\end{frame}

\begin{frame}
  
  \frametitle{Directory Information Tree (DIT)}

  \pgfdeclareimage[width=11cm]{dit}{fig/dit} 
  \pgfuseimage{dit}

\end{frame}

% ---------------------------------------------------------------------

\subsection{Naming Model}

\begin{frame}

  \frametitle{Naming Model}

  \begin{itemize}
  \item<1-> Jeder Eintrag hat ein unique Attribut, dieses Attribut
    nennt man Relative Distinguished Names (\textbf{RDN}).
    \begin{itemize}
    \item<1-> Vergleichbar mit Filename.
    \item<1-> Kann aus mehreren Attributen bestehen.
    \item<1-> Beispiel: \texttt{cn=pschmid}
    \end{itemize}
  \item<2-> Den ganzen Pfad zum Eintrag nennt man Distinguished Name
    (\textbf{DN}).
    \begin{itemize}
    \item<2-> Entspricht dem Pfad und Filenamen im
      Filesystem.
    \item<2-> Reihenfolge ist aber umgekehrt (wie bei DNS, FQDN)
    \item<2-> Beispiel: \texttt{cn=pschmid,ou=group,dc=hsz-t,dc=ch}
    \end{itemize}
  \item<3-> Canonical Name, hat keine Attribut-Tags wie
    \texttt{ou}. 
    \begin{itemize}
    \item<3-> Umgekehrte Reihenfolge, Abtrennung durch Slashes.
    \item<3-> Beispiel: \texttt{hsz-t.ch/group/pschmid}
    \end{itemize}
  \end{itemize}

\end{frame}

% ---------------------------------------------------------------------

\subsection{LDIF}

\begin{frame}[fragile]
  
  \frametitle{LDIF}
  
  \begin{itemize}
  \item<1-> F"ur den Datenaustausch wird LDIF (LDAP Interchange Format)
    verwendet, RFC 2849.
  \item<2-> Es sind Plain-Text ASCII Files (7bit), f"ur andere Zeichen
    wird UTF-8 base-64 kodiert.
  \end{itemize}
  
  \begin{verbatim}
dn: uid=pschmid,ou=People, dc=hsz-t,dc=ch
loginShell: /bin/bash
givenName: Peter
sn: Schmid
cn: Peter Schmid
o:: SG9jaHNjaHVsZSBmw7xyIFRlY2huaWsgWsO8cmljaA==
ou: Informatikdienste
ou: aFuE
l:: WsO8cmljaA==
  \end{verbatim}
  
\end{frame}

% ---------------------------------------------------------------------

\subsection{Schema}

\begin{frame}[fragile]
  
  \frametitle{Objektklasse}
  
  \begin{itemize}
  \item<1-> Beispiel Definition der Objektklasse
    \texttt{swissEduPerson} der SwitchAAI.
  \item<2-> Bei diesem Beispiel gibt es keine Muss-Attribute
    (nur \texttt{MAY} kein \texttt{MUST}).
  \end{itemize}
  
\begin{scriptsize}
  \begin{verbatim}
objectClass ( SwissEduObjectClass:1
    NAME 'swissEduPerson'
    DESC 'Swiss eduPerson Object for use in e-Academia'
    SUP inetOrgPerson
        STRUCTURAL
    MAY ( swissEduPersonUniqueID $ swissEduPersonDateOfBirth $
          swissEduPersonGender $ swissEduPersonHomeOrganization $
          swissEduPersonHomeOrganizationType $ swissEduPersonStudyBranch1 $
          swissEduPersonStudyBranch2 $ swissEduPersonStudyBranch3 $
          swissEduPersonStudyLevel $ swissEduPersonStaffCategory $
          swissEduPersonMatriculationNumber $ eduPersonAffiliation $
          eduPersonOrgDN $ eduPersonOrgUnitDN $
          eduPersonEntitlement ) )
  \end{verbatim}
\end{scriptsize}  

\end{frame}


\begin{frame}[fragile]
  
  \frametitle{Attribut}
  
  \begin{itemize}
  \item<1-> Beispiel Definition des
    Attributs \texttt{swissEduPersonHomeOrganizationType}.
  \item<2-> Darf nur ein Wert enthalten \texttt{SINGLE-VALUE}.
  \item<3-> Beim Suchen wird Gross- und Kleinschreibung nicht
    unterschieden \texttt{EQUALITY caseIgnoreMatch}.
  \item<4-> Syntax wird "uber Object Identifiers (OIDs) bestimmt. IANA
    vergibt diese Nummern.
  \end{itemize}
  
\begin{scriptsize}
  \begin{verbatim}
attributetype ( SwissEduAttributeType:5
        NAME 'swissEduPersonHomeOrganizationType'
        DESC 'Type of the home organization'
        EQUALITY caseIgnoreMatch
        SINGLE-VALUE
        SYNTAX '1.3.6.1.4.1.1466.115.121.1.15' )
  \end{verbatim}
\end{scriptsize}  

\end{frame}




% ---------------------------------------------------------------------

\subsection{Tools}

\begin{frame}
  
  \frametitle{Tools}
  
  \begin{itemize}
  \item<1-> Standard Command Line Tools (CLI):
    \begin{itemize}
    \item<1->  ldapsearch
    \item<1->  ldapmodify, ldapadd, ldapdelete
    \end{itemize}
  \item<2-> Webbrowser wie Mozilla (nicht Firefox) oder den
    Internet-Explorer, die auch das LDAP Protokoll verstehen.\\
    Die URL sieht so aus:\\
    \tiny{\texttt{ldap://<host>:<port>/<node>?<attributes>?<base|one|sub>?<filter>}}\\
    Beispiel:\\
    \tiny{\texttt{ldap://ldap.hsz-t.ch:389/ou=People,dc=hsz-t,dc=ch?givenname,sn?one?(uid=*schmid*)}}
  \item<3-> GUIs: Sun Java System Server Console (Solaris), LDP (Windows)
  \item<4-> Webapplikationen wie z.B. phpLDAPadmin:
    \texttt{https://pubwww.hsz-t.ch/phpldapadmin/}
  \item<5-> Toolkits und APIs: PerLDAP, TCL Package LDAP, Java Naming
    and Directory Interface (JNDI) API
  \end{itemize}
  
\end{frame}


\begin{frame}[fragile]
  
  \frametitle{Suchen}
  
  \begin{itemize}
  \item<1-> Gross- und Kleinschreibung hat meistens keinen Einfluss
    (abh"angig von den Attributen, Matching Rules).
  \item<2-> Wichtigste Optionen von \texttt{ldapsearch}:\\
    \texttt{-h ldaphost -b searchbase -s base|one|sub filter [attrs...]}
  \end{itemize}
\begin{scriptsize}
\begin{verbatim}  
$ ldapsearch -h ldap.hsz-t.ch -b "dc=hsz-t,dc=ch" -s sub "uid=pschmid"
version: 1
dn: uid=pschmid,ou=People, dc=hsz-t,dc=ch
gecos: Peter Schmid
telephoneNumber: 043 268 2604
loginShell: /bin/bash
roomNumber: Zi117
...
\end{verbatim}
\end{scriptsize}

\end{frame}


\begin{frame}
  
  \frametitle{Suchfilter}
  
  \begin{itemize}
  \item<1-> Syntax ist in RFC 2254 beschrieben.
  \item<2-> Syntax \texttt{<filter>=(<attribute><operator><value>)} oder
    \texttt{(<operator><filter1><filter2>)}
  \end{itemize}
\begin{tabular}{|l|l|}
\hline
Logical operator  & Description                    \\
\hline
=                 & Equal to                       \\
\~{}=             & Approximately equal to         \\
<=                & Lexic. less than or equal to   \\
>=                & Lexic. greater than or equal to \\
\&                & AND                            \\
|                 & OR                             \\
!                 & NOT                            \\
\hline
\end{tabular}

\end{frame}


\begin{frame}
  
  \frametitle{Suchmusterbeispiele}

  \begin{itemize}
  \item Alle Objekte:\\
    \texttt{(objectClass=*)}
  \item Alle Benutzer Objekte ausser Ruedi:\\
    \texttt{(\& (objectCategory=person)(objectClass=user)}\\
    \texttt{(! cn=ruedi))}
  \item Alle Objekte die mit dem Vornamen sm starten:\\
    \texttt{(sn=sm*)} 
  \item Alle Kontakte mit dem Nachnamne Schmid oder Keller:\\
    \texttt{(\& (objectCategory=person)(objectClass=contact)}
    \texttt{(| (sn=Schmid)(sn=Keller)))}
  \end{itemize}

\end{frame}


\begin{frame}[fragile]
  
  \frametitle{Eingabe und L"oschen von Daten}

    \begin{itemize}
    \item Eingabe eines Objektes:\\
\begin{scriptsize}
\begin{verbatim}  
$ ldapadd -h ldap1.hsz-t.ch -D "cn=directory manager" 
dn: cn=pschmid,ou=group,dc=hsz-t,dc=ch
memberUid: pschmid
gidNumber: 1445
objectClass: posixGroup
objectClass: top
cn: pschmid
\end{verbatim}
\end{scriptsize}
    \item L"oschen eines Objektes:\\
\begin{scriptsize}
\begin{verbatim}  
$ ldapdelete -h ldap1.hsz-t.ch -D "cn=directory manager" \
"cn=pschmid,ou=group,dc=hsz-t,dc=ch"
\end{verbatim}
\end{scriptsize}
    \end{itemize}

\end{frame}

% ---------------------------------------------------------------------


\section{Sicherheit und Zuverl"assigkeit}

\begin{frame}
  \frametitle{Sicherheit und Zuverl"assigkeit}
  
  \begin{itemize}
  \item<1-> Bind, anonyme und Benutzer-Authentifizierung
  \item<2-> ACIs (Access Control Instructions)
  \item<3-> Replikation Multimaster
  \item<4-> Verschl"usselung "uber SSL
  \end{itemize}
  
\end{frame}

% ---------------------------------------------------------------------



\section{Beispiel HSZ-T}

\subsection{Wieso Sun Java System Directory Server?}


\begin{frame}
  \frametitle{Wieso Sun Java System Directory Server?}
  \begin{itemize}
  \item<1-> Multimaster Replikation "uber SSL (root-Zertifikat)
  \item<2-> Schema im DIT
  \item<3-> ACLs im DIT
  \item<4-> Nahtlose Integration in Solaris
  \item<5-> Hohe Sicherheit und Verf"ugbarkeit
  \end{itemize}
  
\end{frame}

% ---------------------------------------------------------------------

\subsection{Implementation}


\begin{frame}
  \frametitle{Implementation}
  
  \begin{itemize}
  \item<1-> Benutzerverwaltung POSIX f"ur UNIX/Linux.
  \item<2-> Gruppenverwaltung POSIX.
  \item<3-> Mailaliase f"ur MTA sendmail.
  \item<4-> Samba Benutzer, Gruppen und NT-Passw"orter.
  \item<5-> Autorisierung in Webapplikationen wie EBS, Wikis usw.
  \item<6-> Autorisierung f"ur SwitchAAI (Zugriff auf Ressourcen
    anderer Hochschulen).
  \end{itemize}
  
\end{frame}

% ---------------------------------------------------------------------


\end{document}
