\chapter{openLDAP}
\section{Introducción,¿Que es LDAP?}
\subsection{Servicios de Directorios, X.500}

Un directorio es una base de datos especializada en busqueda de información basada en atributos.\\

X.500|ISO 9594\cite{x500} es un estándar de ITU-S(International Telecommunication Union - Telecommunication Standardisation Burean), anteriormente conocido como CCITT, para solucionar el problema de directorios. Basado en los trabajos realizados con X.400 (un directorio para correo electrónico) y los trabajos de ISO ( International Standards Organisation) y ECMA (European Computer Manufacturers Association).\\

El X.501|ISO 9594 parte 2. define los modelos de como debe estar organizada la información, el modelo de información de usuario, el modelo de información administrativa y el servicio de directorio, que define como debe estar distribuida la información entre varios sistemas.\\

En X.509|ISO 9594 parte 8. el estándar de autentificación y seguridad usado para SSL.\\

X.525|ISO 9594 parte 9. indica como debe ser la replicación entre sistemas.\\

En X.519|ISO 9594 parte 5. se definen los protocolos de comunicaciones, entre ellos el que mas nos importa que es DAP - El protocolo de acceso a directorios - que define que operaciones se pueden hacer con la conexión: bind, unbind, los objetos (entradas) y sus operaciones: añadir, eliminar, modificar, buscar, listar, comparar, etc.\\

DAP es un protocolo demasiado complejo para que se puedan hacer servidores y clientes para su uso para Internet, así que se crea un protocolo mas cómodo de manejar estos directorios: LDAP.\\

LDAP (Lightweight Directory Access Protocol / Protocolo de acceso a directorios ligero) es un protocolo pensado para actualización y busquedas de directorios orientados a Internet (TCP/IP).\\

La ultima versión de LDAP es la 3 y es cubierta por los RFCs: 2251\cite{2251}, 2252\cite{2252}, 2253\cite{2253}, 2254\cite{2254}, 2255\cite{2255}, 2256\cite{2256} y 3377\cite{3377}.\\
\newpage
\subsection{Conceptos Básicos de LDAP}

\begin{itemize}
\item[]Entrada\\ (Entry)\\
Una entrada es una colección de atributos a los que se identifica por su DN (nombre distinguido /  distinguished name).
Un DN es único en todo el árbol y por lo tanto identifica claramente la entrada a la que refiere. Como ejemplo: CN=Alex O=CHAOSDIMENSION C=ES identificaría al objeto de nombre común Alex que esta en la organización CHAOSDIMENSION y en país ES (España).\\

Un RDN( nombre distinguido relativo / relative distinguished name) es parte del DN, de tal manera que concatenando los RDN dan como resultado el DN. Del ejemplo anterior CN=Alex seria un RDN.

\item[]Clase de objeto\\(Object Class)\\
Una clase es un atributo especial (ObjectClass) que define que atributos son requeridos y permitidos en una entrada. Los valores de las clases objetos están definidos en el esquema.
Todas las entradas deben tener un atributo ObjectClass.
No se permite añadir atributos a las entradas que no permitidos por las definiciones de las clases de objetos de la entrada.

\item[]Atributo\\(Attrib)\\
Un atributo es un tipo con uno o mas valores asociados. 
Se identifica por su OID ( identificador de objeto / object identifier).
El tipo de atributo indica si puede haber mas de un valor de este atributo en una entrada, los valores que pueden tener y como se los puede buscar.

\item[]Esquema\\(Schema)\\
Un esquema es una colección de definiciones de tipos de atributos, clases de objetos e información que el servidor usa para realizar las busquedas, introducir valores en un atributo, y permitir operaciones de añadir o modificar.

\item[]Filtro\\(Filter)\\
Para realizar una busqueda debemos tener en cuenta varios parámetros importantes:

\begin{list}{}{}
\item[Base](baseObject)\\
Un DN que sera a partir del cual realizaremos la busqueda.

\item[Alcance](scope)\\
Puede tener varios valores.\\- base: solo buscara en ese nivel base.\\- sub: hará busqueda recursiva por todo el árbol a partir del nivel base.\\- one: descenderá solo un nivel por debajo del nivel base.

\item[Tamaño limite](sizelimit)\\
Restringe el numero de entradas devueltas como resultado de una busqueda.

\item[Tiempo limite](timelimit)\\
Restringe el tiempo máximo de ejecución de una busqueda.

\item[filtro](filter)\\
Es una cadena que defina las condiciones que deben ser completadas para encontrar una entrada.

\end{list}

Los filtros se pueden concatenar con 'and', 'or' y 'not' para crear filtros mas complejos.\\
Por ejemplo un filtro con base O=CHAOSDIMENSION, C=ES, alcance base y filtro (CN=Alex) encontraría la entrada
CN=Alex, O=CHAOSDIMENSION, C=ES.\\

\end{itemize}
\newpage
\subsection{Servidores de LDAP}

LDAP esta soportado por numerosos servidores siendo los mas conocidos Active Directory de Microsoft, eDirectory de Novell, Oracle Internet Directory de Oracle, iPlanet directory server de SUN y por último pero no menos importante openLDAP.

En este manual se tratara el uso e instalación de openLDAP, ya que esta soportado por prácticamente todas las distribuciones de linux y su licencia cumple el estándar openSource.

Para mas información véase LDAP Linux HowTo\cite{llh}, Using LDAP\cite{ul}, openLDAP administrator Guide\cite{oag} y en español la parte relativa a LDAP del magnifico manual Ldap+Samba+Cups+Pykota\cite{lscp}. 

\section{Instalación}

Las mayorías de las distribuciones tienen paquetes de openLDAP. Como usar apt-get en debian, Urpmi en Mandrake, up2date en redhat o Yast2 en Suse sale fuera de este manual. Así que este manual explicara los necesario para la construcción desde las fuentes.

\subsection{Descargando openLDAP}
\label{down_ldap}
Aunque realmente no son necesarios, hay varios paquetes que deberían ser instalados antes de openLDAP ya que seguramente los necesitaremos.

El primero de ellos es \textbf{openSSL} \ref{down_ssl}.

El segundo es Servicios es \textbf{Kerberos v5} \ref{down_kerberos_mit} \ref{down_kerberos_heimdal}.

También será interesante tener instaladas las librerías \textbf{Cyrus SASL} (Capa simple de seguridad y autentificación de Cyrus / Cyrus's Simple Authentication and Security Layer).\\Que se pueden conseguir en \htmladdnormallink{http://asg.web.cmu.edu/sasl/}{http://asg.web.cmu.edu/sasl/sasl-library.html}, Cyrus SASL hace uso de openSSL y Kerberos/GSSAPI para autentificación.

Necesitaremos por ultimo una base de datos para openLDAP, en lo que atañe a este manual esta será dada a través de las librerías de  \htmladdnormallink{\textbf{Sleepycat Software Berkeley DB}}{http://www.sleepycat.com/}, las necesitaremos tanto si usamos LDBM (Berkeley DB versión 3) o BDB (Berkeley DB versión 4). También existen en la totalidad de distribuciones.

Una vez obtenidas y compiladas las librerías necesarias nos bajamos las \htmladdnormallink{fuentes de openLDAP}{http://www.openldap.org/software/download/} en /usr/src (por ejemplo) y 
descomprimimos en ese directorio (por ejemplo con tar -zxvf openldap-2.X.XX.tgz).
\newpage
\subsection{Opciones de instalación}

La siguientes opciones son para openLDAP versión 2.2.xx que pueden diferir de las versiones 2.0.XX y 2.1.XX.

Ejecutamos \htmladdnormallink{./configure}{http://warping.sourceforge.net/gosa/contrib/es/configure.sh} con las siguientes opciones.

\begin{itemize}
\item[](Directorios)\\
\begin{tabular}{|ll|}\hline
--prefix=/usr & \\
--libexecdir='\${prefix}/lib' & \\
--sysconfdir=/etc & \\
--localstatedir=/var/run & \\
--mandir='\${prefix}/share/man' & \\
--with-subdir=ldap & \\
\hline \end{tabular}

\item[](Opciones Básicas)\\
\begin{tabular}{|ll|}\hline
--enable-syslog & \\
--enable-proctitle & \\
--enable-ipv6 & $\rightarrow$Sockets IPv6\\
--enable-local & $\rightarrow$Sockets Unix\\
--with-cyrus-sasl & $\rightarrow$Autentificación Cyrus SASL soportadas\\
--with-threads & $\rightarrow$Soporte de Hilos de ejecución\\
--with-tls & $\rightarrow$Soporte TLS/SSL\\
--enable-dynamic & $\rightarrow$Compilación dinámica\\
\hline \end{tabular}

\item[](Opciones Slapd)\\
\begin{tabular}{|ll|}\hline
--enable-slapd & $\rightarrow$Compilar el servidor además de las librerías\\
--enable-cleartext & $\rightarrow$Permite el envío de contraseñas en claro\\
--enable-crypt & $\rightarrow$Envío de contraseñas encriptadas con DES.\\
--enable-spasswd & $\rightarrow$Verificación de contraseñas a través de SASL\\
--enable-modules & $\rightarrow$Soporte dinámico de módulos\\
--enable-aci & $\rightarrow$Soporte de ACIs por objetos (Experimental)\\
--enable-rewrite & $\rightarrow$Reescritura de DN en recuperación de LDAP\\
--enable-rlookups & $\rightarrow$Busqueda inversa del nombre del equipo cliente\\
--enable-slp & $\rightarrow$Soporte de SLPv2\\
--enable-wrappers & $\rightarrow$Soporte TCP wrappers\\
\hline \end{tabular}

\item[](Soporte)\\
\begin{tabular}{|ll|}\hline
--enable-bdb=yes & $\rightarrow$Soporte Berkeley versión 4\\
--enable-dnssrv=mod & \\
--enable-ldap=mod & $\rightarrow$Soporta otro servidor LDAP como base de datos\\
--enable-ldbm=mod & \\
--with-ldbm-api=berkeley & $\rightarrow$Soporte Berkeley versión 3\\
--enable-meta=mod & $\rightarrow$Soporte metadirectorio\\
--enable-monitor=mod & \\
--enable-null=mod & \\
--enable-passwd=mod & \\
--enable-perl=mod & $\rightarrow$Soporte scripts en perl\\
--enable-shell=mod & $\rightarrow$Soporte scripts en shell\\
--enable-sql=mod & $\rightarrow$Soporte base de datos relacional\\
\hline \end{tabular}
\end{itemize}

Posteriormente hacemos:\\
\#make \&\& make install
\newpage
\section{Configuración}
\subsection{Básica}

\noindent La configuración del servidor slapd de openLDAP se guarda en /etc/ldap/slapd.conf.\\

\noindent Una \htmladdnormallink{configuración básica}{http://warping.sourceforge.net/gosa/contrib/es/basic_slapd.conf} quedaría así:\\
\\
\begin{center}
\begin{longtable}{|p{15cm}l|}\hline
\caption{Configuración Básica de openLDAP}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración Básica de openLDAP}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración Básica de openLDAP (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
\# Schema and objectClass definitions, configuración básica & \\
include         /etc/ldap/schema/core.schema & \\
include         /etc/ldap/schema/cosine.schema & \\
include         /etc/ldap/schema/inetorgperson.schema & \\
include         /etc/ldap/schema/openldap.schema & \\
include         /etc/ldap/schema/nis.schema & \\
include         /etc/ldap/schema/misc.schema & \\
 & \\
\#Fuerza a las entradas a encontar eschemas para los ObjectClass & \\
schemacheck             on & \\
 & \\
\# Password hash, tipo de encriptación de la clave & \\
\# Puede ser: \{SHA\}, \{MD5\}, \{MD4\}, \{CRYPT\}, \{CLEARTEXT\} & \\
password-hash           \{CRYPT\} & \\
 & \\
\# Base de busqueda por defecto & \\
defaultsearchbase       "dc=CHAOSDIMENSION,dc=ORG" & \\
 & \\
\#Utilizado por init scripts para parar e iniciar el servidor. & \\
pidfile         /var/run/slapd.pid & \\
 & \\
\# Argumentos pasados al servidor. & \\
argsfile        /var/run/slapd.args & \\
 & \\
\# Nivel de logs & \\
loglevel        1024 & \\
 & \\
\# Donde y que módulos cargar & \\
modulepath      /usr/lib/ldap & \\
moduleload      back\_bdb \# Berkeley BD versión 4 & \\
 & \\
\#definiciones de la base de datos & \\
database        bdb & \\
 & \\
\# La base del directorio & \\
suffix          "dc=CHAOSDIMENSION,dc=ORG"  & \\
 & \\
\# Aquí definimos al administrador del directorio y su clave & \\
\# En este ejemplo es " tester"  & \\
\# La clave se puede sacar con  & \\
\# makepasswd --crypt --clearfrom fichero\_con\_nombre usuario & \\
 & \\
rootdn  \verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"|  & \\
rootpw  \{crypt\}OuorOLd3VqvC2 & \\
 & \\
\# Que atributos indexamos para hacer busquedas & \\
index   default                                                sub & \\
index   uid,mail                                               eq & \\
index   cn,sn,givenName,ou                                     pres,eq,sub & \\
index   objectClass                                            pres,eq & \\
 & \\
\# Directorio donde se guarda la base de datos & \\
directory       " /var/lib/ldap"  & \\
 & \\
\# Indicamos si deseamos guardar la fecha de la ultima modificación & \\
lastmod off & \\
 & \\
\#Acceso del administrador & \\
access to * & \\
        by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG" =wrscx| & \\
        by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| =wrscx & \\
        by * read & \\
\end{longtable}
\end{center}

\newpage
\subsection{Específica para GOsa}

GOsa añade varios esquemas para el control de ciertos servicios y características de los usuarios.\\

Los esquemas necesarios para GOsa están en el paquete, en la seccion contrib, lo ideal será copiarlos todos a /etc/ldap/schema\\

Una \htmladdnormallink{configuración recomendada}{http://warping.sourceforge.net/gosa/contrib/es/gosa_slapd.conf} de /etc/ldap/slapd.conf es la siguiente:\\

\begin{center}
\begin{longtable}{|p{15cm}l|}\hline
\caption{Configuración Específica para GOsa}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración Específica para GOsa}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración Específica para GOsa (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
\# Schema and objectClass definitions, configuración básica & \\
include         /etc/ldap/schema/core.schema & \\
include         /etc/ldap/schema/cosine.schema & \\
include         /etc/ldap/schema/inetorgperson.schema & \\
include         /etc/ldap/schema/openldap.schema & \\
include         /etc/ldap/schema/nis.schema & \\
include         /etc/ldap/schema/misc.schema & \\
 & \\
\# Estos esquemas deberían estar presentes en GOsa. En el caso de samba3 & \\
\# se deben cambiar samba.schema y gosa.schema por samba3.schema & \\
\# y gosa+samba3.schema. & \\
include		/etc/ldap/schema/samba3.schema & \\
include		/etc/ldap/schema/pureftpd.schema & \\
include		/etc/ldap/schema/gohard.schema & \\
include		/etc/ldap/schema/gofon.schema & \\
include		/etc/ldap/schema/goto.schema & \\
include		/etc/ldap/schema/gosa+samba3.schema & \\
include		/etc/ldap/schema/gofax.schema & \\
include		/etc/ldap/schema/goserver.schema & \\
 & \\
\#Obliga al cumplimiento de los ObjectClass & \\
schemacheck             on & \\
 & \\
\# Password hash, tipo de encriptación de la clave & \\
\# Puede ser: \{SHA\}, \{SMD5\}, \{MD4\}, \{CRYPT\}, \{CLEARTEXT\} & \\
password-hash           \{CRYPT\} & \\
 & \\
\# Base de busqueda por defecto & \\
defaultsearchbase       " dc=CHAOSDIMENSION,dc=ORG"  & \\
 & \\
\#Utilizado por init scripts para parar e iniciar el servidor. & \\
pidfile         /var/run/slapd.pid & \\
 & \\
\# Argumentos pasados al servidor. & \\
argsfile        /var/run/slapd.args & \\
 & \\
\# Nivel de logs & \\
loglevel        1024 & \\
 & \\
\# Donde y que módulos cargar & \\
modulepath      /usr/lib/ldap & \\
moduleload      back\_bdb \# Berkeley BD versión 4& \\
 & \\
\# Algunos parámetros de rendimiento & \\
threads		64 & \\
concurrency		32 & \\
conn\_max\_pending	100 & \\
conn\_max\_pending\_auth	250 & \\
reverse-lookup		off & \\
sizelimit		1000 & \\
timelimit		30 & \\
idletimeout		30 & \\
 & \\
\# Limitaciones específicas & \\
limits	anonymous	size.soft=500 time.soft=5 & \\
 & \\
\# Definiciones de la base de datos & \\
database        bdb & \\
cachesize       5000 & \\
checkpoint	512 720 & \\
mode		0600 & \\
 & \\
\# La base del directorio & \\
suffix          " dc=CHAOSDIMENSION,dc=ORG"  & \\
 & \\
\# Aquí definimos al administrador del directorio y su clave & \\
\# En este ejemplo es " tester"  & \\
\# La clave se puede sacar con  & \\
\# makepasswd --crypt --clearfrom fichero\_con\_nombre usuario & \\
 & \\
rootdn  \verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"|  & \\
rootpw  \{crypt\}OuorOLd3VqvC2 & \\
 & \\
\# Que atributos indexamos para hacer busquedas & \\
index   default                                                sub & \\
index   uid,mail                                               eq & \\
index   gosaMailAlternateAddress,gosaMailForwardingAddress     eq & \\
index   cn,sn,givenName,ou                                     pres,eq,sub & \\
index   objectClass                                            pres,eq & \\
index   uidNumber,gidNumber,memberuid                          eq & \\
index   gosaSubtreeACL,gosaObject,gosaUser                     pres,eq & \\
 & \\
\# Indexing for Samba 3
index   sambaSID                                               eq & \\
index   sambaPrimaryGroupSID                                   eq & \\
index   sambaDomainName                                        eq & \\
 & \\
\# Quienes pueden cambiar las claves de usuario & \\
\# Solo por el propio usuario si está autentificado & \\
\# o por el administrador & \\
access to attr=sambaPwdLastSet,sambaPwdMustChange,sambaPwdCanChange & \\
        by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
        by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
	by anonymous auth & \\
	by self write & \\
	by * none  & \\
access to attr=userPassword,shadowMax,shadowExpire & \\
        by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
        by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
	by anonymous auth & \\
	by self write & \\
	by * none  & \\
 & \\
\# Denegar acceso a las claves imap, fax o kerberos guardadas en & \\
\# LDAP & \\
access to attr=goImapPassword & \\
	by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
	by * none  & \\
access to attr=goKrbPassword & \\
	by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
	by * none  & \\
access to attr=goFaxPassword & \\
	by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
	by * none  & \\
 & \\
\# Permite que el servidor escriba el atributo LastUser & \\
access to attr=gotoLastUser & \\
	by * write & \\
 & \\
\#Las claves samba por defecto pueden ser cambiadas & \\
\#por el usuario si se ha autentificado. & \\
access to attr=sambaLmPassword,sambaNtPassword & \\
	by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
	by anonymous auth & \\
	by self write & \\
	by * none & \\
 & \\
\# Permite acceso de escritura para administrador de terminales & \\
access to dn=" ou=incoming,dc=CHAOSDIMENSION,dc=ORG"  & \\
	by dn=\verb|"cn=terminal-admin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
 & \\
access to dn.subtree=" ou=incoming,dc=CHAOSDIMENSION,dc=ORG"  & \\
	by dn=\verb|"cn=terminal-admin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| write & \\
	by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| write & \\
 & \\
\# Directorio donde se guarda la base de datos & \\
directory       " /var/lib/ldap"  & \\
 & \\
\# Indicamos si deseamos guardar la fecha de la ultima modificación & \\
lastmod off & \\
 & \\
\# Acceso del administrador & \\
access to * & \\
        by dn=\verb|"cn=ldapadmin,dc=CHAOSDIMENSION,dc=ORG"| =wrscx & \\
        by dn.regex=\verb|"uid=[^{}/]+/admin\+(realm=CHAOSDIMENSION.LOCAL)?"| =wrscx & \\
        by * read & \\
\end{longtable}
\end{center}
    
\section{Utilización}
\subsection{Configuración PAM/NSS}

NSS (Librerías del servicio de seguridad en red / Network Security Service Libraries)\\

NSS es una parte básica del sistema, sirve para control de las cuentas POSIX, para poder usar LDAP para cuentas POSIX (del sistema) utilizaremos NSS\_LDAP, que se puede descargar de \htmladdnormallink{http://www.padl.com/OSS/nss\_ldap.html}{http://www.padl.com/OSS/nss\_ldap.html} , lo descomprimimos es /usr/src y ejecutamos:\\

\noindent \#cd /usr/src/nss\_ldap\\
\noindent \#./configure \&\& make \&\& make install\\

La configuración básica de NSS esta en /etc/nsswitch.conf y debe quedar así para lo que nosotros queremos.\\
\begin{center}
\begin{longtable}{|ll|}\hline
\caption{Configuración NSSWITCH}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración NSSWITCH}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración NSSWITCH (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot

passwd:         files ldap & \# Estas son las lineas que cambiamos para que haga peticiones ldap\\
group:          files ldap & \#\\
shadow:         files ldap & \#\\
 & \\
hosts:          files dns & \\
networks:       files & \\
 & \\
protocols:      db files & \\
services:       db files & \\
ethers:         db files & \\
rpc:            db files & \\
 & \\
netgroup:       nis & \\
\hline \end{longtable}
\end{center}
\newpage
La configuración de nss-ldap se guarda en /etc/nss-ldap.conf y una configuración válida para GOsa quedaría así:
\begin{center}
\begin{longtable}{|ll|}\hline
\caption{Configuración NSS}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración NSS}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración NSS (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
host ip.servidor.ldap & \# Aquí ponemos donde\\
 & \# estará nuestro servidor LDAP\\
base ou=people,dc=CHAOSDIMENSION,dc=ORG & \# Aquí donde van a ir los usuarios y sus claves.\\
 & \# OU significa unidad organizativa\\
 & \# y OU=people es el lugar donde GOsa guarda las\\
 & \# caracteristicas de los usuarios\\
ldap\_version 3 & \# Versión de LDAP soportada \\
 & \#(muy recomendado la versión 3)\\
nss\_base\_passwd ou=people,dc=CHAOSDIMENSION,DC=ORG?one & \#Donde buscamos las caracteristicas POSIX\\
nss\_base\_shadow ou=people,dc=CHAOSDIMENSION,DC=ORG?one & \#Donde buscamos las claves\\
nss\_base\_group ou=groups,dc=CHAOSDIMENSION,DC=ORG?one & \#Donde las caracteristicas de los grupos POSIX\\
\hline \end{longtable}
\end{center}

PAM ( Módulos de autentificación conectables / Pluggable Authentication Modules) es una paquete de librerías dinámicas que permiten al administrador de sistema elegir en que manera las aplicaciones autentifican a los usuarios.

PAM viene de serie en todas las distribuciones, en /etc/pam.d se guarda la configuración de cada módulo y en /lib/security las librerías dinámicas.

Nos vamos a concentrar en uno de los módulos de PAM: pam\_ldap. Este módulo nos servirá para que las aplicaciones que usen el sistema base de autentificación y control de sesión y que no usen LDAP, indirectamente accedan a LDAP, como fuente de autentificación.

Con PAM\_LDAP y la infraestructura de PAM conseguimos que los usuarios POSIX del sistema funcionen atraves de LDAP y se puedan configurar con GOsa.

PAM\_LDAP se puede descargar de \htmladdnormallink{http://www.padl.com/OSS/pam\_ldap.html}{http://www.padl.com/OSS/pam\_ldap.html} , lo descomprimimos es /usr/src y ejecutamos el clásico:\\

\noindent \#cd /usr/src/pam\_ldap\\
\noindent \#./configure \&\& make \&\& make install\\
\\
La configuración de este módulo estará en /etc/pam\_ldap.conf, una configuración básica que funcione con GOsa quedaría:
\begin{center}
\begin{longtable}{|ll|}\hline
\caption{Configuración PAM}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
host ip.servidor.ldap & \# Aquí ponemos donde estará nuestro servidor LDAP\\
base ou=people,dc=CHAOSDIMENSION,dc=ORG & \# Aquí donde van a ir los usuarios y sus claves.\\
 & \# OU significa unidad organizativa y OU=people\\
 & \# es el lugar donde GOsa guarda las caracteristicas de los usuarios\\
ldap\_version 3 & \# Versión de LDAP soportada (muy recomendado la versión 3)\\
scope one & \# En gosa los usuarios están al mismo nivel,\\
 & \# no necesitamos descender.\\
rootbinddn cn=ldapadmin,dc=solaria,dc=es & \# Aquí está el DN del administrador LDAP del servidor,\\
 & \# es necesario, ya que el servidor solo\\
 & \# dará acceso a las claves encriptadas al administrador.\\
pam\_password md5 & \# Indica como están encriptadas las claves.\\
\hline \end{longtable}
\end{center}

En el archivo /etc/secret pondremos la clave del administrador LDAP, este archivo, así como el anterior solo deberían ser accesibles por root.

Para poder user ahora los servicios con la autentificación LDAP deberemos concentrarnos en tres archivos:\\
Control de cuentas /etc/pam.d/common-account:
\begin{center}
\begin{longtable}{|ll|}\hline
\caption{Configuración PAM common-account}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM common-account}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM common-account (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
account required          pam\_unix.so & \# Siempre requerido\\
account sufficient        pam\_ldap.so & \# Las llamadas a ldap\\
\hline \end{longtable}
\end{center}

Control de autentificación /etc/pam.d/common-auth:
\begin{center}
\begin{longtable}{|ll|}\hline
\caption{Configuración PAM common-auth}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM common-auth}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM common-auth (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
auth     sufficient     pam\_unix.so & \# Autentificación estandar\\
auth     sufficient     pam\_ldap.so try\_first\_pass & \# Autentificacion LDAP en el primer intento\\
auth     required       pam\_env.so & \\
auth     required       pam\_securetty.so & \\
auth     required       pam\_unix\_auth.so & \\
auth     required       pam\_warn.so & \\
auth     required       pam\_deny.so & \\
\hline \end{longtable}
\end{center}

Control de sesiones /etc/pam.d/common-session:
\begin{center}
\begin{longtable}{|ll|}\hline
\caption{Configuración PAM common-session}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM common-session}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración PAM common-session (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
session required        pam\_limits.so & \\
session required        pam\_unix.so & \# Sesión unix estandar\\
session optional        pam\_ldap.so & \# Sesión basada en LDAP\\
\hline \end{longtable}
\end{center}

Esta configuración será necesaria al menos para configurar POSIX y SAMBA.
\newpage
\subsection{Replicación}

Si tenemos mas de un dominio debemos tener una estructura mas distribuida que sea mas eficiente contra fallos. Una estructura básica sería un servidor maestro con el árbol LDAP completo y servidores con subárboles LDAP que solo tuvieran la parte del dominio que controlan.

De esta manera GOsa controla el servidor maestro y a traves de un proceso llamado replicación los servidores de dominio.

La replicación se configura en la configuración de ldap, pero no la ejecuta el demonio slapd, sino otro especializado llamado slurp.
Su configuración se realiza en la base de datos que queremos replicar, como en el ejemplo básico no hemos configurado mas que una base de datos solo tendríamos que añadir al final del fichero de configuración /etc/ldap/slapd.conf:

\begin{center}
\begin{longtable}{|ll|}\hline
\caption{Configuración Replicación}\\
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración Replicación}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{2}{|c|}{\textbf{Configuración Replicación (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{2}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{2}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
\#Configuración de réplica & \\
\#Utilizado por init scripts para parar e iniciar el servidor. & \\
replica-pidfile         /var/run/slurp.pid & \\
 & \\
\# Argumentos pasados al servidor. & \\
replica-argsfile        /var/run/slapd.args & \\
 & \\
\#Lugar donde grabamos lo que se replica, y que usara slurpd & \\
replogfile      /var/lib/ldap/replog & \\
\#Las configuraciones de réplica & \\
\#Indicación de réplica & \\
replica & \\
\#Dirección URI del servidor & \\
uri=ldap://ip.servidor.esclavo1 & \\
\#Que vamos a replicar del maestro & \\
suffix=" dc=dominio1,dc=CHAOSDIMENSION,dc=ORG" & \\
\#Como vamos a autentificar & \\
bindmethod=simple & \\
\#DN replica del esclavo1 & \\
binddn=\verb|"cn=esclavo1,ou=people,dc=dominio1,dc=CHAOSDIMENSION,dc=ORG"| & \\
\#Contraseña del usuario & \\
\# de replica de esclavo1 & \\
credentials=" tester" & \\
\#Indicación de réplica del esclavo2 & \\
replica & \\
uri=ldap://ip.servidor.esclavo2 & \\
suffix=" dc=dominio2,dc=CHAOSDIMENSION,dc=ORG" & \\
bindmethod=simple & \\
binddn=\verb|"cn=esclavo2,ou=people,dc=dominio2,dc=CHAOSDIMENSION,dc=ORG"| & \\
credentials=" tester" & \\
\hline \end{longtable}
\end{center}

Por simplicidad hemos supuesto que los dos servidores esclavos están configurados igual que el maestro, excepto por la configuración de replica del maestro y las indicaciones de los esclavos de quien es el servidor maestro.

En los servidores esclavos añadimos al final del /etc/ldap/slapd.conf:

En esclavo1:\\
\begin{tabular}{|ll|}\hline
\#Quién puede actualizar el servidor & \\
updatedn \verb|"cn=esclavo1,dc=dominio1,dc=CHAOSDIMENSION,dc=ORG"| & \\
\#Desde donde & \\
updateref ldap://ip.servidor.maestro & \\
\#Permitimos el acceso & \\
access to dn.subtree= " dc=dominio1,dc=CHAOSDIMENSION,dc=ORG" & \\
by dn= \verb|"cn=esclavo1,dc=dominio1,dc=CHAOSDIMENSION,dc=ORG"|  =wrscx & \\
by * none & \\
\hline\end{tabular}
\vspace{0.5cm}

En esclavo2:\\
\begin{tabular}{|ll|}\hline
\#Quién puede actualizar el servidor & \\
updatedn \verb|"cn=esclavo2,dc=dominio2,dc=CHAOSDIMENSION,dc=ORG"| & \\
\#Desde donde & \\
updateref ldap://ip.servidor.maestro & \\
\#Permitimos el acceso & \\
access to dn.subtree= " dc=dominio2,dc=CHAOSDIMENSION,dc=ORG" & \\
by dn= \verb|"cn=esclavo2,dc=dominio2,dc=CHAOSDIMENSION,dc=ORG"| =wrscx & \\
by * none & \\
\hline \end{tabular}
\vspace{1cm}

Además debemos crear los usuarios de replica en las bases de datos correspondientes. Eso se vera en el siguiente punto.

\subsection{Carga de datos}

En este punto daremos los datos iniciales de nuestro árbol LDAP necesario para GOsa.
Tambien indicaremos de que manera hacer la carga de estos datos y que hacer en el caso de un servidor único o en el caso de que haya réplicas.

La carga se puede hacer de dos maneras, una es atraves de slapadd y la otra es atraves de ldapadd.\\
En el primer caso la carga se hace directamente sobre la base de datos con lo cual no existe replicación y ademas no se mostrarán los datos en el servidor LDAP hasta que este no sea iniciado nuevamente, \textbf{la carga de datos de esta manera debe ser hecha con el servidor apagado}.\\
En el segundo caso, la carga se hace a traves de ldap y si hay replica esta se generara de la manera pertinente.

Para una carga desde cero de la base de datos, deberemos hacerla desde slapadd, con el servidor slapd parado.

La forma de usar slapadd es:\\

\noindent \#slapadd -v -l fichero\_con\_datos.ldif\\

LDIF es el formato estándar para guardar datos de LDAP. GOsa trae su propio ldif de ejemplo, en los siguientes dos puntos explicaremos como usarlo según nuestras necesidades.
\vspace{1cm}

\subsubsection{Servidor Único}

Es el caso mas básico, en el no hay replicación y solo necesitamos un árbol simple.\\
En nuestro ejemplo supondremos que nuestro árbol GOsa está en dc=CHAOSDIMENSION,dc=ORG.\\

Cargaremos los datos con un script, le llamaremos \htmladdnormallink{carga.sh}{http://warping.sourceforge.net/gosa/contrib/es/carga.sh}, esto simplificara los pasos.
Los parámetros del script serán: DN de la base, Servidor IMAP,Realm Kerberos\\

\begin{center}
\begin{longtable}{|l|}\hline
\caption{Configuración Carga de Datos}\\
\hline \hline
\multicolumn{1}{|c|}{\textbf{Configuración Carga de Datos}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{1}{|c|}{\textbf{Configuración Carga de Datos (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{1}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{1}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
\#!/bin/sh\\
\\
if [ \$\{\#@\} != 3 ]\\
then\\
\verb|    |echo "Se necesita los parametro DN base, Servidor IMAP y Servidor Kerberos"\\
\verb|    |echo "Por ejemplo carga.sh dc=CHAOSDIMENSION,dc=ORG imap.solaria krb.solaria"\\
\verb|    |exit\\
fi\\
\\
DC=`echo \$1|cut -d\textbackslash= -f 2|cut -d \textbackslash , -f 1`\\
IMAP=\$2\\
KRB=\$3\\
\\
slapadd \verb|<<| EOF\\
dn: \$1\\
objectClass: dcObject\\
objectClass: organization\\
description: Base object\\
dc: \$DC\\
o: My own Organization\\
\\
dn: cn=terminal-admin,\$1\\
objectClass: person\\
cn: terminal-admin\\
sn: Upload user\\
description: GOto Upload Benutzer\\
userPassword:: e2tlcmJlcm9zfXRlcm1pbmFsYWRtaW5AR09OSUNVUy5MT0NBTAo=\\
\\
dn: ou=systems,\$1\\
objectClass: organizationalUnit\\
ou: systems\\
\\
dn: ou=terminals,ou=systems,\$1\\
objectClass: organizationalUnit\\
ou: terminals\\
\\
dn: ou=servers,ou=systems,\$1\\
objectClass: organizationalUnit\\
ou: servers\\
\\
dn: ou=people,\$1\\
objectClass: organizationalUnit\\
ou: people\\
\\
dn: ou=groups,\$1\\
objectClass: organizationalUnit\\
ou: groups\\
\\
dn: cn=default,ou=terminals,ou=systems,\$1\\
objectClass: gotoTerminal\\
cn: default\\
gotoMode: disabled\\
gotoXMethod: query\\
gotoRootPasswd: tyogUVSVZlEPs\\
gotoXResolution: 1024x768\\
gotoXColordepth: 16\\
gotoXKbModel: pc104\\
gotoXKbLayout: de\\
gotoXKbVariant: nodeadkeys\\
gotoSyslogServer: lts-1\\
gotoSwapServer: lts-1:/export/swap\\
gotoLpdServer: lts-1:/export/spool\\
gotoNtpServer: lts-1\\
gotoScannerClients: lts-1.\$DC.local\\
gotoFontPath: inet/lts-1:7110\\
gotoXdmcpServer: lts-1\\
gotoFilesystem: afs-1:/export/home /home nfs exec,dev,suid,rw,hard,nolock,fg,rsize=8192 1 1\\
\\
dn: cn=admin,ou=people,\$1\\
objectClass: person\\
objectClass: organizationalPerson\\
objectClass: inetOrgPerson\\
objectClass: gosaAccount\\
uid: admin\\
cn: admin\\
givenName: admin\\
sn: GOsa main administrator\\
sambaLMPassword: 10974C6EFC0AEE1917306D272A9441BB\\
sambaNTPassword: 38F3951141D0F71A039CFA9D1EC06378\\
userPassword:: dGVzdGVy\\
\\
dn: cn=administrators,ou=groups,\$1\\
objectClass: gosaObject\\
objectClass: posixGroup\\
objectClass: top\\
gosaSubtreeACL: :all\\
cn: administrators\\
gidNumber: 999\\
memberUid: admin\\
\\
dn: cn=lts-1,ou=servers,ou=systems,\$1\\
objectClass: goTerminalServer\\
objectClass: goServer\\
goXdmcpIsEnabled: true\\
macAddress: 00:B0:D0:F0:DE:1D\\
cn: lts-1\\
goFontPath: inet/lts-1:7110\\
\\
dn: cn=afs-1,ou=servers,ou=systems,\$1\\
objectClass: goNfsServer\\
objectClass: goNtpServer\\
objectClass: goLdapServer\\
objectClass: goSyslogServer\\
objectClass: goCupsServer\\
objectClass: goServer\\
macAddress: 00:B0:D0:F0:DE:1C\\
cn: afs-1\\
goExportEntry: /export/terminals 10.3.64.0/255.255.252.0(ro,async,no\_root\_squash)\\
goExportEntry: /export/spool 10.3.64.0/255.255.252.0(rw,sync,no\_root\_squash)\\
goExportEntry: /export/swap 10.3.64.0/255.255.252.0(rw,sync,no\_root\_squash)\\
goExportEntry: /export/home 10.3.64.0/255.255.252.0(rw,sync,no\_root\_squash)\\
goLdapBase: \$1\\
\\
dn: cn=vserver-02,ou=servers,ou=systems,\$1\\
objectClass: goImapServer\\
objectClass: goServer\\
macAddress: 00:B0:D0:F0:DE:1F\\
cn: vserver-02\\
goImapName: imap://\$IMAP\\
goImapConnect: {\$IMAP:143}\\
goImapAdmin: cyrus\\
goImapPassword: secret\\
goImapSieveServer: \$IMAP\\
goImapSievePort: 2000\\
\\
dn: cn=kerberos,ou=servers,ou=systems,\$1\\
objectClass: goKrbServer\\
objectClass: goServer\\
macAddress: 00:B0:D0:F0:DE:1E\\
cn: kerberos\\
goKrbRealm: \$KRB\\
goKrbAdmin: admin/admin\\
goKrbPassword: secret\\
\\
dn: cn=fax,ou=servers,ou=systems,\$1\\
objectClass: goFaxServer\\
objectClass: goServer\\
macAddress: 00:B0:D0:F0:DE:10\\
cn: fax\\
goFaxAdmin: fax\\
goFaxPassword: secret\\
\\
dn: ou=incoming,\$1\\
objectClass: organizationalUnit\\
ou: incoming\\
\\
EOF\\
\hline \end{longtable}
\end{center}

\subsubsection{Servidor Maestro y dos réplicas}

La carga de datos se hará con el mismo script de la sección anterior, tanto en el maestro como en los esclavos, con las siguientes diferencias:\\

En el maestro por ejemplo "DC=CHAOSDIMENSION,DC=ORG" ejecutaremos este script \htmladdnormallink{crea\_base.sh}{http://warping.sourceforge.net/gosa/contrib/es/crea\_base.sh} para crear la base:\\

\begin{center}
\begin{longtable}{|l|}\hline
\caption{Configuración Crea Base Maestro}\\
\hline \hline
\multicolumn{1}{|c|}{\textbf{Configuración Crea Base Maestro}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{1}{|c|}{\textbf{Configuración Crea Base Maestro (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{1}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{1}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
\#!/bin/sh\\
\\
if [ \$\{\#@\} != 1 ]\\
then\\
\verb|    |echo "Se necesita el parámetro DN base del maestro"\\
\verb|    |echo "Por ejemplo crea\_base.sh dc=CHAOSDIMENSION,dc=ORG"\\
\verb|    |exit\\
fi\\
\\
DC=`echo \$1|cut -d\textbackslash= -f 2|cut -d\textbackslash, -f 1`\\
\\
slapadd \verb|<<|  EOF\\
dn: \$1\\
objectClass: dcObject\\
objectClass: organization\\
description: Base object\\
dc: \$DC\\
o: My own Base Organization\\
\\
EOF\\
\hline \end{longtable}
\end{center}

Además con el script de la sección anterior cargaremos los dominios de ejemplo:\\ "DC=dominio1,DC=CHAOSDIMENSION,DC=ORG" y "DC=dominio2,DC=CHAOSDIMENSION,DC=ORG".\\

En el esclavo1 ejecutaremos el script con "DC=dominio1,DC=CHAOSDIMENSION,DC=ORG" y en esclavo2 con "DC=dominio2,DC=CHAOSDIMENSION,DC=ORG".\\ En ambos casos los dos servidores LDAP esclavos habrán sido configurados para su propio DN.

Lo que nos faltaría seria crear el usuario para la replica, que se podría hacer con el siguiente script \htmladdnormallink{usuario\_replica.sh}{http://warping.sourceforge.net/gosa/contrib/es/usuario\_replica.sh} con parámetros nombre del usuario y el DN base: \\

\begin{center}
\begin{longtable}{|l|}\hline
\caption{Configuración Usuario Réplica}\\
\hline \hline
\multicolumn{1}{|c|}{\textbf{Configuración Usuario Réplica}}\\
\hline \hline
\endfirsthead
\hline \hline
\multicolumn{1}{|c|}{\textbf{Configuración Usuario Réplica (continuación)}}\\
\hline \hline
\endhead
\hline
\multicolumn{1}{|c|}{Sigue $\ldots$}\\
\hline
\endfoot
\hline
\multicolumn{1}{|c|}{\textbf{Fin}}\\
\hline
\endlastfoot
\#!/bin/sh\\
if [ \$\{\#@\} != 2 ]\\
then\\
\verb|    |echo "Se necesita los parametros nombre de usuario y DN base para replica"\\
\verb|    |echo "Por ejemplo usuario\_replica.sh replicator dc=dominio1,dc=CHAOSDIMENSION,dc=ORG "\\
\verb|    |exit\\
fi\\
\\
KEY=`makepasswd --crypt --chars=7 \textbackslash \\--string="abcdefghijklmnopqrstuvwxyz1234567890"`\\
PASS=`echo \$KEY|awk '\{ print \$1 \}'`\\
CRYPT=`echo \$KEY|awk '\{ print \$2 \}'`\\
\\
echo \verb|"Creando usuario $1 con contraseña: $PASS"|\\
\\
slapadd \verb|<<| EOF\\
dn: cn=\$1,ou=people,\$2\\
displayName: Debian User,,,\\
userPassword: \{crypt\} \$CRYPT\\
sambaLMPassword: \\
sambaNTPassword: \\
sn: \$1\\
givenName: \$1\\
cn: \$1\\
homeDirectory: /home/\$1\\
loginShell: /bin/false\\
uidNumber: 10000\\
gidNumber: 100\\
gecos: \$1\\
shadowMin: 0\\
shadowMax: 99999\\
shadowWarning: 7\\
shadowInactive: 0\\
shadowLastChange: 12438\\
gosaDefaultLanguage: es\_ES\\
uid: \$1\\
objectClass: posixAccount\\
objectClass: shadowAccount\\
objectClass: person\\
objectClass: organizationalPerson\\
objectClass: inetOrgPerson\\
objectClass: gosaAccount\\
objectClass: top\\
\\
EOF\\
\hline \end{longtable}
\end{center}

\section{Modificaciones para Kerberos}
\subsection{Configurando Sasl y Openldap}


\section{Configurar Heimdal Kerberos sobre OpenLdap}
\label{heimdal_ldap}

¿Porque debemos meter la base de datos de heimdal en ldap?

La explicación es sencilla, replicación, ldap tiene sistemas de replicación y de acceso a datos mucho mas modernos y utiles que los de hprop o iprop.

Por otro lado al estar los datos en ldap, GOsa no tiene mas que escribirlos o modificarlos directamente, permitiendo crear dominios Kerberos desde ldap o añadir/quitar usuarios/servicios.

\subsection{Configurar Heimdal}

La instalación \ref{down_kerberos_heimdal} y la configuración \ref{heimdal_conf} en la misma, pero vamos a añadir al archivo de configuración un nuevo bloque:

\vspace{0.5cm}
\begin{center}
\begin{tabular}{|l|l|}\hline 
\verb|    [kdc]| & $\rightarrow$ Configuración de base de datos del KDC.\\
\verb|    database = {| & $\rightarrow$ Definiciones de la base de datos.\\
\verb|            realm=CHAOSDIMENSION.ORG| & $\rightarrow$ Que dominio tendremos bajo ese DN\\
\verb|            dbname = ldap:ou=people,dc=chaosdimension,dc=org| & $\rightarrow$ El DN bajo el cual se va a guardar la\\
& base de datos, debemos elegir la que convenga segun nuestra configuración GOsa.\\
\verb|            acl_file=/var/lib/heimdal-kdc/kadmind.acl| & $\rightarrow$ Fichero con los permisos de acceso a esa base de datos.\\
\verb|            mkey_file = /var/lib/heimdal-kdc/m-key| & $\rightarrow$ Clave maestra de esa base de datos.\\
\verb|    }| & $\rightarrow$ \\
\hline \end{tabular}
\end{center}
\vspace{0.5cm}

\subsection{Configurar OpenLdap}

La configuración de openLDAP tiene cuatro partes:\\
La primera es que heimdal solo accede al servidor openLDAP de forma local, via ldapi://, esto tendra que ser activado en el inicio de openLDAP.\\
La segunda es que tenemos que añadir el esquema para kerberos, lo podemos descargar de \htmladdnormallink{http://www.stanford.edu/services/directory/openldap/configuration/krb5-kdc.schema}{http://www.stanford.edu/services/directory/openldap/configuration/krb5-kdc.schema} y debemos colocarlo en /etc/ldap/schemas.\\
La tercera parte son los cambios necesarios en slapd.conf:\\
\vspace{0.5cm}
\begin{center}
\begin{tabular}{|l|l|}\hline 
... & $\rightarrow$ En la carga de esquemas\\
\verb|include         /etc/ldap/schema/krb5-kdc.schema| & \\
... & $\rightarrow$ Configuración SSL/TLS\\
\verb|TLSCertificateFile /etc/ldap/ssl/ldap.crt| & \\
\verb|TLSCertificateKeyFile /etc/ldap/ssl/ldap.key| & \\
\verb|TLSCACertificateFile /etc/ldap/ssl/gosa.ca| & \\
... & $\rightarrow$ Configuración Sasl\\
\verb|sasl-host ldap.chaosdimension.og| & \\
\verb|sasl-keytab /etc/krb5.keytab.ldap| & \\
\verb|sasl-realm CHAOSDIMENSION.ORG| & \\
\verb|sasl-secprops noanonymous| & \\
 & \\
\verb|sasl-regexp "uidNumber=0\\\+gidNumber=.*,cn=peercred,cn=external,cn=auth"| & \\
\verb|        "krb5PrincipalName=kadmin/admin@CHAOSDIMENSION.ORG,ou=people,dc=chaosdimension,dc=org"| & \\
\verb|sasl-regexp uid=(.+),cn=gssapi,cn=auth uid=$1,ou=people,dc=chaosdimension,dc=org| & \\
... & $\rightarrow$ Configuracion Kerberos:\\
\verb|srvtab          /etc/krb5.keytab.ldap| & \\
... & $\rightarrow$ El las listas de acceso de la base de datos:\\
\verb|access to dn=""| & \\
\verb|  by * read| & \\
 & \\
\verb|access to dn.base="cn=Subschema"| & \\
\verb| by * read| & \\
 & \\
\verb|access to attr=supportedSASLMechanisms,subschemaSubentry| & \\
\verb|  by anonymous read| & \\
\verb|  by * read| & \\
 & \\
\verb|access to dn.regex="(.*,)?ou=chlgrupo,dc=chlgrupo,dc=com"| & \\
\verb|  by dn="krb5PrincipalName=kadmin/admin@CHAOSDIMENSION.ORG,ou=people,dc=chaosdimension,dc=org" =wrscx| & \\
\hline \end{tabular}
\end{center}
\vspace{0.5cm}



