Tabla de Contenidos

Servidor smtp con Postfix y OpenLDAP

(Trabajo en progreso)

Introducción

Para un administrador de red suele ser engorroso tener que administrar diferentes servicios, cada uno con su propio listado de usuarios. Adicionalmente, hay quienes prefieren evitar crear usuarios reales en un servidor, si no han de a trabajar en éste.

Una manera de solucionar ambos problemas consiste en preparar una base centralizada de usuarios, y luego configurar los servicios para que utilicen esta base. Se pueden utilizar varias bases: mySQL, PostgreSQL, LDAP, etc.

En este tutorial utilizaremos OpenLDAP, pues es eficiente, liviano y muchas aplicaciones soportan la integración con el. Para ejemplificarlo, mostraremos cómo configurar Postfix, el popular agente de transporte de correos, a fin de crear un servidor smtp relativamente seguro, que requiera que para poder enviar mensajes, los usuarios necesiten autenticarse y que las contraseñas no se transmitan por la red de manera insegura.

Algunas cosas que se asumen en este tutorial:

Preparativos preliminares

Primeramente, modificaremos el archivo /etc/hosts para incluir algunas entradas. 1)

editor /etc/hosts

Añadiremos a dicho archivo el siguiente contenido:

192.168.0.2    ldap.midominio.org      ldap
192.168.0.2    correo.midominio.org    correo

Esto creará dos direcciones virtuales que resultarán más intuitivas durante la configuración del acceso a cada uno de los servicios.

Ahora, instalaremos algunos programas básicos para efectuar diagnósticos:

aptitude install ssh nmap telnet

La instalación del resto de las aplicaciones se puede hacer de una vez o en dos partes; para facilitar la comprensión, dividiremos la instalación de OpenLDAP y Postfix.

Instalación y configuración de OpenLDAP

Procedemos a instalar el servicio slapd y las utilidades para gestionarlo, así como algunas aplicaciones relacionadas con el proceso de autenticación:

aptitude install slapd ldap-utils libnss-ldap libpam-ldap unscd

Durante el proceso de instalación, el asistente nos debe solicitar la contraseña de administración de OpenLDAP, que será necesaria posteriormente para cualquier modificación del servicio, de manera que la que utilicemos, debemos recordarla o guadarla de una manera segura.2)

Una vez finalizada la instalación, mediante el comando nmap podemos comprobar que el servicio esté funcionando:

nmap -p 389 localhost

Si obtenemos un resultado como el siguiente, significa que el servicio se está ejecutando:

Starting Nmap 5.00 ( http://nmap.org ) at 2011-05-25 10:04 UTC
Interesting ports on localhost (127.0.0.1):
PORT    STATE SERVICE
389/tcp open  ldap

Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds

Ahora editamos el archivo de configuración de OpenLDAP:

editor /etc/ldap/ldap.conf

Modificamos estas entradas, o las agregamos si no existen:

BASE  dc=midominio,dc=org
URI   ldap://ldap.midominio.org/ ldapi://ldap.midominio.org/ ldaps://ldap.midominio.org/

Preparación de la base de datos

A diferencia de versiones anteriores, en Debian Squeeze la manera recomendada de configurar OpenLDAP es mediante archivos LDIF, lo cual permite que cualquier cambio realizado sea efectivo inmediatamente, incluso mientras el servicio se ejecuta.

Comenzaremos creando un directorio temporal y dentro de este un archivo LDIF para modificar la configuración por defecto de la base de datos:

mkdir -p /var/tmp/ldap
editor /var/tmp/ldap/00_olc-config.ldif

Como contenido de dicho archivo, colocaremos esto:

00_olc-config.ldif
# 1.
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
 
# 2.1.
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uid eq
-
# 2.2.
add: olcDbIndex
olcDbIndex: cn eq
-
# 2.3.
add: olcDbIndex
olcDbIndex: ou eq
-
# 2.4.
add: olcDbIndex
olcDbIndex: dc eq

Esto básicamente establece un nivel de trazas más detallado para syslog, y crea índices para acelerar las futuras consultas a la base de datos. 3)

Una vez creado el archivo, procedemos a importarlo a LDAP, para lo cual ejecutamos este comando:

ldapmodify -QY EXTERNAL -H ldapi:/// -f /var/tmp/ldap/00_olc-config.ldif

A continuación detallaremos los parámetros que se han utilizado en este comando:

Parámetro Propósito
Q Habilitar SASL en modo silencioso.
Y Especificar el mecanismo SASL para utilizar en la autenticación (en este caso, EXTERNAL).
H Especificar la URI al servidor de ldap.
f Especificar el archivo que contiene la información (de lo contrario se utiliza la entrada estándar).

Para comprobar que se efectuaron los cambios, ejecutamos el siguiente comando:

ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(cn=config)(olcDatabase={1}hdb))"

En este caso se añade el parámetro L: la primera L hace que los resultados se muestren en formato LDIF, la segunda L deshabilita los comentarios, y la tercera L hace que no se muestre la versión de LDIF.

Unidades organizativas

Ahora crearemos un archivo LDIF para las unidades organizativas:

editor /var/tmp/ldap/01_ou.ldif

En este caso utilizaremos dos unidades organizativas, una para las cuentas de usuarios, y otra para los grupos de cuentas. El contenido del archivo quedaría así:

01_ou.ldif
  dn: ou=usuarios,dc=midominio,dc=cu
  ou: usuarios
  objectClass: organizationalUnit
 
  dn: ou=grupos,dc=midominio,dc=cu
  ou: grupos
  objectClass: organizationalUnit

Una vez terminado, procedemos a aplicarlo:

ldapadd -cxWD cn=admin,dc=midominio,dc=cu -f /var/tmp/ldap/01_ou.ldif

A continuación detallaremos los parámetros que se han utilizado en este comando:

Parámetro Propósito
c Continuar si se encuentran errores.
x Utilizar la autenticación simple (por defecto se utiliza SASL).
W Solicitar la contraseña al usuario.
D Establecer el DN (nombre distinguido) con el cual enlazar al servidor OpenLDAP.
f Especificar el archivo que contiene la información (de lo contrario se utiliza la entrada estándar).

Grupos

A continuación crearemos el archivo para los grupos de cuentas:

editor /var/tmp/ldap/02_grupos.ldif

Para ejemplificar, solamente crearemos dos grupos, uno para los informáticos y otro para el resto de los empleados de la empresa, de modo que como contenido de este archivo, colocaremos algo como esto:

02_grupos.ldif
# grupo 1: cn=informaticos,ou=grupos,dc=midominio,dc=org
dn: cn=informaticos,ou=grupos,dc=midominio,dc=org
cn: informaticos
description: Cuentas de informáticos
gidnumber: 1100
objectclass: posixGroup
 
# grupo 2: cn=empleados,ou=grupos,dc=midominio,dc=org
dn: cn=empleados,ou=grupos,dc=midominio,dc=org
cn: empleados
description: Cuentas de empleados
gidnumber: 1200
objectclass: posixGroup

Ahora procederemos a importar el archivo en OpenLDAP:

ldapadd -cxWD cn=admin,dc=midominio,dc=org -f /var/tmp/ldap/02_grupos.ldif

Usuarios

Una vez creados los grupos, necesitamos poblarlos, y para esto crearemos otro archivo:

editor /var/tmp/ldap/03_usuarios.ldif

Como contenido de dicho archivo colocaremos los detalles de cada usuario. En este tutorial crearemos solamente un informático y un contador, y para esto utilizaremos la clase de LDAP inetOrgPerson, pues ofrece muchos campos útiles que nos evitarán tener que agregar más clases. Aquí solamente llenaremos algunos de estos campos, aunque posteriormente pueden agregarse muchos más, los cual puede resultar más cómodo mediante herramientas como phpLDAPadmin, por ejemplo.

03_usuarios.ldif
dn: uid=sysadmin,ou=usuarios,dc=midominio,dc=org
uid: sysadmin
cn: sysadmin
givenName: System
sn: Administrator
displayName: System Administrator
title: Especialista en informática
description: Administrador del sistema
mail: sysadmin@midominio.org
gidNumber: 1200
uidNumber: 1201
homeDirectory: /home/sysadmin
loginShell: /bin/bash
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
 
dn: uid=juanperez,ou=usuarios,dc=midominio,dc=org
uid: juanperez
cn: juanperez
givenName: Juan
sn: Pérez González
displayName: Juan Pérez González
title: Lic. en contabilidad
description: Contador principal
mail: juanperez@midominio.org
gidNumber: 1200
uidNumber: 1202
homeDirectory: /home/juanperez
loginShell: /usr/sbin/nologin
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount

Nótese que el contador podrá utilizar los diferentes servicios que le sean habilitados porque posee una cuenta en el sistema, pero por motivos de seguridad, no podrá iniciar sesión en el propio servidor a causa del parámetro loginShell: /usr/sbin/nologin.

Una vez más, para aplicar estos cambios, importaremos el archivo LDIF:

ldapadd -cxWD cn=admin,dc=midominio,dc=org -f /var/tmp/ldap/03_usuarios.ldif

Instalación y configuración de Postfix

Ahora procederemos a instalar Postfix junto con algunas utilidades y librerías, y posteriormente editamos el archivo de configuración principal de postfix.

aptitude install postfix postfix-{doc,ldap,pcre} mailutils libsasl2-modules
nano /etc/postfix/main.cf

Modificamos estas entradas, o las agregamos si no existen:

main.cf
# Parámetros principales
mail_owner = postfix
default_privs = nobody
mydomain = midominio.org
myorigin = $mydomain
myhostname = correo.$mydomain
inet_interfaces = $myhostname, localhost
mydestination = $myhostname, $mydomain, localhost
mynetworks = 192.168.0.0/24, 127.0.0.0/8
smtpd_banner = $myhostname ESMTP
 
# Establecer el mapeo de aliases tanto desde archivos como desde LDAP
alias_database = hash:/etc/postfix/aliases
alias_maps = hash:/etc/postfix/aliases, ldap:/etc/postfix/ldap-aliases.cf
 
# Habilitar la verificación de cabeceras
header_checks = regexp:/etc/postfix/header_checks
 
# Establecer el tamaño máximo del mensaje en 2 MiB
message_size_limit = 2097152
 
# Establecer el directorio para la cola de Postfix
queue_directory = /var/spool/postfix
 
# Algunas opciones de seguridad
strict_rfc821_envelopes = yes
smtpd_sender_restrictions = reject_unlisted_sender, reject_non_fqdn_sender
smtpd_recipient_restrictions = reject_unlisted_recipient, reject_non_fqdn_recipient, reject_unauth_destination
smtpd_client_restrictions = permit_mynetworks, reject_unknown_client_hostname
smtpd_reject_footer = Consulte al administrador de la red.
 
# Parámetros TLS
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_security_level = encrypt
smtpd_tls_mandatory_protocols = TLSv1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_session_cache_timeout = 7200s
smtp_tls_note_starttls_offer = yes
smtp_tls_loglevel = 1

Para que toda la configuración relacionada con Postfix esté junta, movemos los alias al directorio de configuración de Postfix, y posteriormente generamos la base de datos de los alias:

mv /etc/aliases /etc/postfix/aliases
postalias /etc/postfix/aliases

Integración con OpenLDAP

Para que Postfix utilice las cuentas que se creen virtualmente mediante OpenLDAP, crearemos un archivo para colocar la información de los alias:

editor /etc/postfix/ldap-aliases.cf

Como contenido de este archivo utilizaremos esto:

ldap-aliases.cf
server_host = ldap.midominio.org
search_base = dc=midominio,dc=org
start_tls = yes
version = 3

Finalmente, refrescamos la base de datos de los alias:

newaliases
1)
La resolución de nombres de dominio también puede gestionarse instalando un DNS, pero para mayor simplicidad, esto no lo trataremos en este tutorial.
2)
Explicar cómo guardar archivos de manera es un tema que se extiende más allá de este tutorial, por lo que no será tratado aquí.
3)
Las líneas que contienen sólo un guión actúan como un separador de modificaciones que se aplican a una misma entrada del directorio.