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
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:
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:postmaster@empresa.midominio.cu -s "Reporte de Estadísticas de Postfix [$(date +%d-%b-%Y)]" redes@empresa.midominio.cu endscript postrotate /usr/sbin/invoke-rc.d rsyslog rotate > /dev/null endscript }
#============================
NOTA:
#============================
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:postmaster@empresa.midominio.cu -s "Reporte de Estadísticas de Postfix [$(date +%d-%b-%Y)]" redes@empresa.midominio.cu 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:postmaster@empresa.midominio.cu -s "Reporte de Estadísticas de Postfix [$(date +%d-%b-%Y)]" redes@empresa.midominio.cu 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
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 = postmaster@empresa.midominio.cu 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 = postmaster@empresa.midominio.cu 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: user@gmail.com 250 2.1.0 Ok rcpt to: usuario1.apellido@empresa.midominio.cu 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
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 😉
Me complace anunciar la creación de esta útil herramienta (SquidStats), para el análisis y monitoreo…
La inteligencia artificial está revolucionando las industrias al automatizar tareas, predecir patrones y permitiendo tomar…
Uno de los grandes retos al que nos podemos enfrentar cuando una aplicación crece, es…
Percona Monitoring and Management (PMM) es una herramienta de código abierto para la supervisión y…
Qué es lo que deseo hacer en este capítulo? Básicamente un sonoff, quiero encender/apagar las…
Hace algunos meses estoy escuchando hablar del proyecto Home Assistant (HA). En palabras literales del…