Introducción
Al final del artículo conseguiremos tener un sistema de correo con un servidor
de correo cyrus-imap y
postfix con las siguientes características:
- Los usuarios del sistema de correo no son usuarios de sistema.
- Autentificación a través de SASL
(Simple Authentication and Security Layer)
RFC2222 y RFC2554, con métodos de texto plano, login,cram-md5,
digest-md5.
- Transporte seguro del tráfico mediante
TLS (RFC2487
y RFC3546).
- Filtrado de correo en servido a través de
sieve RFC3028.
Autentificación de usuarios
Para la autentificación de usuarios se va a utilizar
cyrus-sasl que es la implementación
del equipo de cyrus del RFC2222. Es necesario instalar los paquetes
adecuados:
- libsasl2
- Librería de que realiza la abstracción a los módulos de
autentificación.
- libsasl2-modules
- Módulos de autentificación, a través de ellos se puede
autentificar contra MySQL, por OTP (One Time Password) RFC1938, sasldb...
- sasl2-bin
- Demonio de autentificación y utilidades para el manejo de la base de datos
de usuario sasldb.
Parada del demonio saslautd
Se va a utiliar únicamente el módulo sasldb, y, para utilizar éste, no es necesario
ejecutar el demonio de autentificación:
cernicalo:~# update-rc.modules -f saslauthd remove
o bien, en el fichero /etc/default/saslauthd:
# This needs to be uncommented before saslauthd will be run automatically
START=no
# You must specify the authentication mechanisms you wish to use.
# This defaults to "pam" for PAM support, but may also include
# "shadow" or "sasldb", like this:
# MECHANISMS="pam shadow"
#MECHANISMS="pam"
MECHANISMS="sasldb"
Creación base de datos de usuarios
La base de datos residirá en el fichero /etc/sasldb2 y tendrá los permisos:
cernicalo:~# ls -l /etc/sasldb2
-rw-r----- 2 root sasl 12288 Nov 7 21:02 /etc/sasldb2
Por lo que todos los usuarios que quieran acceder a ella, y que no sea a través del demonio
saslauthd, deben pertenecer al grupo sasl.
Para añadir/eliminar los usuarios a la base de datos se utilizará el programa saslpasswd2:
cernicalo:~# saslpasswd2 -f /etc/sasldb2 -c usuario
Password:
Again (for verification):
cernicalo:/tmp# sasldblistusers2 /etc/sasldb2
usuario@cernicalo: userPassword
prueba@cernicalo: userPassword
cernicalo:~# saslpasswd2 -f /etc/sasldb2 -d prueba
cernicalo:/tmp# sasldblistusers2 /etc/sasldb2
usuario@cernicalo: userPassword
Para que la librería libsasl2 utilice el módulo de autentificación sasldb
se ha de configurar cada programa que use esta librería las opciones pwchek_method=auxprop
y auxprop_plugin=salsdb.
Instalación del cyrus-imapd
Éste es el programa que va a dar servicio imap, imaps, sieve ...
Los paquetes necesarios instalar son:
- cyrus21-common
- Ficheros comunes a todos los paquetes de cyrus.
- cyrus21-imapd
- Servidor de correo IMAP.
- cyrus21-admin
- Herramientas para la administración de los buzones.
- libcyrus-imap-perl21
- Interfaz a la librería cliente de cyrus-imap, necesaria
por cyrus21-admin.
Al instalar estos programas se crea una jerarquía de directorios en
/var/spool/cyrus/mail para almacenar los buzones de correo. Todos estos ficheros tienen
como propietario a cyrus y grupo mail.
Sólo hay dos ficheros de configuración:
- /etc/cyrus.conf
- En dónde se configura qué servicios se va a arrancar al levantar el sistema
cyrus.
- /etc/imapd.conf
- Configuración específica para el servicio imap de cyrus.
El fichero de configuración cyrus.conf
Consta de tres partes bien diferenciadas: programas que ejecuta al arrancar
el sistema cyrus, los servicios que levanta, y programas a ejecutar
ante la llegada de eventos de tiempo.
Dentro de los servicios se ha de tener activados (descomentado):
- imap, imaps
- Para dar servicio de imap (puerto 143) e imap seguro (993).
Al menos uno debería estar activado.
- lmtp, lmtpunix
- Mediante estos protocolos se le alimenta los mensajes
para que cyrus los reparta entre sus usuarios. En caso de usar el programa
cyrdeliver no es necesario tenerlos activados. El primero utiliza
socket TCP/IP y el segundo sockets unix. Si la fuente de mensajes
(postfix) está en la misma máquina se recomienda usar
lmtpunix, en caso contrario es necesario usar lmtp. Debe
activarse el que se vaya a utilizar.
- sieve
- Para permitir la actualización de los scripts de filtrado para
los usuarios. En debian viene restringido para que sólo se puedan actualizar
desde localhost. Para permitir la actualización se ha de modificar
el parámetro listen="localhost:sieve" a listen="sieve".
El fichero de configuración imapd.conf
- altnamespace: yes
- A yes si se quiere que las subcarpetas del buzón de usuario
no aparezcan al mismo nivel que INBOX.
- unixhierarchysep: no
- Separador de subcarpetas es el `.', no `/'.
- admins: cyrus
- Usuario que va a ser el administrador de los mailboxes. Este
usuario se va a autentificar mediante el método sasl, por lo que debe
añadirse a la base de datos mediante el programa saslpasswd2, ver
2.2.
- allowanonymouslogin: no
- En principio no se va a permitir usuarios anónimos. Ésto es útil si se crean mailboxes públicos.
- autocreatequota: 0
- Si es distinto de creo se permite que los usuarios
creen su INBOX y se le aplica la quota inidicada.
- umask: 077
- Umask a aplicar a los mailboxes creados.
- sendmail: /usr/sbin/sendmail
- Programa compatible con sendmail que va
a usar sieve para enviar los reject,redirect,
y respuestas de vacaciones.
- sieveusehomedir: false
- No leer el fichero
~/.sieve
. Ésto
sólo tiene sentido en sistemas en dónde los usuarios del correo son usuarios del
sistema.
- sievedir: /var/spool/sieve
- si sieveusehomedir es false, el
directorio en dónde se buscan los scripts sieve.
- hashimapspool: true
- El directorio del spool es hashed
- allowplaintext: no
- No se permite el uso del mecanismo de autentificación
sasl plain.
- sasl_mech_list: login cram-md5 digest-md5
- Mecanismos permitidos para
la autentificación sasl.
- sasl_pwcheck_method: auxprop
- Método usado para chequear la password.
- sasl_auxprop_plugin: sasldb
- Se utilizará sasldb.
- tls_imap_cert_file: /etc/ssl/certs/cyrus-imapd.cert.pem
- Fichero a utilizar como certificado. (necesario en caso de utilizar imaps). Si no se
especifica se usa el de la variable tls_cert_file que es
la configuración global para todos los servicios.
- tls_imap_key_file: /etc/ssl/private/cyrus-imapd.key.pem
- Fichero a
utilizar como clave privada (necesario en caso de utilizar imaps).
- tls_ca_path: /etc/ssl/certs
- Directorio en dónde están los certificados
de las autoridades certificadoras.
- tls_session_timeout: 1440
- Timeout de la sesión
- tls_cipher_list: TLSv1:SSLv3:SSLv2:!NULL:!EXPORT:!DES:!LOW:@STRENGTH
- Cifrados que se permiten.
- lmtpsocket: /var/run/cyrus/socket/lmtp
- Socket a utilizar para recibir
mensajes. Debe ser el mismo que aparece en el fichero de configuración
/etc/cyrus.conf.
- idlesocket: /var/run/cyrus/socket/idle
- Socket a utilizar por el programa
idled encargado de revisar cambios en los mailboxes. Debe ser el
mismo que aparece en el fichero de configuración /etc/cyrus.conf.
Administración de los buzones de correo
La administración de los buzones de correo se realiza mediante el programa
cyradm. Se ha de conectar con un usuario de los indicados en
admins:
cernicalo:~emeteo$ cyradm --user cyrus localhost
Password:
localhost>help
authenticate, login, auth authenticate to server
chdir, cd change current directory
createmailbox, create, cm create mailbox
deleteaclmailbox, deleteacl, dam remove ACLs from mailbox
deletemailbox, delete, dm delete mailbox
disconnect, disc disconnect from current server
exit, quit exit cyradm
help, ? show commands
info display mailbox/server metadata
listacl, lam, listaclmailbox list ACLs on mailbox
listmailbox, lm list mailboxes
listquota, lq list quotas on specified root
listquotaroot, lqr, lqm show quota roots and quotas for mailbox
reconstruct reconstruct mailbox (if supported)
renamemailbox, rename, renm rename (and optionally relocate) mailbox
server, servername, connect show current server or connect to server
setaclmailbox, sam, setacl set ACLs on mailbox
setinfo set server metadata
setquota, sq set quota on mailbox or resource
version, ver display version info of current server
Todos los buzones de usuario estarán bajo el directorio user. Por
lo que para crear el buzón del usuario `usuario':
localhost> cm user.usuario
localhost>lm
user.usuario (\HasNoChildren)
localhost>lm user.usuario.personales
localhost>lm
user.usuario (\HasChildren)
user.usuario.personales (\HasNoChildren)
En el caso de tener la opción de configuración altnamespace: yes,
el usuario vería en su programa cliente de correo la carpeta `INBOX' y la
carpeta `personales' al mismo nivel.
Instalación de postfix
Será el encargado de repartir el correo localmente. Veremos que podemos
utilizar tres métodos para entregar el correo a cyrus: procmail,
cyrdeliver, lmtp.
La instalación de postfix-tls en Debian ya deja funcionando el servidor.
Sólo queda personalizar la configuración de éste para que entregue el correo
a cyrus permitiendo SMTP AUTH autentificando mediante sasl y
permita la transmisión de correo mediante forma segura.
Entrega de correo a cyrus
Mediante cyrdeliver
En la instalación de Debian en el fichero /etc/postfix/master.cf
ya existe un transporte llamado cyrus que emplea el programa cyrdeliver:
cyrus unix - n n - - pipe
flags=R user=cyrus argv=/usr/sbin/cyrdeliver -e -m ${extension} ${user}
Sólo queda indicarle en el /etc/postfix/main.cf:
mailbox_transport = cyrus
Mediante procmail
Basta con poner en /etc/postfix/main.cf la opción
mailbox_transport = cyrus, ya que, al igual que el transporte
cyrus, tiene su entrada correspondiente en
/etc/postfix/master.cf.
Para realizar la entrega de correo desde procmail se puede utilizar un
/etc/procmailrc como este:
DELIVERMAIL="/usr/sbin/cyrdeliver"
LOGFILE="/var/log/mail/$USER.log"
IMAP="$DELIVERMAIL -e -a $USER -m user.$USER"
BACKUP="$IMAP.Backup"
SPAM="$DELIVERMAIL -e -a $USER -m user.$USER.SPAM"
:0 c
| $BACKUP
:0
* ^X-Spam-Flag: YES
| $SPAM
INCLUDERC=/home/$USER/.procmailrc
# Resto va para el imap
:0
| $IMAP
El problema de este sistema es que se necesita que los usuarios del correo
sean usuarios del sistema para que éstos utilicen procmail con el fin
de repartir su correo.
Mediante lmtp
Éste es el método a utilizar si se quiere aprovechar las ventajas de
sieve, ya que mediante este método se aplican los filtros
sieve. Los métodos anteriores no utilizan sieve
porque se basan en el programa cyrdeliver, que hace la entrega
directa en el buzón indicado.
Para utilizar éste método hay que indicar en /etc/postfix/main.cf:
mailbox_transport = lmtp:unix:/var/run/cyrus/socket/lmtp
Hay que puntualizar que debian no ejecuta el programa de postfix que
maneja el protocolo lmtp en un chroot, ya que así está marcado
en /etc/postfix/master.cf:
# service type private unpriv chroot wakeup maxproc command + args
local unix - n n - - local
virtual unix - n n - - virtual
lmtp unix - - n - - lmtp
En caso de que se quiera ejecutar en un chroot habría que hacer
accesible el socket /var/run/cyrus/socket/lmtp desde su jaula, bien
haciendo un enlace duro, bien modificando el path del socket en la configuración
de cyrus.
Autentificación mediante sasl
El objetivo es autentificar a los clientes smtp para que puedan hacer relay
a través del servidor de correo.
Para ello se modifica la opción smtpd_recipient_restrictions del
fichero /etc/postfix/main.cf:
smtpd_sasl_auth_enable=yes
smtpd_tls_auth_only = yes
smtpd_sasl_local_domain=cernicalo
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,\
reject_unauth_destination
smtpd_sasl_security_options=noanonymous
Así se permite hacer relay a los clientes sin autentificar que pertenezcan
a las redes indicadas en mynetworks y a los clientes autentificados
mediante el método sasl. Se rechazarán los que están sin autentificar. Además es
necesario utilizar tls para autentificarse. Con la opción
smtpd_sasl_local_domain=cernicalo se indica que compruebe el usuario
entrando en /etc/sasldb2 con usuario@cernicalo.
Existe un problemilla causado porque el servicio smtpd de
postfix se ejecuta en una jaula, y, por lo tanto, no puede acceder
al fichero /etc/sasldb2 para consultar a los usuarios. Como solución
se puede tomar hacer una enlace duro:
cernicalo:/var/spool/postfix/etc# ln /etc/sasldb2 sasldb2
En el caso de que no fuera posible (por estar en distintas particiones), habría
que recurrir a otro método (se deja como ejercicio al lector).
Para que postfix sepa qué método utilizar con sasl, hay que
crear el fichero /etc/postfix/sasl/smtpd.conf:
pwcheck_method: auxprop
mech_list: login cram-md5 digest-md5
Configuración segura
Para permitir un canal seguro mediante tls sólo hay que indicar en
/etc/postfix/main.cf que así lo haga:
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/ssl/certs/postfix.cert.pem
smtpd_tls_key_file = /etc/ssl/private/postfix.key.pem
Los certificados deben tener derechos de lectura para el usuario postfix.
Utilización de sieve
Para aprovecharse de los scripts en sevidor se ha de utilizar el método de
entrega de correo lmtp 4.1.3.
Un ejemplo de script sieve[1]:
require [ "fileinto"];
if header :contains
["X-Spam-Flag"] "YES"
{ fileinto "SPAM"; stop;}
if header :contains
["List-ID"] "guadawireless.guadawireless.net"
{ redirect "listguadawireless@emeteo.local"; stop;}
if header :contains
["Subject"] "SNORT"
{ fileinto "Servidores.snort"; stop;}
Para subir un script al servidor se utiliza el programa sieveshell,
perteneciente al paquete cyrus21-admin:
emeteo@cormoran$ sieveshell -u emeteo cernicalo
connecting to cernicalo
Please enter your password:
> put repartecorreo.sie
> ls
repartecorreo.sie
> activate repartecorreo.sie
> ls
repartecorreo.sie <- active script
> quit
Actualmente kmail sólo soporta editar
las respuestas fuera de oficina. Esperemos que soporte un editor completo de
estos filtros.
Podeis acceder a este artículo en pdf,ps, html, y LaTeX en http://cernicalo.escomposlinux.org/~emeteo/imap.
Notas al pie
- ...sieve[1]
- Aquí se omite el INBOX en el path
a los buzones, debido a que en /etc/imapd.conf se indicó
altnamespace: yes