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.

Publicación original de Phenobarbital.

Agregar comentario

Categorías

Enlaces

Estadísticas


eXTReMe Tracker