Postfix es un servidor de correo, IMHO más potente y flexible que exim. Por ello decidí jubilar a este último.
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 |
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 |
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.
No olvidemos ejecutar $ postalias /etc/aliases |
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 |
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
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
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
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 |