Servidor de correo – Configuración Postfix y PostfixSRS (parte 6)

Esta es una entrada dentro de la serie para la instalación de un servidor de correo completo. Índice completo de contenidos pincha aquí.


Postfix

En esta entrada procederemos a la configuración del servicio de Postfix.

main.cf

Copiamos el archivo main.cf original:

cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

El contenido del archivo ya modificado /etc/postfix/main.cf. No entraremos en detalle de lo que significa cada apartado para no extender la entrada, aunque se detalla alguna explicación en las mismas líneas de configuración:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/email.tiraquelibras.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/email.tiraquelibras.com/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_tls_protocols=!SSLv2,!SSLv3
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3

# Authentication
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

# Restrictions
smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        check_helo_access hash:/etc/postfix/helo_access,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        check_sender_access hash:/etc/postfix/lista_blanca,
        check_sender_access hash:/etc/postfix/lista_negra,
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        reject_unlisted_recipient,
        reject_unauth_destination,
        reject_rbl_client dul.dnsbl.sorbs.net,
        reject_rbl_client sbl-xbl.spamhaus.org,
        reject_rbl_client bl.spamcop.net
smtpd_sender_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain
smtpd_relay_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        defer_unauth_destination

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = email.tiraquelibras.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = email.tiraquelibras.com
myorigin = $mydomain
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

# Handing off local delivery to Dovecot's LMTP, and telling it where to store mail
virtual_transport = lmtp:unix:private/dovecot-lmtp

# Virtual domains, users, and aliases
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf,
        mysql:/etc/postfix/mysql-virtual-email2email.cf

# Even more Restrictions and MTA params
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
#smtpd_etrn_restrictions = reject
#smtpd_reject_unlisted_sender = yes
#smtpd_reject_unlisted_recipient = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
#smtpd_hard_error_limit = 1
smtpd_timeout = 30s
smtp_helo_timeout = 15s
smtp_rcpt_timeout = 15s
smtpd_recipient_limit = 20
minimal_backoff_time = 180s
maximal_backoff_time = 3h

# Reply Rejection Codes
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550

# More parameters by Sergio
unknown_local_recipient_reject_code = 450
bounce_queue_lifetime = 3d
# Bounce templates
bounce_template_file = /etc/postfix/bounce.cf
maximal_queue_lifetime = 4d
header_checks = regexp:/etc/postfix/header_checks
smtpd_soft_error_limit = 3
smtpd_hard_error_limit = 12
message_size_limit = 20480000

En esta configuración se requiere autenticación válida con usuario y contraseña, se publican listas blancas y negras, IPs permitidas para el uso sin autenticación, rechazo por RBL, entre otras cosas.


bounce.cf

Ahora creamos el archivo con los mensajes de respuesta o rebote personalizados /etc/postfix/bounce.cf:

failure_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Mensaje no entregado
Postmaster-Subject: Postmaster: Mensaje no entregado

POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.

Éste es un mensaje de correo enviado automáticamente por su servidor de correo.

No ha sido posible entregar su mensaje a uno o más destinatarios. El
mensaje que causó el error está adjunto a este mensaje.

EOF

delay_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Mensaje postpuesto
Postmaster-Subject: Postmaster: Mensaje postpuesto

POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.

Este es un mensaje de correo enviado automáticamente por el servidor de correo.
.

##############################################
# ÉSTE ES SÓLO UN MENSAJE DE AVISO           #
# NO ES NECESARIO QUE REENVÍE EL MENSAJE.    #
##############################################

Su mensaje no pudo ser entregado al destinatario después de intentarlo durante
$delay_warning_time_hours hora(s).
Se seguirá intentando enviar el mensaje hasta que pasen $maximal_queue_lifetime_days días.

EOF

success_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Informe de entrega correcta de mensaje

POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.

Este es un mensaje de correo enviado automáticamente por su servidor de correo.

Su mensaje fue entregado correctamente al/a los destinatario/s indicados a
continuación. Si el mensaje fue entregado directamente a los destinatarios,
no recibirá más notificaciones; en caso contrario, si el mensaje tuviera que
pasar por más servidores de correo, es posible que reciba más notificaciones
de estos servidores.

EOF

verify_template = <<EOF
Charset: UTF-8
From: MAILER-DAEMON (Mail Delivery System)
Subject: Servidor de correo: Informe de estado de entrega de mensaje

POR FAVOR, LEA DETENIDAMENTE ESTE MENSAJE.

Este es un mensaje de correo enviado automáticamente por su servidor de correo.

Adjunto a este mensaje se encuentra el informe de entrega solicitado.

EOF

 


master.cf

Copiamos el archivo original:

cp /etc/postfix/master.cf /etc/postfix/master.cf.orig

Archivos MySQL

Creamos el archivo para que Postfix chequee si existen los dominios /etc/postfix/mysql-virtual-mailbox-domains.cf

user = mailuser
password = supersecretpassword
hosts = 127.0.0.1	
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s' and active='1'

Ahora el archivo para que Postfix chequee si existen los buzones /etc/postfix/mysql-virtual-mailbox-maps.cf

user = mailuser
password = supersecretpassword
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s' and active='1'

Y por último lo mismo para los alias /etc/postfix/mysql-virtual-alias-maps.cf

user = mailuser
password = supersecretpassword
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s' and active='1'

Para finalizar creamos el siguiente archivo que también chequea el chequeo de Postfix para los alias /etc/postfix/mysql-virtual-email2email.cf

user = mailuser
password = supersecretpassword
hosts = 127.0.0.1
dbname = mailserver
query = SELECT email FROM virtual_users WHERE email='%s' and active='1'

Reiniciamos Postfix

systemctl restart postfix

Confirmar buzón

Confirmamos la existencia del buzón creado en la entrada anterior, accede a esta pinchando aquí.

# postmap -q sbrodriguez@tiraquelibras.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
1

Si el comando es correcto la respuesta será un 1, de lo contrario no devolverá nada.

Podríamos comprobar también los alias consultando el archivo mysql:/etc/postfix/mysql-virtual-alias-maps.cf


Archivos varios

Ejemplo del contenido de archivos varios usados en los chequeos de Postfix anteriormente indicados:

helo_access

#yeloquehay.com          REJECT  Get lost - you're lying about who you are

#correu.yeloquehay.com   REJECT  Get lost - you're lying about who you are

#raspberrypi             OK

lista_blanca

pi@raspberrypi.com OK
192.168.0.17 OK

lista_negra

address.to.reject@spam.com REJECT Sorry, you cannot write to this address.

header_checks

Aquí indicaremos que se escriban en el log todos los asuntos de los mensajes entrantes y salientes.

#/^(Subject: ***** SPAM )(.+)$/ DISCARD
#/^From: .*postmaster\@yeloquehay.com/  OK
#/^Subject: \*\*\*\*\* SPAM/ REJECT SPAM confirmed, contact to postmaster@yeloquehay.com
/^subject:/ WARN
#/^to:/ WARN
#/^from:/ WARN
#/^Subject:/ WARN
#/^To:/ WARN
#/^From:/ WARN

A todos estos archivos no son consultados por Postifx cirectamente, sino que tendremos que crear el archivo .db correspondiente para que Postfix los interprete, con el comando:

postmap nom_archivo

Y reiniciamos Postfix:

systemctl reload postfix

master.cf

Ahora editamos el archivo master.cf, en donde empieza y monitoriza todos los procesos de Postfix. Esta configuración lista todos los programas e información sobre como deberían de iniciarse.

Primero hacemos una copia del archivo:

cp /etc/postfix/master.cf /etc/postfix/master.cf.orig

Modificamos las siguientes líneas, dejando el resto como está:

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================
smtp      inet  n       -       y       -       -       smtpd
#smtp      inet  n       -       y       -       1       postscreen
#smtpd     pass  -       -       y       -       -       smtpd
#dnsblog   unix  -       -       y       -       0       dnsblog
#tlsproxy  unix  -       -       y       -       0       tlsproxy
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
#  -o smtpd_reject_unlisted_recipient=no
#  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
#  -o smtpd_helo_restrictions=$mua_helo_restrictions
#  -o smtpd_sender_restrictions=$mua_sender_restrictions
#  -o smtpd_recipient_restrictions=
#  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

Ahora cambiamos los permisos al directorio /etc/postfix con el comando:

sudo chmod -R o-rwx /etc/postfix

Reiniciamos Postfix:

systemctl restart postfix

PostfixSRS

Instalamos el paquete:

apt-get install postsrsd

Configuramos Postfix editando el archivo /etc/postfix/main.cf con las siguientes líneas:

# PostSRSd settings.
sender_canonical_maps = tcp:localhost:10001
sender_canonical_classes = envelope_sender
recipient_canonical_maps = tcp:localhost:10002
recipient_canonical_classes= envelope_recipient,header_recipient 

Habilitamos SRS con

systemctl enable postsrsd

Reiniciamos Postfix con el comando

systemctl postfix reload

Ahora cuando se realice un reenvío o forward se escribirá una cabecera similar a la siguiente:

Sep  2 17:07:44 h2847530 postfix/qmgr[4620]: C82BFD20376: from=

<SRS0=nKtb=W5=yeloquehay.com=sbrodriguez@correu2.yeloquehay.com>

, size=2703, nrcpt=1 (queue active)

Vemos como SRS modifica la dirección del From:

<SRS0=nKtb=W5=yeloquehay.com=sbrodriguez@correu2.yeloquehay.com>

Mirando las cabeceras del mensaje podemos ver el from real y la IP del servidor original que realiza el envío, y no el que realiza el reenvío o forward:


Índice general pincha aquí.