Guia de referencia rápida para Postfix, amavis-new, clamav, spamassassin, procmail y dovecot en Ubuntu

Esquema general



Acceso IMAP/POP3 seguro con Dovecot

Podremos acceder a nuestro correo utilizando los protocolos IMAP o POP3 gracias a Dovecot. Lo instalaremos mediante:

aptitude install dovecot-imapd dovecot-pop3d

Dado que se recomienda un acceso cifrado (IMAPs/POP3s), vamos crear los certificados necesarios:

mkdir /etc/dovecot/ssl
cd /etc/dovecot/ssl
openssl req -new -x509 -nodes -out dovecot.pem -keyout dovecot.pem -days 3650

Respondemos a las preguntas, por ejemplo:

Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Catalunya
Locality Name (eg, city) []:Tarragona
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Marble Station
Organizational Unit Name (eg, section) []:MS
Common Name (eg, YOUR name) []:localhost
Email Address []:marble@localhost

Ahora podemos configurar Dovecot editando “/etc/dovecot.conf”, indicaremos que queremos que se activen los protocolos IMAPs y POP3s (cifrados). Para IMAP3, el usuario tendrá acceso a su buzón principal ubicado en “/var/mail/usuario” y a todos los buzones que tenga en el directorio “mail” de su directorio personal:

protocols = imaps pop3s

...

ssl_cert_file = /etc/dovecot/ssl/dovecot.pem
ssl_key_file = /etc/dovecot/ssl/dovecot.pem

...

default_mail_env = mbox:~/mail/:INBOX=/var/mail/%u

Iniciamos el servicio:

/etc/init.d/dovecot start

Ahora ya es posible acceder a nuestro mail mediante un cliente como Evolution. Si utilizamos el protocolo POP3 el correo se bajará a nuestra máquina y se eliminará del servidor, sin embargo, si usamos IMAP podremos acceder a los mails de forma remota, conservandose en el servidor.

Postfix

Postfix será el servidor SMTP. Para configurarlo mínimamente:

dpkg-reconfigure postfix

Contestamos:

  1. Tipo configuración: Internet Site
  2. Destino de los mails dirigidos a root: NONE
  3. Dominio: server1.example.com
  4. Otros destinos para los que aceptar correo: server1.example.com, localhost.example.com, localhost
  5. Actualizaciones sincronizadas (más seguro, no se pierden mails): Yes
  6. Redes locales: 127.0.0.0/8
  7. Usar procmail para entrega local: Yes
  8. Limite del tamaño de buzón: 0
  9. Caracter extensión: +

Instalamos antivirus Clam:

aptitude install clamav-daemon

Instalamos diversos decompresores para que el antivirus sea capaz de analizar ficheros comprimidos:

aptitude install unrar-nonfree lha arj unzoo zip unzip bzip2 gzip cpio file lzop

Instalamos los protectores colaborativos contra Spam, Pyzor y Razor. Ambos calculan un hash del mensaje y consultan a un servidor de internet si corresponde a un mail de publicidad. Este paso es opcional.

aptitude install pyzor razor

Instalamos el bloqueador de correo basura spamassasin:

aptitude install spamassassin

A continuación instalamos el agente intermediario que conectará nuestro servidor de correo Exim con spamassasin y clamav:

aptitude install amavisd-new

Editamos “/etc/amavis/amavisd.conf” y modificamos:

# Útil para añadir a la cabecera del mail:
#    X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at marblestation.homeip.net
$mydomain = 'marblestation.homeip.net';

...

# Dejar pasar los spams, filtraremos por procmailrc. 
# Si los correos pasan antes por otro MX "cercano" o local (por ejemplo lo bajáis con el fetchmail)
# no hagáis un REJECT, que estaréis tirando piedras a vuestro propio tejado.
$final_spam_destiny = D_PASS;

...

# Descomentamos las siguientes lineas.
# Enviara los mails analizados de vuelta al puerto 10025 de localhost.
$forward_method = 'smtp:127.0.0.1:10025';  # where to forward checked mail
$notify_method = $forward_method;

...

# Comentamos la siguiente linea para que los avisos de virus no los reciba una persona concreta
#$virus_admin = "postmaster\@$mydomain";

....

# Dejamos pasar los mails infectados, los filtraremos por procmail
$final_virus_destiny      = D_PASS;  # (defaults to D_BOUNCE)

...

# Comentamos las siguientes líneas para no poner los virus/spam en cuarentena
#$virus_quarantine_to  = 'virus-quarantine';
...
#$spam_quarantine_to = 'spam-quarantine';

...

# Comentamos la siguiente linea para que no se modifiquen los subjects de correos spam, los
# filtraremos por otras cabeceras con procmail.
#$sa_spam_subject_tag = '***SPAM*** ';

Editamos el archivo de configuración de Postfix “/etc/postfix/master.cf” y añadimos al final:

smtp-amavis unix -      -       n     -        2  smtp
    -o smtp_data_done_timeout=1200
    -o disable_dns_lookups=yes
127.0.0.1:10025 inet n  -       n     -       -  smtpd
    -o content_filter=
    -o disable_dns_lookups=yes
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o smtpd_error_sleep_time=0
    -o smtpd_soft_error_limit=1001
    -o smtpd_hard_error_limit=1000

Con esto escucharemos por el puerto 10025 de forma local (no aceptaremos conexiones desde otras máquinas), dado que por ahí será por donde recibiremos los mails ya analizados de amavis-new.

Ejecutamos:

postconf -e 'content_filter = smtp-amavis:[127.0.0.1]:10024'

Esto añadirá al final del archivo “/etc/postfix/main.cf” la linea “content_filter = smtp-amavis:[127.0.0.1]:10024”. Así se enviará todo mail recibido a amavis, el cual escucha por el puerto 10024 en nuestra máquina.

Reiniciamos los servicios y todo estará listo:

/etc/init.d/amavis restart
/etc/init.d/postfix restart

En el directorio de nuestro usuario, por ejemplo “marble”, creamos el fichero “.procmailrc”:

## Si es un spam se lo indico al bogofilter...
#:0 c
#* ^X-Spam-Status: Yes
#|bogofilter -s -l

# ...y luego lo pongo en ~/mail/spams
:0:
* ^X-Spam-Status: Yes
mail/spams

# Compruebo si es un virus...
:0:
* ^X-Amavis-Alert: INFECTED
mail/virus

## Hago el segundo filtrado antispam
#:0HB
#* ? bogofilter -u -l
#mail/spams

Podemos comprobar el correcto funcionamiento enviando un mail manualmente (a un usuario existente), haciendo telnet al puerto 25 de nuestro propio ordenador:

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix (Ubuntu)
MAIL FROM: marble@localhost
250 Ok
RCPT TO: marble@localhost
250 Ok
DATA
354 End data with .
Subject: Hola!!

Que tal?

.
250 Ok: queued as 1AF8722D564
quit
221 Bye
Connection closed by foreign host.

Si se ha recibido correctamente el correo, este estará almacenado en “/var/mail/marble” (dado que se ha enviado al usuario marble@localhost).

Para acceder al mail es posible utilizar un cliente de correo como mutt o configurar Evolution para correo local con buzones tipo MBOX (usando el buzón “/var/mail/marble”) y el envio mediante SMTP (localhost).

TLS

Veamos como activar la encriptación por el puerto 25 para poder enviar correos de forma segura.

mkdir /etc/postfix/ssl
cd /etc/postfix/ssl
openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

A las preguntas contestamos según sea nuestro caso, por ejemplo:

Country Name (2 letter code) [AU]:ES
State or Province Name (full name) [Some-State]:Catalunya
Locality Name (eg, city) []:Tarragona
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Marble Station
Organizational Unit Name (eg, section) []:MS
Common Name (eg, YOUR name) []:localhost
Email Address []:marble@localhost

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Modificamos la configuración de Postfix ejecutando:

postconf -e 'smtp_use_tls = yes'
postconf -e 'smtpd_use_tls = yes'
postconf -e 'smtp_tls_note_starttls_offer = yes'
postconf -e 'smtpd_tls_key_file = /etc/postfix/ssl/smtpd.pem'
postconf -e 'smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.pem'
postconf -e 'smtpd_tls_CAfile = /etc/postfix/ssl/smtpd.pem'
postconf -e 'smtpd_tls_loglevel = 1'
postconf -e 'smtpd_tls_received_header = yes'
postconf -e 'smtpd_tls_session_cache_timeout = 3600s'
postconf -e 'tls_random_source = dev:/dev/urandom'

Recargamos Postfix:

/etc/init.d/postfix reload

Comprobamos que ya tenemos activa la opción TLS conectandonos por telnet al puerto 25 e indicando “EHLO localhost”, si en el listado que imprime se muestra “STARTTLS” es que todo ha ido correctamente:

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix (Ubuntu)
EHLO localhost
250-localhost.localdomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250 8BITMIME
quit
221 Bye
Connection closed by foreign host.

Si queremos que clientes como Evolution o Outlook conecten correctamente de forma segura con nuestro SMTP, vamos a tener que añadir la siguietne linea a “/etc/postfix/master.cf”:

## Abre el puerto 465 para SMTPS (usado por Outlook o Evolution para conexiones seguras)
smtps    inet  n       -       n       -       -       smtpd
      -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes

Y a continuación habrá que reiniciar Postfix:

/etc/init.d/postfix reload

Más información sobre Postfix TLS: http://www.postfix.org/TLS_README.html

Autentificación

Postfix utiliza SASL para la autentificación de usuarios, por tanto instalaremos los ejecutables que gestionan SASL:

aptitude install sasl2-bin

Descomentamos de “/etc/default/saslauthd” la línea:

START=yes
...

Iniciamos el demonio:

/etc/init.d/saslauthd start

Este esperará peticiones de autentificación mediante el socket UNIX “/var/run/saslauthd/mux”, podemos comprobar su correcto funcionamiento mediante:

testsaslauthd -f /var/run/saslauthd/mux -u [USUARIO] -p [PASSWORD]

A continuación podemos configurar Postfix para que utilice la autentificación, permitiendo que esta solo sea llevada a cabo cuando se utilizan conexiones seguras (TLS):

postconf -e 'smtpd_tls_auth_only = yes'
postconf -e 'smtpd_sasl_auth_enable = yes'
postconf -e 'smtpd_sasl_security_options = noanonymous'
postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination'
postconf -e 'broken_sasl_auth_clients = yes'

A continuación indicamos a Postfix que utilice slasauthd para la autentificación:

echo 'pwcheck_method: saslauthd' >> /etc/postfix/sasl/smtpd.conf
echo 'mech_list: plain login' >> /etc/postfix/sasl/smtpd.conf

Para que Postfix tenga permisos para consultar slasauthd, tendremos que editar “/etc/group” para añadir el usuario “postfix” al grupo “sasl”:

...
sasl:x:45:postfix
...

Finalmente reinciamos Postfix:

/etc/init.d/postfix reload

Ya podemos probar el envio de mails con algún cliente como Evolution, desde el cual se podrá especificar que el servidor SMTP requiere autentificación.

6 thoughts on “Guia de referencia rápida para Postfix, amavis-new, clamav, spamassassin, procmail y dovecot en Ubuntu”

  1. Buenas:

    Me parece muy bien explicado y detallado tu manual de implementación de servidor de correo. Estoy montando un servidor de correo de postfix en Ubuntu 7.04 Server pero cuando instale Amavisd-new, los archivos de configuración han cambiado (estan todos en una carpeta conf.d y son varios) y estoy supremamente confundido, seria posible que me dijeras cual es la equivalencia entre las lineas de configuración del amavisd.conf que tienes en tu tutorial con los nuevos archivos que aparecen en conf.d. De antemano Muchas Gracias.

  2. Hola , primero decirte que es un excelente manual, pero tengo una duda, he configurado el evolution para enviar un correo y me pide contraseña de autenficacion smtp, cual es esa password

  3. Hola, estoy teniendo un problema para conectar el amavis-new a un servidor de spamassassin remoto que tengo para toma mi red.

    Conoces si hay alguna restricción en esta nueva versión que no permita hacer el filtrado en el servidor externo?

    Gracias!

Leave a Reply to marble Cancel reply

Your email address will not be published. Required fields are marked *