En este tutorial, voy a compartir contigo mis consejos y trucos para proteger los servidores de correo electrónico contra la piratería. con un servidor VPN autohospedado. Muchos spammers intentan piratear los servidores de correo electrónico de otras personas. Si tiene éxito, usarían el servidor de correo electrónico pirateado para enviar grandes volúmenes de spam o robar datos valiosos. ¿Por qué usamos un servidor VPN autohospedado? Porque le permite habilitar la inclusión en la lista blanca, por lo que solo los usuarios de confianza conectados al servidor VPN pueden acceder a su servidor de correo.
Requisitos
Se supone que tienes un servidor de correo electrónico está funcionando. Si no, sigue uno de los tutoriales a continuación para configurar tu propio servidor de correo.
- Cómo configurar fácilmente un servidor de correo completo en Ubuntu 20.04 con iRedMail
- Cómo configurar fácilmente un servidor de correo en Debian 10 Buster con iRedMail
También se supone que ha configurado un servidor VPN . De lo contrario, siga uno de los tutoriales a continuación. El servidor de correo y el servidor VPN pueden ejecutarse en hosts separados o en el mismo host.
- Configure su propio servidor VPN WireGuard en Ubuntu
- Configure su propio servidor VPN WireGuard en Debian
Sugerencia :Se recomienda ejecutar el servidor VPN y el servidor de correo en hosts separados para reducir las complejidades operativas . Si el servidor de correo y el servidor VPN se ejecutan en el mismo host, se requieren pasos adicionales, a saber, configurar una zona de política de respuesta en el servidor VPN para anular el registro DNS A del nombre de host de su servidor de correo.
- Configurar la Zona de política de respuesta (RPZ) en BIND Resolver en Debian/Ubuntu
Digamos el registro DNS A para mail.yourdomain.com
se resuelve en 12.34.56.78
, debe crear un registro en la zona de política de respuesta para resolverlo en la dirección IP privada del servidor VPN 10.10.10.1
.
En los siguientes textos, uso 12.34.56.78
como la dirección IP pública del servidor VPN. Si el servidor VPN y el servidor de correo se ejecutan en el mismo host, debe reemplazar 12.34.56.78
con la dirección IP privada del servidor VPN 10.10.10.1
.
Paso 1:agregue la dirección IP del servidor VPN a la lista blanca del cortafuegos
Una vez que tenga un servidor de correo y un servidor VPN en funcionamiento, debe agregar la dirección IP del servidor VPN a la lista blanca del servidor de seguridad del servidor de correo. Si utiliza cortafuegos UFW (Debian/Ubuntu), ejecute el siguiente comando en el servidor de correo. Reemplace 12.34.56.78 con la dirección IP del servidor VPN.
sudo ufw insert 1 allow in from 12.34.56.78
También puede incluir en la lista blanca las direcciones IP de sus otros servidores. Por ejemplo, algunas personas pueden tener otro servidor web que necesita enviar correos electrónicos a través del servidor de correo electrónico. Luego también agréguelo a la lista blanca.
sudo ufw insert 1 allow in from IP-address-of-the-other-web-server
Paso 2:cierre el puerto de envío, el puerto IMAP y el puerto POP3
- Puerto de envío :587 y 465
- Puerto IMAP :143 y 993
- Puerto POP3 :110 y 995
Los clientes de correo como Mozilla Thunderbird y Microsoft Outlook utilizan los puertos 587 y 465 para enviar correos electrónicos salientes. Los piratas informáticos pueden realizar ataques de fuerza bruta en los puertos 587 y 465.
El siguiente es un ejemplo que se encuentra en mi registro de correo (/var/log/mail.log
en Debian/Ubuntu, /var/log/maillog
en CentOS/RHEL). El mal actor estaba tratando de iniciar sesión, pero falló la autenticación SASL cada vez.
postfix/smtps/smtpd[18071]: Anonymous TLS connection established from unknown[92.118.38.56]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) postfix/smtps/smtpd[18071]: warning: unknown[92.118.38.56]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: lost connection after AUTH from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: disconnect from unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 commands=2/3 postfix/smtps/smtpd[18071]: connect from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: Anonymous TLS connection established from unknown[92.118.38.56]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) postfix/smtps/smtpd[18071]: warning: unknown[92.118.38.56]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: lost connection after AUTH from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: disconnect from unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 commands=2/3 postfix/smtps/smtpd[18071]: connect from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: Anonymous TLS connection established from unknown[92.118.38.56]: TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits) postfix/smtps/smtpd[18071]: warning: unknown[92.118.38.56]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 postfix/smtps/smtpd[18071]: lost connection after AUTH from unknown[92.118.38.56] postfix/smtps/smtpd[18071]: disconnect from unknown[92.118.38.56] ehlo=1 auth=0/1 rset=1 commands=2/3
No quiero ver este tipo de actividad en mi registro de correo, así que simplemente cierro los puertos 587, 465, 143, 993, 110 y 995 en el firewall. Y debido a que la dirección IP de mi servidor VPN está incluida en la lista blanca, solo los usuarios que están conectados a mi servidor VPN pueden acceder a esos puertos.
Para cerrar estos puertos en el cortafuegos UFW, primero enumere las reglas de su cortafuegos.
sudo ufw status numbered
Salida de muestra
Como puede ver, existen reglas tanto de IPv4 como de IPv6. Para cerrar el puerto 587, necesito eliminar la regla #16
y #6
. (Primero debe eliminar la regla con un número de índice más alto).
sudo ufw delete 16 sudo ufw delete 6
Entonces deberías ejecutar sudo ufw status numbered
comando de nuevo para obtener una nueva lista de reglas de firewall. Observe que el número de índice cambió para algunas reglas.
Esta vez quiero cerrar el puerto 465, así que necesito eliminar la regla #15
y #6
.
sudo ufw delete 15 sudo ufw delete 6
Luego use el mismo método para cerrar los puertos 143, 993, 110 y 995. Por supuesto, debe mantener abierto el puerto 25 para recibir correos electrónicos de otros servidores SMTP.
Paso 3:Proteger el panel de administración y el correo web
Podemos cerrar los puertos 80 y 443 para proteger el panel de administración y el correo web de la piratería. Sin embargo, eso prohibirá el acceso público a todos los servidores virtuales. Algunas personas pueden tener hosts virtuales en Apache/Nginx que necesitan abrirse a Internet. En lugar de cerrar los puertos 80 y 443 en el firewall, podemos usar la función de control de acceso integrada en Apache/Nginx.
Nginx
Edite el archivo de host virtual para correo web, como
sudo nano /etc/nginx/conf.d/mail.your-domain.com.conf
Agregue las siguientes líneas al bloque del servidor SSL. Esto permitirá solo la dirección IP 12.34.56.78
para acceder al correo web y denegar todas las demás direcciones IP.
allow 12.34.56.78; deny all;
Si tiene varios servidores VPN, puede agregar varias direcciones IP de la siguiente manera:
allow 12.34.56.78; allow 12.34.56.79; deny all;
Guarde y cierre el archivo. Luego pruebe las configuraciones de Nginx.
sudo nginx -t
Si la prueba es exitosa, vuelva a cargar Nginx para que los cambios surtan efecto.
sudo systemctl reload nginx
Los usuarios que no estén en la lista blanca verán un error prohibido 403.
Apache
Edite el archivo de host virtual para correo web, como
sudo nano /etc/apache2/sites-enabled/mail.your-domain.com-le-ssl.conf
Agregue las siguientes líneas entre <VirtualHost>...</VirtualHost>
etiquetas Esto permitirá solo la dirección IP 12.34.56.78
para acceder al correo web y denegar todas las demás direcciones IP.
<LocationMatch "^/"> Require ip 12.34.56.78 </LocationMatch>
Si tiene varios servidores VPN, puede agregar varias direcciones IP de la siguiente manera:
<LocationMatch "^/"> Require ip 12.34.56.78 12.34.56.79 </LocationMatch>
Guarde y cierre el archivo. Luego pruebe las configuraciones de Apache.
sudo apache2ctl -t
Si la sintaxis es correcta, vuelva a cargar Apache para que los cambios surtan efecto.
sudo systemctl reload apache2
Los usuarios que no estén en la lista blanca verán un error prohibido 403.
Renovación del certificado TLS de Certbot
Si habilita la inclusión en la lista blanca en el host virtual Apache/Nginx, también bloqueará los servidores de Let's Encrypt para acceder a su servidor web, que es necesario para renovar el certificado TLS de Let's Encrypt con desafío HTTP-01. Para resolver este problema, podemos deshabilitar la inclusión en la lista blanca antes de la renovación del certificado y habilitarla nuevamente después de la renovación.
Cree un script de shell en /root/
directorio.
sudo nano /root/certbot-renewal.sh
Si usa Nginx, agregue las siguientes líneas a este archivo.
#! /bin/bash # disable whitelisting sed -i 's/deny all;/#deny all;/g' /etc/nginx/conf.d/mail.your-domain.com.conf systemctl reload nginx # renew TLS certificate certbot renew --quiet # enable whitelisting sed -i 's/#deny all;/deny all;/g' /etc/nginx/conf.d/mail.your-domain.com.conf systemctl reload nginx postfix dovecot
Si usa Apache, agregue las siguientes líneas a este archivo.
#! /bin/bash # disable whitelisting sed -i 's/Require ip/#Require ip/g' /etc/apache2/sites-enabled/mail.your-domain.com-le-ssl.conf systemctl reload apache2 # renew TLS certificate certbot renew --quiet # enable whitelisting sed -i 's/#Require ip/Require ip/g' /etc/apache2/sites-enabled/mail.your-domain.com-le-ssl.conf systemctl reload apache2 postfix dovecot
Guarde y cierre el archivo. Luego agregue permiso de ejecución a este archivo.
sudo chmod +x /root/certbot-renewal.sh
Luego edite el archivo crontab del usuario root.
sudo crontab -e
Agregue la siguiente línea al final del archivo, para que el script de shell se ejecute una vez al día.
@daily bash /root/certbot-renewal.sh
Guarde y cierre el archivo.
¿Cerrar puerto SSH?
Dado que la dirección IP de su servidor VPN está en la lista blanca, también puede cerrar el puerto SSH en el firewall. Sin embargo, hacerlo conlleva un riesgo. Si su servidor VPN deja de funcionar, entonces se bloqueará. Para proteger el servicio SSH de la piratería, recomiendo configurar la autenticación de clave pública o la autenticación de dos factores.
- Dos sencillos pasos para configurar el inicio de sesión SSH sin contraseña en Ubuntu
- Configurar la autenticación de dos factores SSH (2FA) en el servidor Ubuntu