Guía Gentoo para la autenticación con OpenLDAP
1.
Empezando con OpenLDAP
¿Qué es LDAP?
LDAP significa Lightweight Directory Access Protocol (Protocolo
Ligero de Acceso a Directorios). Basado en X.500, abarca muchas de sus
funciones principales, pero carece de las funciones más esotéricas de
X.500. Pero, ¿qué es este X.500 y por qué hay un LDAP?
X.500 es un modelo de Servicio de Directorio basado en el concepto OSI
(interconexión de sistemas abiertos). Contiene definiciones de
espacios de nombres y los protocolos para preguntar y actualizar el
directorio. Sin embargo, X.500 ha sido creado para ser excesivamente
estricto en algunas situaciones. Entrando en LDAP, al igual que X.500,
proporciona un modelo de datos/espacio de nombres para el directorio y
el protocolo. No obstante, LDAP está diseñado para ejecutarse
directamente sobre la pila TCP/IP. Vea a LDAP como una versión ligera
de X.500.
No lo entiendo. ¿Qué es un directorio?
Un directorio es una base de datos especializada diseñada para
frecuentes consultas pero para infrecuentes actualizaciones. A
diferencia de las bases de datos generalistas, no contiene soporte
para transacciones o funcionalidad de vuelta atrás
("roll-back"). Los directorios son fácilmente replicados
para incrementar disponibilidad y fiabilidad. Cuando los directorios
son replicados, se permiten inconsistencias temporales con tal de que
acaben siendo finalmente sincronizadas.
¿Cómo está estructurada la información?
Toda la información dentro de un directorio está estructurada
jerárquicamente. Aún más, si intenta introducir datos en el
directorio, el directorio debe conocer cómo almacenar estos datos
en un árbol. Eche un vistazo a la compañía de ficción y a su
organigrama:
Listado de Código 1.1: Estructura organizativa de GenFic, una empresa Gentoo Ficticia |
dc: com
|
dc: genfic
/ \
ou: Personas servidores
/ \ ..
uid: .. John
|
Puesto que no puede alimentar la base de datos con este tipo de
"ascii-art", cada nodo de tal árbol debe ser definido. Para
nombrar tales nodos, LDAP usa un sistema de definición de nombres. La
mayor parte de distribuciones de LDAP (incluyendo OpenLDAP) ya
contienen un buen número de esquemas predefinidos (y comúnmente
aprobados), como el "inetorgperson", frecuentemente
utilizado para definir usuarios.
Animamos a las personas interesadas a leer la Guía de Administración
OpenLDAP.
Pero ... ¿para qué se utiliza?
LDAP puede ser utilizado con varios propósitos. En este documento se
trata la administración centralizada de usuarios, manteniendo todas
las cuentas de usuario en una única ubicación LDAP (lo que no
significa que esté albergada en un único servidor, puesto que LDAP
soporta alta disponibilidad y redundancia), y sin embargo LDAP puede
utilizarse igualmente para otros fines:
- Infraestructura de clave pública
- Calendario compartido
- Libreta de direcciones compartida
- Almacenamiento para DHCP, DNS, ...
-
Directivas de configuración para las clases del sistema (guardando
registro de las configuraciones de varios servidores)
- ...
2.
Configurando OpenLDAP
Configuración inicial
Nota:
En este documento utilizamos la dirección genfic.com como
ejemplo. Deberá, desde luego, cambiarlo. Sin embargo, asegúrese
que el nodo superior es un dominio oficial de primer nivel (net,
com, cc, be, ...).
|
Primero instale OpenLDAP:
Listado de Código 2.1: Instalación de OpenLDAP |
# emerge openldap
|
Ahora cree una contraseña que usará después:
Listado de Código 2.2: Generar una contraseña |
# slappasswd
New password: mi-contraseña
Re-enter new password: mi-contraseña
{SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4
|
Ahora edite la configuración del Servidor LDAP en
/etc/openldap/slapd.conf. Abajo mostramos un ejemplo de
fichero de configuración con el que se puede comenzar. Para un
análisis más detallado del fichero de configuración, le sugerimos que
trabaje con la guía del administrador de OpenLDAP.
Listado de Código 2.3: /etc/openldap/slapd.conf |
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/misc.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
serverID 0
loglevel 0
access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
by self write
by users read
by anonymous read
database hdb
suffix "dc=genfic,dc=com"
checkpoint 32 30
rootdn "cn=Manager,dc=genfic,dc=com"
rootpw "{SSHA}EzP6I82DZRnW+ou6lyiXHGxSpSOw2XO4"
directory "/var/lib/openldap-ldbm"
index objectClass eq
syncrepl rid=000
provider=ldap://ldap2.genfic.com
type=refreshAndPersist
retry="5 5 300 +"
searchbase="dc=genfic,dc=com"
attrs="*,+"
bindmethod="simple"
binddn="cn=ldapreader,dc=genfic,dc=com"
credentials="ldapsyncpass"
index entryCSN eq
index entryUUID eq
mirrormode TRUE
overlay syncprov
syncprov-checkpoint 100 10
|
Luego edite el fichero de configuración del cliente LDAP:
Listado de Código 2.4: /etc/openldap/ldap.conf |
# nano -w /etc/openldap/ldap.conf
BASE dc=genfic, dc=com
URI ldap://ldap.genfic.com:389/ ldap://ldap1.genfic.com:389/ ldap://ldap2.genfic.com:389/
TLS_REQCERT allow
TIMELIMIT 2
|
Ahora edite /etc/conf.d/slapd y ajuste la siguiente línea
OPTS:
Listado de Código 2.5: /etc/conf.d/slapd |
OPTS="-h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
|
Finalmente, cree la estructura /var/lib/openldap-ldbm:
Listado de Código 2.6: Preparar la localización openldap-ldbm |
~# mkdir -p /var/lib/openldap-ldbm
~# chown ldap:ldap /var/lib/openldap-ldbm
~# chmod 700 /var/lib/openldap-ldbm
|
Inicie slapd:
Listado de Código 2.7: Iniciar SLAPd |
# /etc/init.d/slapd start
|
Puede probarlo con la siguiente instrucción:
Listado de Código 2.8: Prueba del servicio SLAPd |
# ldapsearch -x -D "cn=Manager,dc=genfic,dc=com" -W
|
Si recibe un error, pruebe a añadir -d 255 para incrementar el
nivel de detalle de los avisos y poder resolver el problema que pueda
tener.
3.
Replicación
Si necesita alta disponibilidad
Si su entorno requiere alta disponibilidad, entonces necesitará configurar
la replicación de los cambios a través de múltiples sistemas LDAP. La
replicación dentro de OpenLDAP, en esta guía, se configura utilizando una
cuenta especial de replicación (ldapreader) la cual posee
privilegios de lectura en el servidor LDAP primario y que toma los
cambios relizados en este servidor LDAP primario al secundario.
Esta configuración es entonces copiada, permitiendo al servidor LDAP
secundario actuar igual que el primario. Gracias a la estructura interna
de OpenLDAP, los cambios no se aplican de nuevo si ya están en la
estructura LDAP.
Configurando la replicación
Para configurar la replicación, en primer lugar realice la configuración
de un segundo servidor OpenLDAP, del mismo modo que se ha descrito
arriba. Sin embargo, tenga cuidado de que, en el fichero de configuración:
-
el proveedor de la replicación sincronizada apunta al
otro sistema, y
-
el serverID de cada sistema OpenLDAP es diferente.
A continuación, cree la cuenta de sincronización. Crearemos un fichero
LDIF (el formato utilizado como entrada de datos para los servidores
LDAP) y añádalo a cada servidor LDAP:
Listado de Código 3.1: Crear la cuenta ldapreader |
~# slappasswd -s contraseñademilector
{SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM
~# cat ldapreader.ldif
dn: cn=ldapreader,dc=genfic,dc=com
userPassword: {SSHA}XvbdAv6rdskp9HgFaFL9YhGkJH3HSkiM
objectClass: organizationalRole
objectClass: simpleSecurityObject
cn: ldapreader
description: Lector LDAP utilizado para sincronización
~# ldapadd -x -W -D "cn=Manager,dc=genfic,dc=com" -f ldapreader.ldif
Password:
|
4.
Configuración del cliente
Migrar los datos existentes a ldap
Configurar OpenLDAP para su administración centralizada y la gestión de
elementos Linux/Unix comunes, no es fácil. Gracias a algunas herramientas
y guiones disponibles en Internet, la migración desde un punto de vista
de un sistema de administración simple a un sistema centralizado y
gestionado basado en OpenLDAP no es muy complicado.
Vaya a
http://www.padl.com/OSS/MigrationTools.html
y descargue los guiones que allí se encuentren. Necesitará las
herramientas de migración y el guión make_master.sh.
A continuación, extraiga las herramientas y copie el guión
make_master.sh dentro de la localización extraída:
Listado de Código 4.1: Extrar MigrationTools (Herramientas de migración) |
~# mktemp -d
/tmp/tmp.zchomocO3Q
~# cd /tmp/tmp.zchomocO3Q
~# tar xvzf /path/to/MigrationTools.tgz
~# mv /camino/a/make_master.sh MigrationTools-47
~# cd MigrationTools-47
|
El siguiente paso ahora es migrar la información de su sistema a OpenLDAP.
Esto se realiza con el guión make_master.sh después de
proporcionarle la información relacionada con su estructura y entorno LDAP.
En el momento de escribir esta guía, las herramientas necesarias, requieren
las siguientes entradas:
| Entrada |
Descripción |
Ejemplo |
| LDAP BaseDN |
La localización base (raíz) de su árbol |
dc=genfic,dc=com |
| Mail domain |
Dominio utilizado en las direcciones de correo electrónico |
genfic.com |
| Mail host |
Nombre de dominio completamente cualificado (FQDN) de la
infraestructura de su servidor de correo |
smtp.genfic.com |
| LDAP Root DN |
Información de la cuenta administrativa de su estructura LDAP |
cn=Manager,dc=genfic,dc=com |
| LDAP Root Password |
Contraseña de la cuenta administrativa, comparar con el comando
slappasswd anterior
|
|
La herramienta también le preguntará qué cuentas y ajustes necesita migrar.
Configuración de PAM
En primer lugar, configuraremos PAM para permitir la autorización con
LDAP. Instalemos sys-auth/pam_ldap ya que PAM soporta la
autentificación LDAP, y sys-auth/nss_ldap porque nuestro
sistema puede negociar con servidores LDAP para obtener información
adicional (usado por nsswitch.conf).
Listado de Código 4.2: Instalar pam_ldap y nss_ldap |
# emerge pam_ldap nss_ldap
|
Ahora añada las siguientes líneas en los lugares adecuados de
/etc/pam.d/system-auth:
Listado de Código 4.3: /etc/pam.d/system-auth |
auth sufficient pam_ldap.so use_first_pass
account sufficient pam_ldap.so
password sufficient pam_ldap.so use_authtok use_first_pass
session optional pam_ldap.so
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account sufficient pam_ldap.so
account required pam_unix.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3
password sufficient pam_unix.so try_first_pass use_authtok nullok md5 shadow
password sufficient pam_ldap.so use_authtok use_first_pass
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
|
Ahora cambie /etc/ldap.conf para que tenga:
Listado de Código 4.4: /etc/ldap.conf |
suffix "dc=genfic,dc=com"
bind_policy soft
bind_timelimit 2
ldap_version 3
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
pam_password exop
scope one
timelimit 2
uri ldap://ldap.genfic.com/ ldap://ldap1.genfic.com ldap://ldap2.genfic.com
|
Luego, copie el fichero (OpenLDAP) ldap.conf del servidor en el
cliente para que éste tenga en cuenta el entorno LDAP:
Listado de Código 4.5: Copiar el OpenLDAP ldap.conf |
# scp ldap-server:/etc/openldap/ldap.conf /etc/openldap
|
Finalmente, configure sus clientes para que verifiquen en LDAP las
cuentas de sistema:
Listado de Código 4.6: /etc/nsswitch.conf |
passwd: files ldap
group: files ldap
shadow: files ldap
|
Si observa, una de las lineas copiadas en su /etc/ldap.conf
está comentada (la línea rootbinddn): no la necesita salvo que
quiera cambiar la contraseña de un usuario como superusuario. En este
caso, necesita escribir la contraseña de root en
/etc/ldap.secret con texto en claro. Esto es
PELIGROSO por lo que debería tener permisos "600".
Lo que debe hacer es mantener el fichero vacío y cuando necesite cambiar
cualquier contraseña que está tanto en ldap como en
/etc/passwd escriba la contraseña en él durante 10 segundos
mientras hace los cambios y bórrela cuando haya acabado.
5.
Seguridad del servidor LDAP
Permisos de OpenLDAP
Si echamos un vistazo a /etc/openldap/slapd.conf podrá
ver que se pueden especificar ACLs (listas de control de acceso, o
permisos, si lo prefiere) de qué datos pueden los usuarios leer y/o
escribir:
Listado de Código 5.1: /etc/openldap/slapd.conf |
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by users read
by anonymous auth
access to attrs=userPassword,gecos,description,loginShell
by self write
|
Esto le da acceso a todo a lo que a un usuario le está permitido
cambiar. Si es su información, entonces tiene acceso de escritura; si
es la de otro usuario, entonces puede leerla; un usuario anónimo puede
enviar un usuario/contraseña para ser conectado. Hay cuatro niveles,
del menor al mayor: autorización búsqueda lectura escritura.
La siguiente ACL es un poco más segura puesto que impide a los
usuarios normales leer la contraseña enmascarada de otros usuarios:
Listado de Código 5.2: /etc/openldap/slapd.conf |
access to attrs="userPassword"
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by anonymous auth
by self write
by * none
access to *
by dn="uid=John,ou=People,dc=genfic,dc=com" write
by * search
|
Este ejemplo le da acceso a root y John para leer/escribir/buscar en
todo el árbol por debajo de dc=genfic,dc=com. También
permite a los usuarios cambiar su propia userPassword. Y
en la sentencia final cualquier otro tiene la capacidad de búsqueda,
lo que significa que puede introducir un filtro de búsqueda pero no
puede leer los resultados de la búsqueda. Puede tener múltiples ACLs
pero la regla de procesamiento es de abajo arriba, por lo que su nivel
superior debe ser el más restrictivo.
6.
Trabajando con OpenLDAP
Manteniendo el directorio
Puede empezar utilizando el directorio para autentificar usuarios en
apache/proftpd/qmail/samba. Puede administrarlo con phpldapadmin,
diradm, jxplorer o lat, que proporcionan interfaces de administración
sencillos.
7.
Agradecimientos
Quisiera agradecer a Matt Heler el préstamo de su equipo para poder
realizar esta guía. Gracias también a toda la gente simpática de #ldap
@ irc.freenode.net.
El contenido de este documento, a no ser que se especifique
expresamente, está registrado bajo los términos de la licencia
CC-BY-SA-2.5. Se aplican las
Pautas de
Utilización del logo y nombre de Gentoo.
|