ÍNDICE
La documentación abarcará lo siguiente:
1.Implementación de un servidor de correo con buzones.
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.2. Fortaleciendo la seguridad del cliente de correo web
2.3. Configuraciones desde la WebGUI de RainLoop
3.1. Outlook 2016
3.2. Outlook 2019
3.3. Thunderbird 78.8.0
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
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 😉
Dejar una contestacion