Servidor de correo con Postfix+Dovecot+RainLoop+Mailman2 y auth LDAP para usuarios del AD DC [Debian 10] – PART II

ÍNDICE

La documentación abarcará lo siguiente:

1.Implementación de un servidor de correo con buzones.

1.1.Datos de interés.

1.2.Sincronización de tiempo.

1.3. Implementación y configuración de ESMTP Postfix.

1.3.1. Selección de cifrados.

1.3.2. Configurando Postfix.

1.3.3. Creando los archivos de controles para Postfix-LDAP.

1.3.4. Comprobando la integración con LDAP y mapeos de aliases.

1.4.Implementación y configuración de Dovecot.

1.4.1.Configurando Dovecot

1.4.2.Creando archivo de control para Dovecot-LDAP

1.4.3.Script “quota-warnings.sh”

2. Implementación del cliente de correo web

2.1. Instalación de RainLoop

2.2. Fortaleciendo la seguridad del cliente de correo web

2.3. Configuraciones desde la WebGUI de RainLoop

3. Clientes de correo externo

3.1. Outlook 2016

3.2. Outlook 2019

3.3. Thunderbird 78.8.0

4. Filtrado de correos

4.1. Filtrado de correos por categorías

4.2. Filtrado para el remitente y destinatario

4.3. Filtrado para encabezado, adjuntos y cuerpo del correo

5. Copias de Carbón Ocultas

6. Listas de distribución con Mailman 2

6.1. Configuración de Nginx para Mailman 2

6.2. Instalación y configuración de Mailman 2

6.3. Integración de Mailman 2 a Postfix

6.4. Creando otras listas en Mailman 2

7. Rotación de logs y envío de reportes

8. Comprobando la encriptación TLS

9. Iptables

 

1.2. Sincronización de tiempo

La mayoría de las veces los servidores desplegados usan la zona horaria UTC (Coordinated Universal Time) o lo que es lo mismo, el tiempo en los cero grados de longitud. Consistentemente al usar el UTC como zona horaria se reduce la confusión cuando nuestra infraestructura sufre cambios de horarios por las múltiples zonas horarias que pueda atravesar (horario de verano y horario normal de cada región).

Para la sincronización del tiempo se analizará la variante por “timesyncd”, el cual es un cliente para sincronizar el tiempo más ligero que ntpd y que es usado en los sistemas actuales. Primero desinstalamos otras soluciones para sincronización de tiempo, que no serán requeridas:

apt remove --purge ntp ntpdate

En este caso se usará como zona horaria la de America/Havana:

timedatectl set-timezone America/Havana

Habilitamos la sincronización por ntp:

timedatectl set-ntp true

Editar el fichero de configuración, no sin antes hacerle una salva:

cp /etc/systemd/timesyncd.conf{,.orig}
echo "NTP=ntp.empresa.midominio.cu" >> /etc/systemd/timesyncd.conf

Reiniciamos el servicio:

systemctl restart systemd-timesyncd

Verificamos que este sincronizado:

timedatectl

Debe devolver, algo como lo siguiente:

Local time: vie 2021-03-05 18:47:22 CST
Universal time: vie 2021-03-05 23:47:22 UTC
RTC time: vie 2021-03-05 23:47:23
Time zone: America/Havana (CST, -0500)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no

Vemos los logs del servicio:

journalctl --since -1h -u systemd-timesyncd

Debe devolver, algo como lo siguiente:

-- Logs begin at Fri 2021-03-05 17:45:26 CST, end at Fri 2021-03-05 18:49:12 CST. --
mar 05 18:49:12 mail systemd[1]: Stopped Network Time Synchronization.
mar 05 18:49:12 mail systemd[1]: Starting Network Time Synchronization...
mar 05 18:49:12 mail systemd[1]: Started Network Time Synchronization.
mar 05 18:49:12 mail systemd-timesyncd[18889]: Synchronized to time server for the first time 192.168.130.97:123 (ntp.empresa.midominio.cu).

Para obtener mas informacion de la sincronización con el servidor NTP, corremos el siguiente comando:

timedatectl show-timesync

Debe devolver lo siguiente:

SystemNTPServers=ntp.empresa.midominio.cu
FallbackNTPServers=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
ServerName=ntp.empresa.midominio.cu
ServerAddress=192.168.130.97
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=34min 8s
NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=3, Precision=-20, RootDelay=31.982ms, RootDispersion=105.743ms, Reference=C0A8686D, OriginateTimestamp=Wed 2021-03-10 15:34:56 CST, ReceiveTimestamp=Wed 2021-03-10 15:34:56 CST, TransmitTimestamp=Wed 2021-03-10 15:34:56 CST, DestinationTimestamp=Wed 2021-03-10 15:34:56 CST, Ignored=yes PacketCount=45, Jitter=12.842ms }
Frequency=741315

NOTA: Debe contarse con un servidor NTP funcional o al menos la dirección de uno que este disponible.

1.3. Implementación y configuración de ESMTP Postfix

Crear el archivo “/etc/mailname”, agregándole el dominio de correo:

echo "empresa.midominio.cu" > /etc/mailname

Eliminando “sendmail”, “exim” y demás variantes de MTA:

apt remove --purge exim4 exim4-base exim4-config exim4-daemon-light mailx mutt

Instalando Postfix, Dovecot, Sasl y paquetes asociados adicionales:

apt -y install postfix postfix-pcre postfix-ldap dovecot-common dovecot-core dovecot-pop3d dovecot-imapd dovecot-ldap sasl2-bin libsasl2-modules libsasl2-modules-ldap libnet-ldap-perl ldap-utils arj arc bzip2 cabextract cpio file lzma xz-utils lhasa lzop rpm2cpio gzip nomarch pax lzop rar unrar unzip unace razor pyzor tnef zip p7zip-full

El proceso de instalación de Postfix, realiza una pregunta, a la cual debe seleccionar según el roll que tendrá su servidor:

• Sin configuración (Mantiene la configuración actual intacta).
• Sitio de internet (su servidor gestiona el correo entrante y saliente directamente desde internet).
• Internet con <> (Su servidor gestiona el correo entrante directamente desde internet o mediante fetchmail, el correo saliente mediante otro servidor de correo que actúa como smarthost).
• Local (Su servidor de correos solamente gestiona correos relacionados con su dominio, es decir a modo local).

Usted por el momento puede seleccionar la opción “Sitio de internet”, puesto que más adelante va a cambiar todo lo relacionado con el comportamiento de su servidor de correos mediante el archivo de configuración.

Posteriormente debe aparecer el nombre del dominio al que va a responder su servidor de correo, por ejemplo “empresa.midominio.cu”, el que usted debe confirmar.

Editando “/etc/default/saslauthd”:

nano /etc/default/saslauthd

Busque las coincidencias que aparecen a continuación y cámbielas como se representa en el fragmento siguiente:

# [...]
START=yes
# [...]

Creando los archivos de control para “saslauthd”:

mkdir -p /var/spool/postfix/var/run/saslauthd
rm -rf /var/run/saslauthd
ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd

Agregando el usuario “postfix” al grupo “sasl”:

adduser postfix sasl

Reiniciando saslauthd:

systemctl restart saslauthd

Crear grupos y usuarios asociados a la integración con el AD DC:

groupadd -g 5000 vmail
useradd -d /home/vmail -s /bin/false -m -u 5000 -g 5000 -c "Directorio virtual para buzones" vmail

Creando los certificados SSL:

Los certificados SSL que se generan a continuación se encuentran en función del FQDN del servidor en cuestión, donde al ejecutar los siguientes comandos relacionados con el certificado SSL usted debe cambiar el valor “empresa.midominio.cu” por el nombre de su dominio.

cd /etc/ssl

Al ejecutar el siguiente comando debe solicitar una clave, queda a su criterio cual usar, al escribir la contraseña y presionar la tecla “ENTER” le solicita que escriba nuevamente la contraseña a modo de verificación de la misma.

openssl genrsa -des3 -out smtp.key 2048

-Pide una contraseña: 123456
-Confirmamos la contraseña: 123456

Al ejecutar el siguiente comando le va a solicitar una contraseña la cual debe coincidir con la contraseña que utilizo en el comando anterior, además de una serie de datos los cuales van a estar contenidos en su certificado (SSL), como ejemplo se toma el FQDN perteneciente a los datos que se siguen en esta guía, “smtp”, y a continuación se representan las respuestas, las cuales usted debe adecuar según su red, si su servicio de correo cuenta con acceso desde una red WAN y una red LAN usted debe crear los certificados pertenecientes a cada una, en este ejemplo solo se lleva a cabo el certificado perteneciente a la red LAN, por las características de la red de este tutorial:

openssl req -new -key smtp.key -out smtp.csr

Debe devolver lo siguiente:

Enter pass phrase for smtp
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [AU]:CU
State or Province Name (full name) [Some-State]:HABANA
Locality Name (eg, city) []:LaHabana
Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA
Organizational Unit Name (eg, section) []:REDES
Common Name (e.g. server FQDN or YOUR name) []:smtp.empresa.midominio.cu
Email Address []:[email protected]

Al finalizar el proceso vuelve a solicitar una contraseña la cual debe coincidir con la contraseña que ha utilizado anteriormente en el proceso de generación del certificado, dicha contraseña al ser escrita se va a visualizar en texto plano en su consola, al presionar la tecla “ENTER” solicita el nombre de la compañía.

Posteriormente debe generar el certificado con la llave emisora, por 2 años en este ejemplo, donde al ejecutar el siguiente comando vuelve a solicitar la misma contraseña:

openssl x509 -req -days 730 -in smtp.csr -signkey smtp.key -out smtp.crt

Cada vez que un servicio con un certificado SSL valla a ser iniciado, debería pedir una contraseña, para asegurar que el legítimo operador de servicio ha sido quien le ordenó la arrancada. Pero poner una contraseña cada vez que inicia Postfix, sería algo tedioso. Por tanto, la solución a esta problemática pudiera ser quitar la clave. Al ejecutar el siguiente comando debe solicitar nuevamente la clave, usted debe utilizar la misma contraseña que ha utilizado en todo el proceso de generación del certificado SSL:

openssl rsa -in smtp.key -out smtp.key.sinpassword

Cambiamos el nombre de la llave recién generada:

mv smtp.key.sinpassword smtp.key

Emitiendo una autoridad de raíz, donde nuevamente debe solicitar una contraseña y los mismos datos que anteriormente usted aportó:

openssl req -new -x509 -extensions v3_ca -keyout cakey.pem -out cacert.pem -days 730

Como podrá observar le solicita los mismos datos que usted aporto anteriormente, los cuales deben coincidir:

Generating a 2048 bit RSA private key
..............................................................................................................+++++
.............................................................................+++++
writing new private key to 'cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CU
State or Province Name (full name) [Some-State]:HABANA
Locality Name (eg, city) []:LaHabana
Organization Name (eg, company) [Internet Widgits Pty Ltd]:EMPRESA
Organizational Unit Name (eg, section) []:REDES
Common Name (e.g. server FQDN or YOUR name) []:smtp.empresa.midominio.cu
Email Address []:[email protected]

Asignando permisos y posicionando los certificados correctamente:

chmod 600 /etc/ssl/smtp.key
chmod 600 /etc/ssl/cakey.pem
mv /etc/ssl/smtp.key /etc/ssl/private/
mv /etc/ssl/smtp.crt /etc/ssl/certs/
mv /etc/ssl/cakey.pem /etc/ssl/private/
mv /etc/ssl/cacert.pem /etc/ssl/certs/
mkdir /etc/postfix/certs
cd /etc/postfix/certs
openssl dhparam -2 2048 > /etc/postfix/certs/dh_2048.pem
openssl dhparam -2 1024 > /etc/postfix/certs/dh_1024.pem

NOTA: Debe contarse con un servidor NTP funcional o al menos la dirección de uno que este disponible.

1.3.1. Selección de cifrados

Seleccionar una suite de cifrados puede ser todo un desafío en Postfix. Muchas consideraciones se han de tener en cuenta a la hora de tomar la decisión correcta. Algunas de ellas pudieran citarse, como son: las capacidades del servidor y el cliente, certificado de autoridad con requerida compatibilidad. La suite de cifrados debe ser lo suficientemente flexible con otros servidores, de lo contrario problemas de compatibilidad pudieran ocurrir. Si no se soporta en alguno de los extremos (cliente o servidor) ocurrirán errores durante el intercambio de llaves.

Para cumplir con los requerimientos establecidos al inicio del ejemplo, los autores de este tutorial tienen como requisito el uso de cifrados que sean AEAD o PFS (Perfect Frorward Secrecy). Se entiende por PFS, como la propiedad de los sistemas criptográficos que garantiza que el descubrimiento de las claves utilizadas actualmente no compromete la seguridad de las claves usadas con anterioridad (no las revela), por tanto, la seguridad de lo que se hizo usando claves antiguas persiste. Cuando un sistema tiene cifrados PFS se dice que el sistema es seguro hacia adelante.

Los cifrados que serán autorizados a usarse en “submission”, serán los siguientes:

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256
  • ECDHE-RSA-AES256-GCM-SHA384
  • ECDHE-RSA-AES128-GCM-SHA256

Los cifrados de TLSv1.3 siempre serán utilizados, mientras se soporte el protocolo y no se excluya su uso en la configuración. Lo que hay que lograr ahora, es que solamente se puedan usar para TLSv1.2 los especificados en la lista anterior. Esto lo podremos lograr redefiniendo la lista de cifrados “high” para TLS en Postfix, siempre y cuando especifiquemos el patrón que los diferencia. Con un poco de observación, podemos crear un filtro que nos de los cifrados ECDHE requeridos (los de TLSv1.3 no es necesario filtrarlos): ECDHE+AESGCM:-ECDSA:@STRENGTH

Para el caso de los cifrados aNULL, estos son usados para autenticación anónima en un canal encriptado. Al inicio del tutorial no había ningun requisito para usar los cifrados de autenticación anónima, pero haremos el procedimiento para obtener los mas seguros de TLSv1.2, ya que en TLSv1.3, todos son seguros.

Este tipo de cifrados es muy útil en conexiones “servidor-servidor”, donde no se quiera autenticar a un host definido como confiable, pero que tampoco se quiere que la comunicación entre ambos vaya a través de un canal inseguro. Es normal que la comunicación entre servidores MTA viaje a través de una red de transporte, que puede no pertenecer a la propia empresa, sino al proveedor de servicios o Internet. Por tanto, mejor usar un canal encriptado sin autenticación, que uno sin encriptar.

Los cifrados para auntenticacion anónima a utilizar, los obtendremos del siguiente comando:

openssl ciphers -V 'aNULL'

La línea anterior indica a OpenSSL que se listen todos los cifrados que usan autenticación anónima (aNULL).

El comando nos devuelve una lista de cifrados, de los cuales nos quedamos con los mas fuertes de TLSv1.3 y los dos más seguros de TLSv1.2:

0x13,0x02 - TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD
0x13,0x03 - TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD
0x13,0x01 - TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD
0x00,0xA7 - ADH-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=None Enc=AESGCM(256) Mac=AEAD
0x00,0xA6 - ADH-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=None Enc=AESGCM(128) Mac=AEAD
# [...]

Si hubiésemos listado por la expresión ‘aNULL:@STRENGTH’ nos hubieses listado los cifrados mas fuertes sin tener en cuenta la versión del protoclo como una prioridad y no se cumplirían con algunas restricciones de nuestro servidor. O sea, aun cuando los siguientes cifrados son mas fuertes que uno de nuestros candidatos finales, quedan excluidos:

  • ADH-AES256-SHA256 (usa cifrado CBC, vulnerable).
  • AECDH-AES256-SHA (usa un protocolo TLSv1, no autorizado).
  • ADH-AES256-SHA (usa un protocolo SSLv3, no autorizado).
  • ADH-CAMELLIA256-SHA (usa un protocolo SSLv3, no autorizado).

Por tanto, para autenticación la anónima, estarán disponibles los siguientes cifrados:

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256
  • ADH-AES256-GCM-SHA384
  • ADH-AES128-GCM-SHA256

La combinanción que buscamos para ser usada en Postfix, que sea la equivalente a los cifrados de arriba, sería: ADH+AESGCM:@STRENGTH

1.3.2. Configurando Postfix

Haciendo una copia del archivo de configuración de Postfix:

cp /etc/postfix/main.cf{,.orig}

Creamos el fichero de configuración de mayor prioridad en Postfix:

nano /etc/postfix/master.cf

Procuramos que las siguientes opciones se encuentren como se muestran, a continuación:

# ==========================================================================
# service type private unpriv chroot wakeup maxproc command + args
# (yes) (yes) (no) (never) (100)
# ==========================================================================
#
# [smtp]
smtp inet n - y - - smtpd
#### Deshabilitar opciones especificas, segun el CIDR del cliente SMTP remoto
  -o smtpd_discard_ehlo_keyword_address_maps=cidr:${config_directory}/reglas/esmtp_access.cidr
####
#### Habilitar encriptacioon TLS oportunista (no es obligado usar TLS)
  -o smtpd_tls_security_level=may
####
#### Redefinir la lista de OpenSSL para el grado "high" de los cifrados
  -o tls_high_cipherlist=ADH+AESGCM:@STRENGTH
#
# [submission]
submission inet n - y - - smtpd
#### Deshabilitar opciones especificas
  -o smtpd_discard_ehlo_keywords=silent-discard,etrn,dsn
####
#### Habilitar TLS mandatorio
  -o smtpd_tls_security_level=encrypt
####
#### Redefinir la lista de OpenSSL para el grado "high" de los cifrados
  -o tls_high_cipherlist=ECDHE+AESGCM:-ECDSA:@STRENGTH
####
#### Habilitar auth SASL
  -o smtpd_sasl_auth_enable=yes
# [...]

Agregue al final del archivo lo siguiente:

dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}

Haciendo una copia del archivo de configuración de Postfix:

mv /etc/postfix/main.cf{,.orig}

Creando un nuevo archivo de configuración principal para Postfix:

nano /etc/postfix/main.cf

Agregue el siguiente contenido adaptando, según sus datos de red:

#=========
# NETWORK
#=========

# Especificar el texto que le sigue al coodigo de respuesta "220" (OK, continuar con el siguiente comando) del servidor SMTP
smtpd_banner = $myhostname ESMTP

# Interfaces de red por las que escucha el servidor SMTP
inet_interfaces = all
inet_protocols = ipv4

# Redes confiables (normalmente el localhost y el relayhost), que tienen permitido hacer relay o retransmitir correo al servidor SMTP
mynetworks =
  127.0.0.0/8,
  192.168.130.87/32

# Servidor relay de correo
relayhost = [192.168.130.87]:26

# Especificar variables a usar en la configuracioon
mydomain = empresa.midominio.cu
myhostname = mail.$mydomain
myorigin = $mydomain
mydestination =
  localhost,
  localhost.localdomain,
  localhost.$mydomain,
  #listas.$mydomain,
  $myhostname

#=========
# VIRTUAL
#=========

virtual_minimum_uid = 5000
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# Mapeo del login de usuarios vs cuenta de correo (para evitar suplantacioon de identidad)
smtpd_sender_login_maps = proxy:ldap:${config_directory}/ldap/email_vs_user.cf

virtual_alias_maps =
  hash:${config_directory}/aliases/mailman_alias,
  hash:${config_directory}/aliases/user_alias,
  proxy:ldap:${config_directory}/aliases/group_alias.cf

virtual_mailbox_maps = ldap:${config_directory}/ldap/mailbox_maps.cf

virtual_mailbox_domains = $mydomain
virtual_mailbox_limit = 0
virtual_mailbox_base = /home/vmail/
virtual_transport = dovecot

#=======
# ALIAS
#=======

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases

#===========
# TRANSPORT
#===========

# Enrutamiento de correos
#transport_maps = hash:${config_directory}/transport

#=========
# MAILBOX
#=========

home_mailbox = Maildir/
mailbox_size_limit = 0
message_size_limit = 10485760
#owner_request_special = no
#dovecot_destination_recipient_limit = 1

#==========
# SECURITY
#==========

postscreen_greet_action = drop
disable_vrfy_command = yes

# Lista de comandos que el servidor prohiibe para el cliente STMP remoto, de lo contrario terminaraa la sesioon
smtpd_forbidden_commands =
  VRFY,
  EXPN,
  CONNECT,
  ETRN,
  GET,
  PASS,
  POST,
  USER

#=====
# TLS
#=====

#===== Opciones TLS para el servidor

# CA, llave y certificado del servidor SMTP
smtpd_tls_cert_file = /etc/ssl/certs/smtp.crt
smtpd_tls_key_file = /etc/ssl/private/smtp.key
smtpd_tls_CAfile = /etc/ssl/certs/cacert.pem

# Habilitar que no se anuncie o acepte autenticacioon SASL sobre conexiones no encriptadas, cuando la encriptacioon TLS es opcional en el servidor SMTP
smtpd_tls_auth_only = yes

# Protocolos TLS aceptados por el servidor SMTP para TLS oportunista
smtpd_tls_protocols =
  !SSLv2,
  !SSLv3,
  !TLSv1,
  !TLSv1.1

# Protocolos TLS aceptados por el servidor SMTP para TLS mandatorio
smtpd_tls_mandatory_protocols =
  !SSLv2,
  !SSLv3,
  !TLSv1,
  !TLSv1.1

# Grado miinimo de los cifrados que usara el servidor SMTP para la encriptacioon por TLS oportunista
smtpd_tls_ciphers = high

# [submission] Grado miinimo de los cifrados que usara el servidor SMTP para la encriptacioon por TLS mandatorio
smtpd_tls_mandatory_ciphers = high

# Establecer la preferencia del orden de cifrado por el servidor SMTP
tls_preempt_cipherlist = yes

# Archivo con paraametros DH que el servidor Postfix SMTP deberaa utilizar con cifrados EDH no exportables
smtpd_tls_dh1024_param_file = ${config_directory}/certs/dh_2048.pem

# Archivo con paraametros DH que el servidor Postfix SMTP deberaa utilizar con cifrados EDH exportables
smtpd_tls_dh512_param_file = ${config_directory}/certs/dh_1024.pem

# Grado de seguridad del servidor para el intercambio de llaves EECDH
smtpd_tls_eecdh_grade = strong

# Opciones del servidor para la cachee de la sesioon TLS
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache

# Proteccioon contra ataques de estresamiento al CPU el servidor SMTP
tls_ssl_options = NO_RENEGOTIATION

# Nivel de detalles de los registros de la actividad TLS en el servidor SMTP
smtpd_tls_loglevel = 2

#===== Opciones TLS para el cliente

# Habilitar uso de encriptacioon no obligatoria en el cliente (TLS oportunista)
smtp_tls_security_level = may

# Grado miinimo de los cifrados que usara el cliente SMTP para la encriptacioon por TLS oportunista
smtp_tls_ciphers = high

# Protocolos TLS aceptados por el cliente SMTP para TLS oportunista
smtp_tls_protocols =
  !SSLv2,
  !SSLv3,
  !TLSv1,
  !TLSv1.1

# Proteccioon contra vulnerabilidad (CVE-2009-3555)
smtp_tls_block_early_mail_reply = yes

# Nivel de detalles de los registros de la actividad TLS en el cliente SMTP
smtp_tls_loglevel = 1

#======
# SASL
#======

# Nombre del dominio de autenticacioon SASL local del servidor SMTP
smtpd_sasl_local_domain = $mydomain

# Tipo de plugin SASL que el servidor debe usar para autenticacioon
smtpd_sasl_type = dovecot

# Fichero para el plugin de SASL especificado por el servidor
smtpd_sasl_path = private/auth

# Deshabilitar autenticacioon anoonima y en texto plano con el servidor
smtpd_sasl_security_options =
  noanonymous,
  noplaintext

# Deshabilitar autenticacioon anoonima en el servidor para las sesiones encriptadas por TLS
smtpd_sasl_tls_security_options = noanonymous

#===============
# RESTRICCIONES
#===============

# Habilitar que el servidor requiera el comando "HELO" o "EHLO" antes de enviar un correo
smtpd_helo_required = yes

# Demorar el rechazo de los clientes no autenticados hasta el "RCPT TO"
smtpd_delay_reject = yes

# Restricciones para el encabezado del mensaje
#header_checks =
  #regexp:${config_directory}/reglas/header_checks.regexp,
  #pcre:${config_directory}/reglas/header_checks.pcre

# Restricciones para los adjuntos
#mime_header_checks = regexp:${config_directory}/reglas/adjuntos.regexp

# Restricciones para el cuerpo del mensaje
#body_checks = regexp:${config_directory}/reglas/body_checks.regexp

# Alias para las restricciones de los grupos de acceso de correo
#smtpd_restriction_classes =
  #mail_nacional_in,
  #mail_nacional_out,
  #mail_local_in,
  #mail_local_out

# Correo Nacional en entrada
# Si el remitente es de ".cu" --> RELAY
# Si no, entonces es una direccion de correo internacional --> REJECT
#mail_nacional_in = check_sender_access regexp:${config_directory}/reglas/filtro_nacional

# Correo Nacional en salida
# Si el destinatario es de ".cu" --> RELAY
# Si no, entonces es una direccion de correo internacional --> REJECT
#mail_nacional_out = check_recipient_access regexp:${config_directory}/reglas/filtro_nacional

# Correo Local en entrada
# Si el remitente es del dominio local --> RELAY
# Si no, entonces es una direccion de correo nacional o internacional --> REJECT
#mail_local_in = check_sender_access regexp:${config_directory}/reglas/filtro_local

# Correo Local en salida
# Si el destinatario es del dominio local --> RELAY
# Si no, entonces es una direccioon de correo nacional o internacional --> REJECT
#mail_local_out = check_recipient_access regexp:${config_directory}/reglas/filtro_local

# Restricciones opcionales para los clientes SMTP remotos
smtpd_client_restrictions =
  #
  # Permitir los CIDR confiables
  permit_mynetworks,
  #
  # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH)
  permit_sasl_authenticated,
  #
  # Lista negra para remitentes y hostnames
  #check_sender_access pcre:${config_directory}/reglas/sender_checks.pcre,
  #check_helo_access pcre:${config_directory}/reglas/helo_checks.pcre,
  #
  # Rechazar cuando la direccioon IP inversa del cliente coincida con el registro "A" de los siguientes dominios
  reject_rbl_client bl.spamcop.net,
  reject_rbl_client cbl.abuseat.org,
  reject_rbl_client zen.spamhaus.org,
  reject_unknown_client_hostname,
  #
  # Poliitica por defecto
  permit

# Restricciones opcionales en el contexto del cliente SMTP ejecutando el comando "HELO" o "EHLO"
smtpd_helo_restrictions =
  #
  # Permitir los CIDR confiables
  permit_mynetworks,
  #
  # Permitir solo si se ha autenticado
  permit_sasl_authenticated,
  #
  # Rechazar si al usar el comando "HELO" o "EHLO" se especifica un hostname malformado
  reject_invalid_helo_hostname,
  #
  # Rechazar si al usar el comando "HELO" o "EHLO" se especifica un hostname que no tiene la forma de FQDN
  reject_non_fqdn_helo_hostname,
  #
  # Rechazar si al usar el comando "HELO" o "EHLO" se especifica un hostname que no tiene un registro DNS "A" o "MX" valido
  reject_unknown_helo_hostname,
  #
  # Poliitica por defecto
  permit

# Restricciones opcionales para el remitente, en el contexto del cliente SMTP ejecutando el comando "MAIL FROM"
smtpd_sender_restrictions =
  #
  # Rechazar si la direccioon del remitente especifica un dominio que no tiene la forma de FQDN
  reject_non_fqdn_sender,
  #
  # Rechazar si la direccion del remitente no esta en la lista de usuarios vaalidos
  reject_unlisted_sender,
  #
  # Permitir los CIDR confiables
  permit_mynetworks,
  #
  # Mapeo de las direcciones de correo entrante y saliente del servidor SMTP
  #check_recipient_access ldap:${config_directory}/ldap/nacional_in.cf,
  #check_sender_access ldap:${config_directory}/ldap/nacional_out.cf,
  #check_recipient_access ldap:${config_directory}/ldap/local_in.cf,
  #check_sender_access ldap:${config_directory}/ldap/local_out.cf,
  reject_sender_login_mismatch,
  #
  # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH)
  permit_sasl_authenticated,
  #
  # Rechazar remitente con dominio que no tiene un registro DNS "A" o "MX", o que se deba a un DNS mal configurado
  reject_unknown_sender_domain,
  #
  # Poliitica por defecto
  permit

# Restricciones opcionales para relay
smtpd_relay_restrictions =
  #
  # Permitir los CIDR confiables
  permit_mynetworks,
  #
  # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH)
  permit_sasl_authenticated,
  #
  # Rechazar a menos que Postfix sea un open relay o es el destino final
  reject_unauth_destination,
  #
  # Postfix verificaraa siempre el estado de la cuota del usuario ante la llegada de un nuevo correo
  #check_policy_service inet:127.0.0.1:12340,
  #
  # Poliitica por defecto
  permit

# Restricciones opcionales para el destinatario, en el contexto del cliente SMTP ejecutando el comando "RCPT TO"
smtpd_recipient_restrictions =
  #
  # Rechazar si la direccioon del destinatario especifica un dominio que no tiene la forma de FQDN
  reject_non_fqdn_recipient,
  #
  # Rechazar destinatario con dominio que no tiene un registro DNS "A" o "MX", o que se deba a un DNS mal configurado
  reject_unknown_recipient_domain,
  #
  # Rechazar si la direccioon del destinatario no estaa en la lista de usuarios vaalidos
  reject_unlisted_recipient,
  #
  # Permitir los CIDR confiables
  permit_mynetworks,
  #
  # Lista negra para destinatarios
  #check_recipient_access pcre:${config_directory}/reglas/recipient_checks.pcre
  #
  # Permitir solo si el cliente es satisfactoriamente autenticado por el protocolo RFC 4954 (AUTH)
  permit_sasl_authenticated,
  #
  # Poliitica por defecto
  permit

# Restricciones opcionales en el contexto del cliente SMTP ejecutando el comando "RCPT TO"
smtpd_data_restrictions =
  #
  # Rechazar cuando el cliente enviia comandos SMPT antes de tiempo cuando no esta permitido, o sin saber
  # que Postfix soporta comandos ESMTP
  # (Proteccioon contra SPAM de correos que usa inapropiadamente los comandos ESMTP)
  reject_unauth_pipelining,
  reject_multi_recipient_bounce,
  #
  # Poliitica por defecto
  permit

#=====
# BCC
#=====

# Copias ocultas de todos los correos especificados y salientes del servidor SMPT
#recipient_bcc_maps = hash:/etc/postfix/bcc/recipient_maps

# Copias ocultas de todos los correos especificados y entrantes del servidor SMPT
#sender_bcc_maps = hash:/etc/postfix/bcc/sender_maps

#=========
# LIMITES
#=========

bounce_template_file = /etc/postfix/bounce.cf
bounce_queue_lifetime = 3d
default_destination_concurrency_limit = 10
delay_warning_time = 4h
dovecot_destination_recipient_limit = 1
local_destination_concurrency_limit = 5
maximal_backoff_time = 8000s
maximal_queue_lifetime = 3d
minimal_backoff_time = 1000s
smtp_connect_timeout = 30
smtp_helo_timeout = 60s
smtp_mx_address_limit = 5
smtp_quit_timeout = 240s
smtp_rcpt_timeout = 240s
smtp_rset_timeout = 20s
smtpd_client_connection_count_limit = 3
smtpd_error_sleep_time = 1s
smtpd_hard_error_limit = 5
smtpd_junk_command_limit = 2
smtpd_recipient_limit = 20
smtpd_soft_error_limit = 1

#===============
# MISCELLANEOUS
#===============

compatibility_level = 2
biff = no
enable_long_queue_ids = yes
recipient_delimiter = +

notify_classes =
  bounce,
  2bounce,
  delay,
  policy,
  protocol,
  resource,
  software

# Debug para diagnosticos sobre determinada IP
# Descomentar para su uso y revisar "/var/log/mail.log"
#debug_peer_list = 192.168.130.87
#debug_peer_level = 16

Creamos el fichero “/etc/postfix/reglas/esmtp_access.cidr” para decidir a qué CIDR anunciar STARTTLS y otras opciones. Esto puede ser útil en caso de que el relayhost no esté en nuestras manos poder configurarlo y se trate de un servidor no actualizado a nuestros tiempos, que no soporta el protocolo mínimo de TLSv1.2, indicado por nuestro servidor y que al serle anunciado STARTTLS, intentará escalar a la conexión cifrada terminando en un error por imcomatabilidad de protocolos o cifrados.

nano /etc/postfix/reglas/esmtp_access.cidr

Agregamos lo siguiente:

# localhost:
127.0.0.0/8       silent-discard, auth, etrn, dsn

# relayhost dentro de la propia red empresarial (no hay red de transporte publica por medio):
192.168.130.87/32 silent-discard, starttls, auth, etrn, dsn

# resto de la red:
0.0.0.0/0         silent-discard, auth, etrn, dsn

1.3.3. Creando los archivos de controles para Postfix-LDAP

Se crea el directorio que contendrá las configuraciones para los mapeos de usuarios virtuales de LDAP:

mkdir /etc/postfix/ldap
  • Mapeo de usuarios virtuales de correo:
nano /etc/postfix/ldap/email_vs_user.cf

Agregue el siguiente contenido adaptando a su red:

server_host = dc1.empresa.midominio.cu
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = EMPRESA\administrator
bind_pw = Admin*123
search_base = OU=Usuarios,DC=empresa,DC=midominio,DC=cu
scope = sub
query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute = mail
debuglevel = 0

NOTA: Las consultas LDAP entre el servidor de correo y el AD DC no serán encriptadas, pues el servidor MTA se encuentra en la misma subred del AD DC y el tráfico broadcast de dicha red está separado del segmento de los usuarios. No existe posibilidad de un ataque MITM.

  • Mapeo de buzones virtuales de correo:
nano /etc/postfix/ldap/mailbox_maps.cf

Agregue el siguiente contenido modificando lo que se encuentra resaltado en blanco, según sus datos de red:

server_host = dc1.empresa.midominio.cu
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = EMPRESA\administrator
bind_pw = Admin*123
search_base = OU=Usuarios,DC=empresa,DC=midominio,DC=cu
scope = sub
query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
result_attribute = mail
result_format = %d/%u/Maildir/
debuglevel = 0
  • Mapeo de alias para grupos del AD:

Se crea el directorio que contendrá las configuraciones para los mapeos de los aliases:

mkdir /etc/postfix/aliases

Editamos el siguiente fichero:

nano /etc/postfix/aliases/group_alias.cf

Agregue el siguiente contenido adaptando a su red:

server_host = dc1.empresa.midominio.cu
server_port = 389
version = 3
bind = yes
start_tls = no
bind_dn = EMPRESA\administrator
bind_pw = Admin*123
search_base = OU=Grupos,DC=empresa,DC=midominio,DC=cu
scope = sub
query_filter = (&(objectClass=group)(mail=%s))
leaf_result_attribute = mail
special_result_attribute = member
debuglevel = 0
  • Mapeo de alias personales o de correción de errores:

Ahora es necesario declarar el fichero que contendrá los alias de los usuarios virtuales, ya que “/etc/aliases” sólo funciona para usuarios locales:

nano /etc/postfix/users_alias

En este caso, agregamos los siguientes ejemplos:

# NOTA!!!: Este fichero requiere un "postmap"

# Aliases para cuentas de correo que no coinciden con las del dominio
usuario2.apellido usuario2
usuario3.apellido u3apellido

# Aliases para cuentas de correo que no pertenecen al dominio
especialista      [email protected]

# Aliases de grupo con usuarios que no pertenecen al dominio
proyectowifi      usuario1.apellido,[email protected]

NOTA: Especificamos el dominio solo si se trata de una cuenta de correo de otro dominio.

Generamos el mapa del fichero:

postmap /etc/postfix/aliases/user_alias

Recargamos Postfix:

systemctl reload postfix.service

Chequear si Postfix tiene algún error en la configuración

postfix check

NOTA: Omitir el siguiente WARNING:

postfix/postfix-script: warning: symlink leaves directory: /etc/postfix/./makedefs.out

1.3.4. Comprobando la integración con LDAP y mapeos de aliases

Verificamos los usuarios por defecto del DC:

ldapsearch -x -h dc1.empresa.midominio.cu -D 'EMPRESA\administrator' -W -b 'CN=Users,DC=empresa,DC=midominio,DC=cu' | perl -p00e 's/\r?\n //g'

Luego de especificar correctamente la contraseña, debe devolver los usuarios del contenedor “Users”.

Verificamos los usuarios del DC, que se encuentran en el OU=»Usuarios»:

ldapsearch -x -h dc1.empresa.midominio.cu -D 'EMPRESA\administrator' -W -b 'OU=Usuarios,DC=empresa,DC=midominio,DC=cu' | perl -p00e 's/\r?\n //g'

Luego de especificar correctamente la contraseña, debe devolver los usuarios de la empresa, los de la unidad organizativa “Usuarios”.

Digamos que se tiene el siguiente caso:

  • Usuario de correo “[email protected]” con nombre usuario igual a la cuenta del dominio, que pertenece al grupo de “Redes” con dirección de correo propia “[email protected]” y forma parte de un alias de especifico para usuarios “[email protected]”.
  • Usuario de correo “[email protected]” con nombre de usuario distinto a la cuenta del dominio (usuario2.apellido), que pertenece al grupo de “Redes” y forma parte de un especifico para usuarios, que corrige el destino de los correos que se escriban a la dirección de correo, teniendo en cuenta su nombre de la cuenta del dominio y no del correo.
  • Usuario de correo “[email protected]” con nombre de usuario distinto a la cuenta del dominio (usuario3.apellido) y que también tiene un alias especifico para corregir errores.

Probando usuarios válidos para autenticación:

postmap -q [email protected] ldap:/etc/postfix/ldap/email_vs_user.cf

Debe devolver algo, como lo siguiente:

[email protected]

Probando el buzón de usuario:

postmap -q [email protected] ldap:/etc/postfix/ldap/mailbox_maps.cf

Debe devolver algo, como lo siguiente:

empresa.midominio.cu/usuario1.apellido/Maildir/

La dirección física del buzon se encuentra en la siguiente ruta:

/home/vmail/empresa.midominio.cu/usuario2/Maildir/

Probando alias para grupos del AD:

postmap -q [email protected] ldap:/etc/postfix/aliases/group_alias.cf

Debe devolver algo, como lo siguiente:

[email protected],[email protected]

Probando alias personales:

postmap -q usuario2.apellido hash:/etc/postfix/aliases/user_alias

Debe devolver algo, como lo siguiente:

[email protected]

Probando alias personales para grupos de usuarios que no son del dominio:

postmap -q proyectowifi hash:/etc/postfix/aliases/user_alias

Debe devolver algo, como lo siguiente:

usuario1.apellido,[email protected]

Si algún cliente SMTP remoto intenta iniciar una conexión con el servidor por el puerto 25, no podrá autenticarse en el mismo:

telnet mail.empresa.midominio.cu 25
Trying 192.168.120.37...
Connected to mail.empresa.midominio.cu.
Escape character is '^]'.
220 mail.empresa.midominio.cu ESMTP
ehlo mail.empresa.midominio.cu
250-mail.empresa.midominio.cu
250-PIPELINING
250-SIZE 10485760
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SMTPUTF8
250 CHUNKING
auth
503 5.5.1 Error: authentication not enabled

Hasta este punto se tiene implementado un servidor con soporte para SMTP y submission.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 5

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Sobre Franco Diaz Hurtado 27 artículos
Ing. Telecomunicaciones y Electrónica; 1er Especialista en Redes de ECASA Nivel Central

5 comentarios

  1. Firefox 88.0 Firefox 88.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:88.0) Gecko/20100101 Firefox/88.0

    Que pudiera se el error que me da al chequiar el ejecutar el comando postfix check

    /usr/sbin/postconf: fatal: file /etc/postfix/master.cf: line 22: bad field count
    postfix/postfix-script: fatal: cannot execute /usr/sbin/postconf!

    Hice de todo en esas lineas, el error empiesa en la linea
    -o smtpd_discard_ehlo_keyword_address_maps=cidr:${config_directory}/reglas/esmtp_access.cidr

    si la comento me da error la que sigue…
    Saludos

  2. Firefox 89.0 Firefox 89.0 Mac OS X  10.12 Mac OS X 10.12
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:89.0) Gecko/20100101 Firefox/89.0

    Te felicito Franco, muy buen artículo y muy necesario, para nosotros los aprendices. Agradecido, una pequeña errata:

    Al inicio de 1.3.2. Configurando Postfix

    Dice cp /etc/postfix/main.cf{,.orig}
    Y en ese caso creo debe decir: cp /etc/postfix/master.cf{,.orig}
    Ya que es el archivo que a continuación editas.

    Al final de ese archivo (master.cf) dices debe añadirse la línea «flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}» pero a esa línea le fantan dos espacios delante, debe ser » flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}»

    En la viñeta · Mapeo de alias personales o de correción de errores:

    Dice: nano /etc/postfix/users_alias

    Debe decir: nano /etc/postfix/aliases/user_alias

    Si es posible arreglar y borrar este comentario.

    Y de nuevo, ¡¡¡¡MUY AGRADECIDO, MUY BUEN TUTO!!!!

  3. Firefox 87.0 Firefox 87.0 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0

    postmap -q [email protected] ldap:/etc/postfix/aliases/group_alias.cf

    Me devuelve:
    postmap: warning: dict_ldap_lookup: /etc/postfix/aliases/group_alias.cf: Search base ‘OU=Grupos,DC=empresa,DC=midominio,DC=cu’ not found: 32: No such object
    postmap: fatal: table ldap:/etc/postfix/aliases/group_alias.cf: query error: Success

    • Firefox 87.0 Firefox 87.0 Windows 10 x64 Edition Windows 10 x64 Edition
      Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0

      Adapta a tu estructura LDAP, la que pones es la de mi ejemplo, mi dominio, mi estructura del arbol LDAP

      • Firefox 87.0 Firefox 87.0 Windows 10 x64 Edition Windows 10 x64 Edition
        Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0

        Sï, lo adapté a mi estructura LDAP, lo que en el comentario lo reflejé con tu estructura, de todas formas seguiré probando. Saludos

Responder a Franco Diaz Hurtado Cancelar la respuesta

Tu dirección de correo electrónico no será publicada.


*