Creación del directorio HOME para los nuevos usuarios
Es imprescindible que los buzones de correo existan antes de su uso. Por este motivo, cada vez que se añada un usuario de correo, se ha de crear su directorio HOME y el buzón de correo asociado, así como el archivo de recursos para procmail.
Para automatizar esta operación se ha creado el siguiente script:
#!/bin/sh
#
# Copyright (C) 2004 Sergio González González <sergio.gonzalez@hispalinux.es>
#
# Depends on:
# - ldapsearch
# - maildirmake ( from courier )
#
# Based on http://jeroen.protheus.com/postfix-courier-ldap-howto.html
# (c) J.Vriesman
#
# and
#
# Based on http://bulma.net/body.phtml?nIdNoticia=2013
# (c) Jesús Roncero Franco
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Password to bind to ldap server
systempass="1"
# Bind dn
binddn="ou=postfix,dc=gsr,dc=pt"
# Acount leave
accountleave="ou=people,dc=gsr,dc=pt"
# ldap host
ldaphost="gsr.pt"
# Maildir name
maildir="Maildir/"
# Mail users home name
homedir="/home/vmail"
# Mail user's group
group="vmail"
usernames=`ldapsearch -h $ldaphost -x -w $systempass -D "$binddn" \
-b "$accountleave" "(!(quota=-1))" uid \
| grep "^[^#]" | grep "^[^dn]" | grep uid | awk '{ print $2 }'`
# create personal mailfolders
for username in $usernames
do
homedirectory=`ldapsearch -h $ldaphost -x -w $systempass -D "$binddn" \
-b "$accountleave" "(uid=$username)" homeDirectory \
| grep "^[^#]" | grep homeDirectory | grep "$homedir" \
| awk '{ print $2 }'`
if [ ! -d $homedirectory/$maildir ] && [ ! -z $homedirectory ]
then
mkdir -p -m 2750 $homedirectory
maildirmake $homedirectory/$maildir
if [ ! -f $homedirectory/.procmailrc ]
then
echo -ne "PATH=/usr/bin:/bin:/usr/local/bin:.\nMAILDIR=\$HOME/Maildir\n\
DEFAULT=\$MAILDIR/" > $homedirectory/.procmailrc
fi
chown -R $username.$group $homedirectory
fi
done |
El script anterior creará el HOME de los usuarios de correo que no lo tuviesen ya creado, el directorio Maildir en el que se almacenarán los correos enviados al usuario y el archivo .procmailrc, que se encargará de decirle a procmail como se ha de comportar.
![[Note]](http://www.wikilearning.com/imagescc/9774/note.png) |
Nota |
|
Para la correcta ejecución del script se necesita la herramienta maildirmake. Esta herramienta, utilizada para crear un directorio tipo Maildir, viene junto al paquete courier-base. |
![[Important]](http://www.wikilearning.com/imagescc/9774/important.png) |
Importante |
|
Recuerde que cada vez que se añada un usuario al sistema, se ha de ejecutar este script como root. |
Creación de un alias de correo
Para crear un alias de correo, se ha de crear un elemento bajo la hoja ou=alias,ou=postfix,dc=gsr,dc=pt e indicar que hacer cuando llegue un correo a esta cuenta.
En este caso, la plantilla a utilizar es la siguiente:
dn: mail=alias@dominio.com,ou=alias,ou=postfix,dc=gsr,dc=pt
cn: Nombre
mail: alias@dominio.com
maildrop: direccion@destino.com
sn: Apellidos
objectClass: couriermailalias
objectClass: inetOrgPerson
objectClass: Person |
| |
Se utilizará como dn el atributo mail. |
| |
Se corresponde con el alias de uno de los dominios virtuales que se poseen. |
| |
Dirección de destino. Se puede corresponder con una dirección virtual de alguno de los dominios virtuales en su poder o una en otro dominio. Si existe más de una línea con el atributo maildrop, el mensaje que llegue a la cuenta mail se enviará a todas las direcciones especificadas. |
| |
objectClass que especifica que la cuenta es de tipo alias. |
Un ejemplo podía ser el siguiente:
dn: mail=liviana@gsr1.pt,ou=alias,ou=postfix,dc=gsr,dc=pt
cn: Liviana
mail: liviana@gsr1.pt
maildrop: severa@gsr.pt
sn: Sanches
objectClass: couriermailalias
objectClass: inetOrgPerson
objectClass: Person |
Suponiendo que el archivo donde se ha almacenado la información de la captura LDIF para Liviana se denomina liviana.ldif, ha de ejecutar el siguiente comando para añadir la información al directorio LDAP:
Ejemplo 2.12. Adición de un alias con el comando ldapadd
$ /usr/bin/ldapadd -x -D "cn=admin,dc=gsr,dc=pt" -W -h gsr.pt -f liviana.ldif
Enter LDAP Password: [clave]
adding new entry "mail=liviana@gsr1.pt,ou=alias,ou=postfix,dc=gsr,dc=pt"
|
La siguiente imagen muestra de forma gráfica, gracias a phpLDAPadmin, el nuevo alias añadido al directorio LDAP:
Modificación de la configuración de Postfix
En esta sección se mostrarán los aspectos de configuración de Postfix más importantes para hacer uso de un directorio LDAP, entre otras cosas.
![[Tip]](http://www.wikilearning.com/imagescc/9774/tip.png) |
Sugerencia |
|
Durante todo el proceso de configuración de Postfix sería recomendable tener una consola de monitorización de los logs de este programa. Puede ejecutar el siguiente comando en la consola destinada a la monitorización:
# /usr/bin/tail -f /var/log/mail.log | colorize |
El programa colorize se encuentra en el paquete “colorize”, por lo que puede utilizar el comando /usr/bin/apt-get install colorize para instalarlo. |
Configuración de los alias de correo
Como los alias de correo están almacenados en el directorio LDAP hay que decirle a Postfix donde y como ha de realizar las búsquedas. Cuando se especifica: ldap:nombre, nombre va a ser el prefijo que se va a utilizar en una serie de variables de Postfix para especificar la configuración e interrogación de LDAP. De esta forma, para la sentencia ldap:nombre, se deberán definir las siguientes opciones:
-
nombre_server_host: servidor LDAP
-
nombre_search_base: base de las búsquedas en LDAP
-
nombre_query_filter: filtro para la búsqueda
-
nombre_result_attribute: atributos que se quieren leer de los resultados de la búsqueda
-
nombre_bind: ¿es precisa la autentificación?. En este caso no es precisa, ya que la parte a consultar en el directorio LDAP es accesible anónimamente
De esta forma, por ejemplo, para la configuración de los alias de correo, se tendría una configuración como:
#Alias virtuales
virtual_maps = ldap:valiases
valiases_server_host = gsr.pt
valiases_search_base = ou=alias,ou=postfix,dc=gsr,dc=pt
valiases_query_filter = (&(mail=%s)(objectClass=CourierMailAlias))
valiases_result_attribute = maildrop
valiases_bind = no |
![[Note]](http://www.wikilearning.com/imagescc/9774/note.png) |
Nota |
|
En este caso, la búsqueda se realizaría en la rama ou=alias,ou=postfix,dc=gsr,dc=pt, devolviendo como resultado aquellos elementos cuyo atributo mail sea igual a la dirección de correo electrónico que se está buscando, siempre y cuando el objectClass sea CourierMailAlias |
![[Note]](http://www.wikilearning.com/imagescc/9774/note.png) |
Nota |
|
_query_filter utiliza notación prefija, como se puede observar en (&(condición)(condición)). Otros ejemplos podrían ser:
|
Configuración de Postfix para la entrega local
También se desea que el correo local sea administrado por Postfix, de forma que hay que indicárselo en su archivo de configuración. A continuación se verá la forma de hacer esto:
local_transport = local
mydestination = $myhostname $localhost.$mydomain localhost.gsr.pt
local_recipient_maps = unix:passwd.byname $alias_maps |
Esto sería suficiente para la realización de la entrega local.
Configuración preliminar para Postfix
En la Sección 2.8, “Modificación de la configuración de Postfix” se mostraron las opciones necesarias para utilizar el servidor de correo Postfix con LDAP y alias de correo, entre otros. A continuación se verá un archivo de configuración completo, integrando todas las opciones vistas en la Sección 2.8, “Modificación de la configuración de Postfix”:
# see /usr/share/postfix/main.cf.dist for a commented, fuller
# version of this file.
# Do not change these directory settings - they are critical to Postfix
# operation.
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
program_directory = /usr/lib/postfix
setgid_group = postdrop
# appending .domain is the MUA's job.
append_dot_mydomain = no
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no
# Uncomment the next line to generate delayed mail warnings
#delay_warning_time = 4h
myhostname = todoscsi.gsr.pt
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mynetworks = 127.0.0.0/8
#Alias virtuales
virtual_maps = ldap:valiases
valiases_server_host = gsr.pt
valiases_search_base = ou=alias,ou=postfix,dc=gsr,dc=pt
valiases_query_filter = (&(mail=%s)(objectClass=CourierMailAlias))
valiases_result_attribute = maildrop
valiases_bind = no
# Todos los dominios y los usuarios entragados por el agente de entrega local
# local_recipient_maps es usado por el servidor SMTP para rechazar el correo
# de los usuarios no conocidos
local_transport = local
mydestination = $myhostname $localhost.$mydomain localhost.gsr.pt
local_recipient_maps = unix:passwd.byname $alias_maps
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = + |
Una vez modificado el archivo de configuración de Postfix, este ha de releer su configuración, para ello teclee:
Ejemplo 2.13. Releyendo la configuración de Postfix
# /etc/init.d/postfix reload
Reloading Postfix configuration...done. |
Ahora se puede probar el envío de un correo para la cuenta <liviana@gsr.pt>:
Ejemplo 2.14. Envío de un correo a <liviana@gsr.pt>
$ /usr/bin/mail liviana@gsr1.pt
Subject: Prueba
Cuerpo del mensaje
.
Cc: [enter] |
Si tras ejecutar el Ejemplo 2.14, “Envío de un correo a <liviana@gsr.pt>” se mira en el archivo de log /var/log/mail.log se verá una entrada parecida a:
Ejemplo 2.15. Entrada en el log indicando el envío de un correo
Jun 4 11:29:06 todoscsi postfix/pickup[4799]: 89FC13A: uid=1000 from=<sergio>
Jun 4 11:29:06 todoscsi postfix/cleanup[4807]: 89FC13A: \
message-id=<20040604102906.89FC13A@todoscsi.gsr.pt>
Jun 4 11:29:06 todoscsi postfix/qmgr[4800]: 89FC13A: from=<sergio@todoscsi.gsr.pt>, \
size=328, nrcpt=1 (queue active)
Jun 4 11:29:06 todoscsi postfix/local[4809]: 89FC13A: to=<severa@gsr.pt>, \
orig_to=<liviana@gsr1.pt>, relay=local, delay=0, status=sent \
(delivered to command: procmail -a "$EXTENSION")
Jun 4 11:29:06 todoscsi postfix/qmgr[4800]: 89FC13A: removed
Jun 4 11:29:40 todoscsi postfix/smtpd[4738]: disconnect from gsr.pt[x.x.x.x] |
Como se puede comprobar, el correo ha sido enviado a la dirección severa@gsr.pt, ya que liviana@gsr1.pt es un alias para esa cuenta.
Con esto quedaría finalizada la parte de la configuración de Postfix con soporte de LDAP.