Postfix

Postfix es un servidor de correo, IMHO más potente y flexible que exim. Por ello decidí jubilar a este último.

Configurar la entrega de correo de postfix a cyrus.

Para la entrega de correo a cyrus, podemos usar el método de Mario, o bien este otro:

Primero creé un fichero transports con el el siguiente contenido:


localhost.localdomain   :
gadelek.com             lmtp:unix:/var/run/cyrus/socket/lmtp

De este modo los usuarios @localhost usarán el transporte por defecto, y los usuarios @gadelek.com usarán el transporte lmtp de cyrus. Ver min-howto para ajustar permisos del socket lmtp

Para que el fichero transports recién creado pueda ser interpretado por postfix, debemos ejecutar


$ postmap transports

Y añadir en main.cf lo siguiente:


transport_maps = hash:/etc/postfix/transports

Alias virtuales

Si queremos tener un fichero de aliases para usuarios que no sean @localhost, seguiremos estos pasos:

Creamos /etc/postfix/virtual/addresses. Dentro pondremos los usuarios (y sus dominios) del siguiente modo (ejecutar postmap tras crear el fichero):


root    administrador@gadelek.com, beep@localhost
gadelek.com     DOMINIO
dynamicdns@gadelek.com  beep@localhost
ejemplo.com    DOMINIO
usuario@ejemplo.com   usuario2@gadelek.com
ejemplo2.com
@ejemplo2.com   usuario3@gadelek.com

Creamos /etc/postfix/virtual/domains. Dentro ponemos:


gadelek.com
ejemplo.com
ejemplo2.com

Modificamos /etc/postfix/main.cf, línea mydestination, y añadimos la línea virtual_alias_maps:


mydestination = localhost, /etc/postfix/virtual/domains
virtual_alias_maps = hash:/etc/postfix/virtual_aliases

Alias hacia tubería

Los alias hacia tubería con Postfix solo funcionan si son alias locales. Quería que sonara un pitido al llegar un mail para root.

Cuando llega un mail a nuestra máquina, primero Postfix comprueba los alias virtuales y luego los locales, con lo que si definimos un alias virtual para root, Postfix ya no comprobará que exista otro alias en la tabla de aliases locales, y de este modo no se ejecutaría la tubería. Para solventar esto, se me ocurrió esta chapucilla:

Creamos un alias en la tabla de aliases virtuales que envíe el mail a otro alias que solo sea local. Por ejemplo:


root:   administrador@gadelek.com, beep@localhost

De este modo el mail se envía a "administrador@gadelek.com", y a "beep@localhost". Hay que especificarle localhost, ya que de lo contrario autocompletará la dirección según lo contenido en /etc/mailname

Ahora creamos un alias local en /etc/aliases para beep.


beep: "| sudo /usr/bin/play /etc/postfix/sounds/notify.wav"

Debemos usar sudo por culpa de los permisos de audio.

Importante

No olvidemos ejecutar $ postalias /etc/aliases

Chequeo de destinatario

Me interesaba mucho que se comprobase la existencia del destinatario, y lo hice de la siguiente forma:

Creamos un fichero usuarios, con el siguiente formato:


usuario     OK
usuario2   OK
...

ejecutamos:


$ postmap usuarios

Y añadimos en main.cf (Los alias virtuales los comprueba aunque no los especifiquemos aquí)


local_recipient_maps = hash:/etc/postfix/usuarios $alias_maps

Autenticación con sasl

Para poder enviar correos desde cualquier punto de internet, debemos restringir el acceso de forma que no puedan usarnos como reenviadores de spam. Para ello autenticamos los usuarios mediante usuario y contraseña, con la base de datos sasl.

En /etc/postfix/main.cf habilitamos la autenticación sasl para el servidor smtp.


smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_unauth_destination

Debemos tener instalado el paquete "libsasl2-modules", que sasldauth esté funcionando y que postfix pueda acceder al socket de saslauthd. Para ello editamos /etc/default/saslauthd y descomentamos la línea "START" comprobando que su valor sea "yes". Además, la línea "MECHANISMS" debe tener el valor "sasldb".

Ya que /var/run/saslauthd/mux es un socket cuyo directorio contenedor tiene permisos 710 y pertenece a root:sasl, solucionamos el problema de los permisos con


$ adduser postfix sasl

Por último crearemos un fichero en /etc/postfix/sasl en el que especificaremos el método de autenticación que se ha de usar:


#/etc/postfix/sasl/smtpd.conf
pwcheck_method: saslauthd
mech_list: plain login

Para comprobar que la autenticación funciona, podemos conectarmos por telnet al servidor de correo y autenticarnos con el comando:


AUTH PLAIN anNhYmF0ZXIAanNhYmF0ZXIAanNhYmF0ZXI=

La contraseña cifrada para el comando anterior la obtendremos con el siguiente comando:


perl -MMIME::Base64 -e 'print encode_base64("username\0username\0password");'

Aquí dejo mi fichero de configuración de Postfix

Cifrado con TLS

TLS es la evolución de la capa SSL introducida por netscape que usaba el puerto 465 para las transmisiones smtp cifradas. TLS usa el puerto estándar 25.

Para poder establecer una autenticación y comunicación cifrada, necesitamos en primer lugar un certificado, que se crea de la misma forma que los certificados para apache, así que no voy a tratarlo en este punto. Asumo que tenemos tres ficheros; uno con la clave privada (pero sin cifrar. En el apartado de apache vemos como quitar el cifrado de dicho fichero), otro con el certificado firmado, y otro con el certificado de la autoridad certificadora.

Añadimos a postfix en main.cf lo siguiente:


smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_key_file = /etc/postfix/ssl/private.pem
smtpd_tls_cert_file =/etc/postfix/ssl/cert.pem
smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem

smtpd_tls_loglevel = 0
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Podemos omitir "smtpd_tls_auth_only = yes" si queremos permitir que se puedan seguir enviando mails sin usar autenticación TLS.

Es recomendable poner el nivel de log a 3 mientras no conseguimos que funcione, para poder buscar posibles fallos. Una vez que funcione podemos dejarlo a 0 para que no nos llene los logs. Los otros valores posibles son los siguientes:


0     Disable logging of TLS activity.    
1     Log TLS handshake and certificate information.     
2     Log levels during TLS negotiation.     
3     Log hexadecimal and ASCII dump of TLS negotiation process     
4     Log hexadecimal and ASCII dump of complete transmission after STARTTLS

Es probable que nos aparezca un error relacionado con tlsmgr y un socket tipo fifo. Para solucionarlo editamos master.cf y al final del fichero cambiamos fifo por unix en la línea de tlsmgr

Antivirus y antispam

Usaremos amavis como interfaz entre nuestro servidor de correo y nuestro antivirus/antispam. Con ésto marcaremos los mensajes, pero para enviarlos a una carpeta de spam debemos agregar reglas en el servidor IMAP, de modo que los correos que lleguen con determinadas cabeceras los mande a una u otra carpeta. Esto lo haremos con sieve, y está descrito en la sección de Cyrus IMAP.

Instalamos programas


$ apt-get install amavisd-new spamassassin unarj unrar unace unzip unzoo

El antivirus debemos instalarlo a elección; yo opté por bitdefender, que se baja de su página web, pero podemos instalar vía apt el clamav. Amavis es quien llamará al antivirus para revisar los correos.

Añadimos a master.cf las siguientes líneas para crear un nuevo demonio smtp en el puerto 10025


smtp-amavis unix - - n - 2  smtp
    -o smtp_data_done_timeout=1200
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes
    -o max_use=20

127.0.0.1:10025 inet n - n - -  smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_delay_reject=no
    -o smtpd_client_restrictions=permit_mynetworks,reject
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks,reject
    -o smtpd_data_restrictions=reject_unauth_pipelining
    -o smtpd_end_of_data_restrictions=
    -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
    -o smtpd_client_connection_count_limit=0
    -o smtpd_client_connection_rate_limit=0
    -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks

Y en el fichero /etc/postfix/main.cf tan sólo debemos añadir esta línea:


content_filter = smtp-amavis:[127.0.0.1]:10024

Según la versión que tengamos de amavis, usaremos ficheros individuales o uno solo. Me basaré en la versión nueva, de varios ficheros de configuración.

Todos los cambios que hagamos debemos realizarlos en el fichero 50-user, ya que los demás ficheros de configuración son reescritos cada vez que se actualiza el paquete amavisd-new

Según versión de amavis, el antispam y/o antivirus puede venir desactivado. Comprobaremos las líneas referentes a "bypass spam/virus checks"

La forma de tratar los mensajes depende de la política que necesitemos; yo opté por dejar pasar los mensajes de spam, modificando el asunto y añadiendo unas cabeceras que indican si el mensaje es spam. Sin embargo elimino los mensajes con virus, avisando al remitente de que su mensaje no fue entregado.

Se indica con las líneas:


$final_spam_destiny       = D_PASS;
$final_virus_destiny      = D_DISCARD;

Solo se modificarán los mensajes de SPAM cuyo destinatario esté en el acl $my_domains, por lo que si tenemos dominios virtuales debemos añadir todos a dicha acl. Igualmente debemos añadir nuestro dominio si solo es uno.

Para evitar que se intente chequear el mensaje con antivirus que no tenemos instalados, descomentaremos las líneas correspondientes en el fichero 15-av_scanners

Si queremos que también sea avisado el receptor de un mensaje con virus debemos añadir esta etiqueta en la configuración de amavis:


$warnvirusrecip = 1;

Podemos evitar que se guarden los virus en cuarentena dejando vacía la ruta donde se deben guardar:


$QUARANTINEDIR = '';

Para personalizar las plantillas de los mensajes que se mandan a administrador, emisor y receptor de los mails afectados, añadimos en 50-user lo siguiente


read_l10n_templates('es_ES', '/etc/amavis');

Seguidamente debemos poner en /etc/amavis/es_ES, las plantillas correspondientes a nuestro idioma. (Podemos basarnos en las existentes en el directorio en_US)

Cabe mencionar que debemos ajustar la tabla de caracteres que usará amavis para generar dichos mensajes. Esto se configura en el fichero charset dentro del directorio de plantillas

Otras medidas para evitar la entrega de correo no deseado

Agregamos en /etc/postfix/main.cf las siguientes líneas (algunas ya las agregamos anteriormente):

permit_mynetworks debe figurar hacia arriba de todo, ya que de lo contrario pueden ser rechazados los mails procedentes de fetchmail, ya que el helo de fetchmail es localhost, y no se considera un fqdn


smtpd_recipient_restrictions =
        permit_mynetworks,
        reject_invalid_hostname,
        reject_non_fqdn_hostname,
        reject_non_fqdn_sender,
        reject_non_fqdn_recipient,
        reject_unknown_sender_domain,
        reject_unknown_recipient_domain,
        permit_sasl_authenticated,
        reject_unauth_destination,
        reject_rbl_client sbl.spamhaus.org
        reject_rbl_client xbl.spamhaus.org
        reject_rbl_client zen.spamhaus.org
        reject_rbl_client dun.dnsrbl.net
        reject_rbl_client whois.rfc-ignorant.org
        reject_rbl_client dnsbl.njabl.org
        reject_rbl_client bl.spamcop.net
        permit

smtpd_data_restrictions =
        reject_unauth_pipelining,
        permit

# Reglas adicionales para evitar correo basura
smtpd_helo_required = yes
disable_vrfy_command = yes