Usar posixGroups como listas de distribución de correo en postfix

Una de las cosas que uno comunmente diseña en una organización son los grupos, que permiten cosas como por ejemplo, permisología de carpetas, en samba los permisos y seguridad sobre recursos compartidos, etc.

Ahora, usaremos los grupos como listas de distribución de correo (como mailman, pero sin suscripción) para enviar correo masivamente a todos sus miembros.

Los grupos Posix

Los grupos en directorios LDAP se crean usando posixGroups, los grupos posix son un tipo de entrada muy común en LDAP y tienen más o menos la siguiente forma:

dn: cn=redes,ou=Redes,ou=Coordinacion de Tecnologia de la Informacion,ou=unidades,dc=vive,dc=gob,dc=ve
sambaGroupType: 5
cn: redes
objectClass: posixGroup
objectClass: sambaGroupMapping
sambaSID: S-1-5-21-2102913520-367280055-1561271698-25000
gidNumber: 25000
memberUid: vgainza
memberUid: hfernandez
memberUid: vcastillo
memberUid: jesuslara

Para Samba, el atributo sambaSID representa la concatenación entre el gidNumber (identificador posix) y el SID del Dominio, para ello se agrega el objectClass sambaGroupMapping, el tipo de grupo (sambaGroupType) es 5; para todos aquellos grupos que contienen cuentas de personas.

Agregando atributos para correo a los grupos

Suelo usar el objectClass qmailGroup (del qmail.schema) para darle este tipo de atributos los grupos; como postfix utiliza tablas que pueden ser construidas con los atributos que queramos, esta me parece la más útil que he encontrado (y a diferencia de otros que he encontrado, este OID está aceptado por la IANA).

Para usar qmailGroup, primero debemos agregar a openLDAP el schema qmail.schema, que podemos encontrar acá:

http://www.zytrax.com/books/ldap/ape/qmail.html

Luego de agregarlo en el /etc/ldap/slapd.conf en la zona de inclusión de schemas:

include         /etc/ldap/schema/qmail.schema

Buscamos la defición de índices en openLDAP y agregamos los siguientes:

index   mail                                                                    pres,eq,sub,subinitial
index   mailAlternateAddress, mailForwardingAddress                             eq,sub

Para mail, podemos hacer búsquedas de tipo igualdad, presencial, por substring (ej. *prueba*@*) o de tipo subinitial (jesus*), también agregamos los mailAlternateAddress (para direcciones Alias) y mailForwardingAddress (para Forwarding o re-envio de correo).

Indizamos y reiniciamos nuestro openLDAP:

slapindex -f /etc/ldap/slapd.conf #recuerde retornar al usuario openldap la raiz de la DB de openldap (/var/lib/ldap)
/etc/init.d/slapd restart

Ya podemos hacer uso de qmailGroup con los posixGroups.

Grupos con qmailGroup

Al agregarle el atributo qmailGroup a un grupo, este podrá tener los siguientes atributos adicionales:

dn: cn=redes,ou=Redes,ou=Coordinacion de Tecnologia de la Informacion,ou=unidades,dc=vive,dc=gob,dc=ve
cn: redes
objectClass: qmailGroup
mail: redes@vive.gob.ve
mailAlternateAddress: soporteredes@vive.gob.ve
mailAlternateAddress: migracion@vive.gob.ve
mailMessageStore: /bin/false

El grupo redes, tendrá una dirección que será igual a redes@vive.gob.ve; pero adicionalmente un par de “alias”, que serán soporteredes@vive.gob.ve y migracion@vive.gob.ve; mailMessageStore lo usa qmail para determinar donde quedará el mailbox, pero como uso postfix y eso es definido en otro lado, ese atributo realmente no es utilizado.

Creando la tabla de distribución en postfix

Para que postfix pueda entender la dirección como un grupo, esta debe ser un virtual_alias y postfix debe endender esto; para ello debemos hacer los siguientes cambios en el /etc/postfix/main.cf:

Nota: para que postfix entienda grupos y aliases, deben comentar o eliminar la siguiente línea:

receive_override_options = no_address_mappings

Luego, en el virtual_alias_maps agregamos:

virtual_alias_maps = ldap:/etc/postfix/ldap/virtual_groups.cf, ldap:/etc/postfix/ldap/virtual_aliases.cf

Con este par de cambios, postfix mirará en las tablas virtual_groups y virtual_aliases para obtener los grupos a donde enviará correo.

Ahora, es hora de crear esas tablas.

Postfix LDAP tables

La tabla (además de los atributos comunes dedicado a la conexión, búsqueda y bind) queda de la siguiente manera:

/etc/postfix/ldap/virtual_groups.cf

scope = sub
search_base = dc=vive,dc=gob,dc=ve
query_filter = (&(objectClass=qmailGroup)(objectClass=posixGroup)(|(mail=%s)(mailAlternateAddress=%s)))
result_attribute = memberUid
result_format = %u@%d

La tabla busca toda entrada que sea objectClass posixGroup y además qmailGroup, que la dirección esté en mail o en mailAlternateAddress (lo que permite los aliases).

La tabla retorna el valor memberUid (miembro del grupo), pero como la necesitamos en la forma de una dirección de correo, el formato del resultado es igual a el atributo de resultado concatenado con ‘@’ y seguido del dominio desde donde se hizo la llamada (esto permite obviamente el uso de esta tabla en configuraciones multi-dominio).

Para permitir grupos de forwarding (re-direcciones) la tabla queda más o menos de la siguiente forma:

query_filter = (&(objectClass=qmailUser)(objectClass=account)(|(mail=%s)(mailAlternateAddress=%s)))
result_attribute = mailForwardingAddress

Esta tabla busca una cuenta genérica account + qmailUser y retorna mailForwardingaddress, para hacer las redirecciones.

Una entrada LDAP básica para un forwarding sería:

dn: uid=cursoldap,ou=alias,ou=correo,ou=servicios,dc=vive,dc=gob,dc=ve
objectClass: account
objectClass: qmailUser
mail: cursoldap@vive.gob.ve
uid: cursoldap
mailForwardingAddress: redes@vive.gob.ve
mailForwardingAddress: jesuslarag@gmail.com
mailForwardingAddress: fernandezharold@gmail.com

En esta entrada (un tipo de grupo más complejo que posixGroup), podemos hacer forwarding distribuido, un correo enviado a cursoldap@vive.gob.ve será redirigido a redes@vive.gob.ve (un grupo posix) a jesuslarag@gmail.com (mi correo gmail) y a fernandezharold@gmail.com (el correo de Harold en gmail, claro, es ficticio ;)); incluso podríamos enviarlo a un comando (ejemplo, mailman o un SMS script en python de un artículo anterior); pero los envios de correos electrónicos a comandos de Linux, serán para otro artículo.😉

Pues bien, cuando ambas tablas estén listas; debemos primero, probarlas con postmap.

Probando tablas con postmap

postmap es un comando que permite “explorar” las tablas hash, mysql o ldap de postfix y verificar que el mapping (mapeo) se está haciendo correctamente; su sintaxis es:

postmap -q [direccion a consultar] [postfix lookup map: mysql,ldap,hash]:[ruta al archivo .cf de la tabla]

Un ejemplo, ejecutar:

postmap -q redes@vive.gob.ve ldap:/etc/postfix/ldap/virtual_groups.cf

Nos trae como resultado:

vgainza@vive.gob.ve,hfernandez@vive.gob.ve,vcastillo@vive.gob.ve,jesuslara@vive.gob.ve

Con lo que verificamos que la tabla funciona y por ende podemos reiniciar el postfix.

ejecutamos:

postfix reload

ó

/etc/init.d/postfix reload

Para actualizar los cambios en el postfix.

Ya tenemos la posibilidad de al enviarle un correo a un grupo, este sea re-direccionado a sus miembros y si enviamos a una dirección de forward; sea redireccionado a la(s) persona(s) agregada(s) a la lista de re-dirección.

Notas:

Podrías crear una tabla postfix que no requiera qmailGroup; es decir, buscar todos los posixGroups y en vez de mail=%s usan cn=%u, claro, esto convertiría a TODOS los posixGroups en listas de distribución de correo y en mi caso institucional, no deseamos eso (hay que tener el control de los grupos que reciben correo y cuales no).

En vista de que mi transporte es postfix (salvo virtual_transport=dovecot gracias a deliver), no necesito nexthop para hacer que la lista de forwarding funcione (una dirección @gmail.com es asumida que no forma parte del transporte virtual, así que es no es entregada a deliver sino que es postfix quien intenta resolver su entrega); esto se logra gracias a que:

virtual_alias_domains =

está vacio (permitiendo alias hacia cualquier dominio) y seteando obviamente a:

virtual_mailbox_domains = ldap:/etc/postfix/ldap/virtual_domains.cf

Que si son los dominios “internos” los cuales tienen mailbox (buzón) en mi servidor.

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 27 marzo 2010 en Cultura Libre, Linux, PlanetaLinux, trucos de la abuela, Weyu y etiquetado en , , , , , . Guarda el enlace permanente. 4 comentarios.

  1. Buena nota, sólo es bueno resaltar que la semántica de grupos no es estable, y sobre todo en entornos POSIX nos afectaría bastante un cambio de prácticas; groupOfNames es una forma más sensata (y que en el mundo Red Hat se ve con mejores ojos) de manejar los grupos, ya que evita la ubicua necesidad de hacer dos consultas para identificar los datos de pertenencia a un grupo. Hay algunas aplicaciones afuera que miran groupOfNames en vez de o antes de posixGroup aunque afortunadamente seguimos lejos de tener que cambiar.

    • phenobarbital

      Bueno, de hecho la tabla postfix toma memberUid y la concatena con el dominio que hace la llamada (solución fácil y medio chaborra), así que realmente no hay 2 consultas; groupOfNames y GroupOfUniqueNames son ideales como estructuras para crear grupos que reflejen pertenencia en LDAP; podemos entonces agregar un atributo adicional a la tabla que devuelva el correo electrónico de los miembros (a menos que tengamos que resolver a partir del DN en groupOfNames el correo, ahí si habría 2 consultas); sin embargo, esto amerita tener grupos de tipo LDAP para labores de LDAP y grupos de tipo POSIX para labores como permisos y Samba; para organizaciones pequeñas el usar posixGroups como listas de distribución directa se refleja en una menor cantidad de objetos diversos para fines similares y obviamente una simplificación en la administración.
      La idea surgió precisamente de darle “simplicidad” a la administración de grupos y no agregarle más complejidad …
      Recuerdo de hecho que groupOfNames se hizo popular a raíz de su uso por MS Exchange para representar “precisamente” los grupos y sus listas de distribución por allá por la versión 5 (1999-2000), me gusta la idea de popularizar “posixGroups” ya que es algo más de “este lado del charco” …
      Gracias por el comentario!🙂

  1. Pingback: Usar posixGroups como listas de distribución de correo en postfix « Cursos SmartDreams

  2. Pingback: Usar posixGroups como listas de distribución de correo en postfix « Cursos en SmartDreams.cl

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: