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

Í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

 

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

En esta sección se modificará la programación de la rotación de los logs de los servicios que conforman el correo. Se crearán un script que permitirá el envío de reportes de Postfix, con ayuda del plugin “pflogsumm”.

La idea será la siguiente:

  • Rotar los logs relacionados con el correo, siempre antes de finalizar el día 23:59.
  • Enviar el reporte de Postfix creado por “pflogsumm” con los logs antes de ser rotados (implicaría los logs del día finalizado).

Editamos la hora de rotación de los logs, mediante la edición de la hora de ejecución de las tareas del “cron.daily”:

nano /etc/crontab

Modificamos la siguiente línea, dejándola como se muestra:

# [...]
59 23 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
# [...]

Instalamos el plugin “pflogsumm”, para el envío de reportes de estadísticas de Postfix:

apt install -y pflogsumm

Instalamos las utilidades de correo para poder usar el comando “mail”, que será usado para el envío del reporte generado por “pflogsumm”:

apt install -y mailutils

Editamos el fichero «/etc/logrotate/rsyslog», no sin antes hacerle una salva:

mv /etc/logrotate.d/rsyslog{,.orig}
nano /etc/logrotate.d/rsyslog

Comentamos las siguientes opciones:

# [...]
#/var/log/mail.info
#/var/log/mail.warn
#/var/log/mail.err
#/var/log/mail.log
# [...]

Creamos un nuevo fichero de configuración de logrotate para el correo:

nano /etc/logrotate.d/mail

Agregamos lo siguiente:

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
{
  rotate 7
  daily
  dateext
  dateformat _%Y-%m-%d
  notifempty
  missingok
  compress
  delaycompress
  create 640 root adm
  sharedscripts
  prerotate
    /usr/sbin/pflogsumm -d today /var/log/mail.log | mail -a From:[email protected] -s "Reporte de Estadísticas de Postfix [$(date +%d-%b-%Y)]" [email protected]
  endscript
  postrotate
    /usr/sbin/invoke-rc.d rsyslog rotate > /dev/null
  endscript
}

#============================
NOTA:

  • rotate 7: Guardar 7 copias del archivo log.
  • daily: Rotar todos los días.
  • dateext: Agregar la fecha por cada rotación al antiguo log.
  • dateformat: Formato que debe usar la fecha.
  • notifempty: No rotar si el log está vacío.
  • missingok: Ignorar si no se encuentra el log.
  • compress: Comprimir las copias con gzip.
  • delaycompress: No comprimir la última rotación, en este caso “mail.*_YYYY-MM-DD”.
  • sharedscripts: Indica que los scripts añadidos se ejecutarán solamente una vez por ejecución y no una vez por archivo. En este caso, tenemos varios logs para “mail”, por lo que con esta opción imponemos que los scripts de “postrotate” se ejecuten solamente una vez por rotación, y no una vez para cada archivo de log. En caso de no indicar esta directiva, los scripts indicados en “postrotate” se ejecutarían tantas veces como tantos archivos log sean.
  • prerotate: Abre la posibilidad de que se permita la ejecución de scripts o comandos antes de la rotación del log.
  • postrotate: Abre la posibilidad de que se permita la ejecución de scripts o comandos después de la rotación del log.
  • endscript: Cierra la posibilidad de que se ejecute algun script o comando, abierta por un “prerotate” o “postrotate”.

#============================

Editamos la tarea programada diaria para «logrotate»:

nano /etc/cron.daily/logrotate

Modificamos la siguiente línea y la dejamos como sigue:

# [...]
/usr/sbin/logrotate /etc/logrotate.conf --force
# [...]

Eliminamos posibles rotaciones anteriores a la nueva configuración:

rm /var/log/mail.*.gz

Probamos manualmente la rotación de los logs:

logrotate /etc/logrotate.d/mail --state /var/lib/logrotate/mail-status --verbose --force

#===============================
NOTA:
Lo anterior debera haber forzado la rotación de los logs. Si los mismos fueron rotados, pero el nuevo fichero creado para los logs no recibe ninguna información y se mantiene en 0 Bytes, entonces recomendamos la siguiente configuración de logrotate para «/etc/logrotate.d/mail»:

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
{
  rotate 7
  daily
  dateext
  dateformat _%Y-%m-%d
  notifempty
  missingok
  compress
  delaycompress
  create 640 root adm
  sharedscripts
  prerotate
    /usr/sbin/pflogsumm -d today /var/log/mail.log | mail -a From:[email protected] -s "Reporte de Estadísticas de Postfix [$(date +%d-%b-%Y)]" [email protected]
  endscript
  postrotate
    systemctl restart rsyslog.service
  endscript
}

Si, aun así, sigue sin crecer el nuevo fichero creado, pues truncaremos el fichero original en lugar de crearlo:

/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
{
  rotate 7
  daily
  dateext
  dateformat _%Y-%m-%d
  notifempty
  missingok
  compress
  delaycompress
  copytruncate
  sharedscripts
  prerotate
    /usr/sbin/pflogsumm -d today /var/log/mail.log | mail -a From:[email protected] -s "Reporte de Estadísticas de Postfix [$(date +%d-%b-%Y)]" [email protected]
  endscript
}

#===============================

La rotación manual y forzada de los logs, de haber sido satisfactoria, debió haber enviado el correo de reporte de Postfix:

Borramos los posibles logs rotados, para que sean rotados a su debida hora programada:

rm /var/log/mail.info_*
rm /var/log/mail.warn_*
rm /var/log/mail.err_*
rm /var/log/mail.log_*

Reiniciar el demonio rsyslog:

systemctl restart rsyslog.service

8. Comprobando la encriptación TLS

Se utilizará el script “testssl.sh” para conocer las vulnerabilidades de los mecanismos de encriptación usados en el servicio de correo, asi como para verificar que estuvieran siendo seleccionados los cifrados esperados.

Lo primero será descargar la herramienta “testssl”:

cd /config/scripts
wget https://codeload.github.com/drwetter/testssl.sh/zip/3.0

Descompactamos el programa y accedemos a su directorio:

unzip testssl.sh-3.0.zip
cd testssl.sh-3.0

Creamos un enlace simbólico con el directorio «/bin», para que pueda ejecutarse como comando del sistema:

ln -s /config/scripts/testssl.sh-3.0/testssl.sh /bin/testssl

Damos permiso de ejecucion al script:

chmod +x /config/scripts/testssl.sh-3.0/testssl.sh

Ejecutamos las pruebas de seguridad, para “submisssion” (TLS mandatorio):

testssl --starttls smtp 127.0.0.1:587

Ejecutamos las pruebas de seguridad, brindadas por el script para SSL/TLS implícito en POP3:

testssl -p -P -U -f 127.0.0.1:995

Ejecutamos las pruebas de seguridad, brindadas por el script para STARTTLS en POP3:

testssl --starttls pop3 127.0.0.1:110

Ejecutamos las pruebas de seguridad, brindadas por el script para SSL/TLS implícito en IMAP:

testssl -p -P -U -f 127.0.0.1:993

Ejecutamos las pruebas de seguridad, brindadas por el script para STARTTLS en IMAP:

testssl --starttls imap 127.0.0.1:143

Ejecutamos las pruebas de seguridad, brindadas por el script para HTTPS:

testssl -p -P -U -f 127.0.0.1:443

En todos los casos, los resultados arrojados deberán tener en común, lo siguiente:

Comprobamos el cifrado por TLS oportunista:

testssl --starttls smtp 127.0.0.1:25

Entre los resultados, debe devolver los cifrados anónimos especificados por el servidor:

Otra forma de comprobarlo es accediendo desde un cliente SMTP remoto, como pudiera ser el relayhost, que tiene permitido iniciar una conexión anónima encriptada con el servidor. Desde el relayhost, ejecutamos lo siguiente:

telnet smtp.empresa.midominio.cu 25

Debe anunciarnos STARTTLS disponible, ya que hicimos una conexión exitosa al servidor y este tiene configurado TLS oportunista por el puerto 25:

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

Ahora probamos conectarnos por STARTTLS:

openssl s_client -quiet -connect smtp.empresa.midominio.cu:25 -starttls smtp

Nos debe devolver lo siguiente:

depth=0 C = CU, ST = HABANA, L = LaHabana, O = EMPRESA, OU = REDES, CN = smtp.empresa.midominio.cu, emailAddress = [email protected]
verify error:num=18:self signed certificate
verify return:1
depth=0 C = CU, ST = HABANA, L = LaHabana, O = EMPRESA, OU = REDES, CN = smtp.empresa.midominio.cu, emailAddress = [email protected]
verify return:1
250 CHUNKING
ehlo smtp.empresa.midominio.cu
250-mail.empresa.midominio.cu
250-PIPELINING
250-SIZE 10485760
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-SMTPUTF8
250 CHUNKING
auth login
503 5.5.1 Error: authentication not enabled
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
hola
.
250 2.0.0 Ok: queued as 4F1VyQ3yvYz211
quit
221 2.0.0 Bye

Vemos como no se pudo hacer login en el servidor, y si le hechamos una mirada a las trazas en el MTA, veremos que se negocio un intercambio de llaves y una conexión exitosa sin autenticación, usando un cifrado anónimo:

# [...]
Mar 18 00:58:02 mail postfix/smtpd[14877]: Anonymous TLS connection established from mailgw.empresa.midominio.cu[192.168.130.87]: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (2048 bits) server-digest SHA256

9. Iptables

El filtrado de paquetes es un componente fundamental dentro del concepto de seguridad de todo sistema informático en red. Por defecto, el núcleo de Linux incluye un filtro de paquetes de este tipo, que es proporcionado por los módulos del paquete de software Netfilter y es conocido por iptables.

Para facilitar el almacenamiento y recuperación de las reglas, instalamos el siguiente paquete:

apt install iptables-persistent -y

Modificamos el fichero que contendrá las reglas para IPv4:

cat /dev/null > /etc/iptables/rules.v4
nano /etc/iptables/rules.v4

Agregamos lo siguiente adaptando a su red:

*mangle
:PREROUTING ACCEPT [0:0]
:logging - [0:0]
#==================== PREROUTING RULES ====================#
-A PREROUTING -m conntrack --ctstate INVALID -j logging
-A PREROUTING -m conntrack --ctstate INVALID -j DROP
-A PREROUTING ! -s 192.168.3.0/24 -d 192.168.130.103 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j logging
-A PREROUTING ! -s 192.168.3.0/24 -d 192.168.130.103 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j DROP
#==================== END PREROUTING RULES ====================#

#======== LOGGING ========#
-A logging -m conntrack --ctstate INVALID -j NFLOG --nflog-prefix "[fw: INVALID BLOCK]" -m limit --limit 3/min --limit-burst 10
-A logging -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j NFLOG --nflog-prefix "[fw: SSH BLOCK]" -m limit --limit 3/min --limit-burst 10
-A logging -j RETURN
#======== END LOGGING ========#
COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#==================== INPUT RULES ====================#
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# SSH
-A INPUT -s 192.168.3.0/24 -m conntrack --ctstate NEW -p tcp -m tcp --dport 22 -j ACCEPT

# ICMP
-A INPUT -m conntrack --ctstate NEW -p icmp -m icmp --icmp-type echo-request -j REJECT -m comment --comment "Deny PING"

# Traceroute
-A INPUT -m conntrack --ctstate NEW -p udp -m udp --dport 33434:33534 -j REJECT -m comment --comment "Deny traceroute"

# MySQL/MariaDB
-A INPUT -s 192.168.3.0/24 -m conntrack --ctstate NEW -p tcp -m tcp --dport 3306 -j ACCEPT

# SMTP, HTTP, HTTPS, submission, IMAPS, POP3S
-A INPUT -m conntrack --ctstate NEW -p tcp -m tcp -m multiport --dports 25,80,443,587,993,995 -j ACCEPT
#======== END ETH0 ========#
#==================== END INPUT RULES ====================#
COMMIT

Aplicamos las reglas:

iptables-apply /etc/iptables/rules.v4

Puede verificar las reglas anteriores, con el siguiente comando:

iptables -t mangle -L -v
iptables -L -v
iptables -t nat -L -v

Para lograr bitacorizar iptables en un fichero log independiente, debemos seguir una serie de pasos que se describen a continuación.

Debemos crear el archivo “iptables.log” dentro de la carpeta “/var/log/firewall” que debemos crearla, y configurar los permisos:

mkdir -p /var/log/firewall/
touch /var/log/firewall/iptables.log
chmod 600 /var/log/firewall/iptables.log
chown root:adm /var/log/firewall/iptables.log

Rsyslog, el demonio de logueo de Debian, lee la configuración desde «/etc/rsyslog.d», por lo que debemos crear un archivo que yo llamaré «firewall.conf» desde el cual rsyslog, pueda interpretar lo que queremos hacer:

nano /etc/rsyslog.d/firewall.conf

Y dentro le dejamos caer suavemente el siguiente contenido:

:msg, contains, "fw: " -/var/log/firewall/iptables.log
& ~

La primera línea chequea los datos logueados buscando la cadena «fw: » y lo añade al archivo «/var/log/firewall/iptables.log».

La segunda, detiene el procesamiento de la información logueada con el patrón anterior para que no siga siendo enviada a «/var/log/messages».

Debemos crear el archivo «/etc/logrotate.d/iptables.log» para la rotación del fichero de logs:

nano /etc/logrotate.d/iptables

Agregamos lo siguiente:

/var/log/firewall/iptables.log
{
  rotate 7
  daily
  dateext
  dateformat _%Y-%m-%d
  notifempty
  missingok
  compress
  delaycompress
  create 640 root adm
  sharedscripts
  postrotate
    systemctl restart rsyslog.service
  endscript
}

Reiniciar el demonio rsyslog:

systemctl restart rsyslog.service

Esto es todo amigos. Espero les haya servido de mucha utilidad este tutorial. Cualquier feedback será bien recibido.

Saludos y hasta un próximo tuto 😉

 

¿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: 1

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

Sé el primero en comentar

Dejar una contestacion

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


*