Postfix con usuarios virtuales en openLDAP


Es habitual que los usuarios de los diferentes servicios no se correspondan con usuarios locales (los que aparecen en /etc/passwd) del equipo que actúa como servidor, es más, habitualmente estos servidores tienen muy pocos usuarios locales. Para los usuarios de los servicios se suele utilizar el término usuarios virtuales, que pueden estar ubicados en ficheros, bases de datos relaciones o, quizás lo más adecuado, servidores LDAP.

En esta entrada explicamos cómo se configura un servidor postfix con usuarios virtuales en openLDAP, bueno realmente sólo explicamos cómo recibir correo para usuarios virtuales en openLDAP, la configuración de postfix para que los usuarios de un servidor LDAP estén autorizados para enviar correo es diferente e implica la configuración de SASL para autenticar esos usuarios y habitualmente TLS. La configuración que veremos a continuación no es complicada, pero como siempre que utilizamos postfix, es necesario comprender lo mejor posible el funcionamiento paso a paso y una vez hecho esto, veremos cómo encaja todo perfectamente.

Software utilizado

Todo el montaje se ha realizado utilizando la versión de pruebas de Debian GNU/Linux (squeeze), que incluye las siguientes versiones de openLDAP y postfix:

  • OpenLDAP: 2.4.23-7
  • Postfix: 2.7.1-1

Local Mail Delivery/Virtual Mail Delivery

Vamos a explicar a continuación el funcionamiento de los demonios de postfix para la recepción de correo de usuarios locales (local delivery agent) y virtuales (virtual delivery agent). Local delivery agent realiza los siguientes pasos cuando recibe un mensaje de correo:

  1. Comprueba que el dominio del destinatario está entre los dominios definidos en $mydestination (en nuestro caso será sólo localhost). Si el dominio está en $mydestination continúa en el siguiente paso, en caso contrario rechaza el mensaje.
  2. A continuación comprueba que el usuario local existe, es decir que tiene una entrada en el fichero /etc/passwd o en /etc/aliases si se trata de un alias de correo. En caso afirmativo el buzón del usuario será /var/mail/nombre_de_usuario (/var/mail/nombre_de_usuario/ si está en formato Maildir), en caso negativo rechaza el mensaje.
  3. Por último, a la hora de guardar el mensaje en el buzón del usuario, necesita saber el uid y gid del propietario del buzón, que se obtiene del fichero /etc/passwd para cada usuario y el gid utiliza siempre el valor 8 (gid estándar del grupo mail).

De forma equivalente, virtual delivery agent realiza los siguientes pasos:

  1. Comprueba que el dominio del destinatario está entre los dominios definidos en $virtual_mailbox_domains (en nuestro caso será example.com). Si el dominio está en esa variable continúa en el siguiente paso, en caso contrario rechaza el mensaje.
  2. A continuación comprueba que el usuario existe, para lo cual realiza una consulta al servidor LDAP, preguntando si hay algún objeto con la dirección de correo del destinatario del mensaje y en caso afirmativo cuál es la ubicación de su buzón de correos.
  3. El uid y gid podrían estar también definidos en LDAP, pero en nuestro caso vamos a hacer la simplificación de ponerlas estáticas (uid=10000 y gid=8).

Configuración de openLDAP

La instalación básica de openLDAP no incluye ningún objeto válido que tenga un atributo para definir buzones de correo, así que debemos instalar algún esquema nuevo que lo incluya. Postfix es totalmente indiferente al objeto utilizado para definir los usuarios virtuales en LDAP y no incluye ningún esquema propio para LDAP, podemos utilizar el de qmail, courier o cualquiera que encontremos por ahí en el que se pueda definir una dirección de correo y un buzón asociado, en nuestro caso vamos a utilizar qmail.schema. No vamos a explicar aquí la forma de añadir este esquema a openLDAP, una explicación detallada puede verse en Añadir un nuevo esquema en OpenLDAP 2.4.

Una vez añadido qmail.schema a openLDAP podemos crear un nuevo objeto en nuestro directorio que utilice el objetClass qmailUser (hemos puesto sólo los atributos obligatorios o que necesitamos, un objeto real seguramente tendría más atributos) como el siguiente:

dn: uid=usuariovirtual,ou=People,dc=example,dc=com
uid: usuariovirtual
objectClass: top
objectClass: person
objectClass: inetOrgPerson
objectClass: qmailUser
cn: Usuario Virtual
mail: usuariovirtual@example.com
mailMessageStore: example.com/usuariovirtual/
givenName: Nombre
sn: Apellidos

En este objeto la dirección de correo está definida por el atributo mail y el buzón por mailMessageStore, realmente la ubicación del buzón de correos se forma componiendo la variable $virtual_mailbox_base que es igual para todos los usuarios y el buzón definido para cada usuario. En algunos manuales utilizan $virtual_mailbox_base = / y definen el buzón completo en el atributo de LDAP (por ejemplo var/mail/example.com/usuariovirtual/), nosotros vamos a utilizar $virtual_mailbox_base = /var/mail/ y el resto definirlo para cada usuario. Se defina como se defina, hay que tener cuidado en no duplicar las barras al componer la ubicación del buzón, es decir que no quede algo como /var/mail//example.com/usuariovirtual/, que sería una ubicación incorrecta.

Configuración de postfix

Partimos de una configuración inicial válida de /etc/postfix/main.cf sólo para reparto local, en la que tenemos el siguiente valor en $mydestination:

mydestination = localhost

Para utilizar usuarios virtuales para el dominio destino example.com, añadimos las siguientes líneas:

virtual_mailbox_domains = example.com
virtual_mailbox_maps = ldap:/etc/postfix/usuarios_ldap
virtual_mailbox_base = /var/mail/
virtual_minimum_uid = 100
virtual_uid_maps = static:10000
virtual_gid_maps = static:8
virtual_alias_maps = hash:/etc/postfix/virtualaliases

Creamos el fichero usuarios_ldap para buscar los buzones en el servidor LDAP:

server_host = 10.0.0.1
version = 3
search_base = dc=example,dc=com
scope = sub
query_filter = mail=%s
result_attribute = mailMessageStore
ldap_bind = no

Esto explica que postfix sea indiferente al objeto de LDAP utilizado, ya que en este fichero definimos el atributo que almacena la dirección de correo del usuario virtual (mail en nuestro caso) y el que almacena la ubicación relativa del buzón (mailMessageStore en nuestro caso). Para comprobar si postfix procesará bien este fichero podemos utilizar postmap:

# postmap -q usuariovirtual@example.com ldap:/etc/postfix/usuarios_ldap

que debe devolver la ubicación relativa del buzón:

example.com/usuariovirtual/

Para los alias no es necesario utilizar LDAP ya que suelen ser pocos y no cambian frecuentemente, por lo que utilizamos el fichero /etc/postfix/virtualaliases con el siguiente contenido:

mailer-daemon@example.com usuariovirtual
postmaster@example.com usuariovirtual
abuse@example.com usuariovirtual

y lo transformamos con postmap para que lo pueda procesar postfix:

# postmap /etc/postfix/virtualaliases

que genera el fichero /etc/postfix/virtualaliases.db.

Pruebas de funcionamiento

Para comprobar que todo está correctamente configurado enviamos desde otro equipo un mensaje al destinatario usuariovirtual@example.com, que genera los siguientes registros en /var/log/mail.log:

postfix/smtpd[1278]: connect from unknown[10.0.0.128]
postfix/smtpd[1278]: 0217933A52: client=unknown[10.0.0.128]
postfix/cleanup[1285]: 0217933A52: message-id=
postfix/qmgr[1084]: 0217933A52: from=, size=205, nrcpt=1 (queue active)
postfix/virtual[1286]: 0217933A52: to=, relay=virtual, delay=17, delays=16/0.1/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
postfix/qmgr[1084]: 0217933A52: removed

El mensaje se almacena en el directorio usuariovirtual (al terminar el buzón en / postfix lo interpreta como un buzón en formato Maildir adecuado para utilizar después un servidor IMAP):

drwx--S--- 5 10000 mail 4096 dic 11 12:27 usuariovirtual

Para probar el funcionamiento de los alias, enviamos un mensaje al destinatario abuse@example.com, que realmente se almacena en el buzón de usuariovirtual:

postfix/smtpd[1332]: A8B6833A52: client=unknown[10.0.0.128]
postfix/cleanup[1337]: A8B6833A52: message-id=
postfix/qmgr[1084]: A8B6833A52: from=, size=226, nrcpt=1 (queue active)
postfix/virtual[1338]: A8B6833A52: to=, orig_to=, relay=virtual, delay=35, delays=35/0.15/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
postfix/qmgr[1084]: A8B6833A52: removed

Referencias

, , , ,

  1. #1 por Arturo Borrero el 13-01-11 - 11:14 pm

    Creo que hay una errata:
    Para los alias no es necesario utilizar LDAP ya que suelen ser pocos y no cambian frecuentemente, por lo que utilizamos el fichero /etc/ldap/virtualaliases con el siguiente contenido:
    mailer-daemon@example.com usuariovirtual
    postmaster@example.com usuariovirtual
    abuse@example.com usuariovirtual
    y lo transformamos con postmap para que lo pueda procesar postfix:
    # postmap /etc/postfix/virtualaliases
    que genera el fichero /etc/postfix/virtualaliases.db.

    se menciona a /etc/ldap/virtualaliases, y creo que en todo momento hablamos de /etc/postfix.

    ¿Es esto cierto?

    Me gusta

  2. #3 por Paco el 27-02-16 - 2:51 pm

    Buenos días, gran tutorial, quería hacerte una pregunta. ¿Cómo harías para conectar ese usuario virtual con thunderbird o Outlook?

    Me gusta

    • #4 por albertomolina el 27-02-16 - 6:40 pm

      Hola Paco,

      En ese caso no hay ninguna diferencia con cualquier otro usuario del servicio. Tendrás que configurar los parámetros de SMTP y demás como en cualquier otro caso.

      Saludos!

      Me gusta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: