In questo tutorial, condividerò con te i miei suggerimenti e trucchi per proteggere i server di posta CentOS/RHEL contro l'hacking con un server VPN self-hosted. Molti spammer stanno cercando di hackerare i server di posta di altre persone. In caso di successo, utilizzerebbe il server di posta hackerato per inviare grandi volumi di spam o rubare dati preziosi. Perché utilizziamo un server VPN self-hosted? Perché ti consente di abilitare la whitelist, quindi solo gli utenti fidati connessi al server VPN possono accedere al tuo server di posta.
Prerequisiti
Si presume che tu abbia un server di posta elettronica installato e funzionante. In caso contrario, segui uno dei tutorial seguenti per configurare il tuo server di posta.
- Come configurare facilmente un server di posta completo su CentOS 8 con iRedMail
Si presume inoltre che tu abbia configurato un server VPN . In caso contrario, segui uno dei tutorial qui sotto. Il server di posta e il server VPN possono essere eseguiti su host separati o sullo stesso host.
- Configura il tuo server VPN WireGuard su CentOS
Suggerimento :Si consiglia di eseguire il server VPN e il server di posta su host separati per ridurre le complessità operative . Se il server di posta e il server VPN vengono eseguiti sullo stesso host, sono necessari ulteriori passaggi, in particolare l'impostazione di una zona dei criteri di risposta sul server VPN per sovrascrivere il record DNS A pubblico del nome host del server di posta.
- Imposta la Response Policy Zone (RPZ) in BIND Resolver su CentOS/RHEL
Diciamo il record DNS A per mail.yourdomain.com
si risolve in 12.34.56.78
, quindi devi creare un record nella zona dei criteri di risposta per risolverlo nell'indirizzo IP privato del server VPN 10.10.10.1
.
Nei testi seguenti utilizzo 12.34.56.78
come indirizzo IP pubblico del server VPN. Se il server VPN e il server di posta funzionano sullo stesso host, è necessario sostituire 12.34.56.78
con l'indirizzo IP privato del server VPN 10.10.10.1
.
Passaggio 1:aggiungi l'indirizzo IP del server VPN alla whitelist del firewall
Una volta che hai un server di posta e un server VPN attivi e in esecuzione, dovresti aggiungere l'indirizzo IP del server VPN alla whitelist del firewall del server di posta. Se utilizzi Firewalld (CentOS/RHEL), eseguire il comando seguente sul server di posta. Sostituisci 12.34.56.78 con l'indirizzo IP del server VPN.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="12.34.56.78" accept'
Puoi anche inserire nella whitelist gli indirizzi IP degli altri tuoi server. Ad esempio, alcune persone potrebbero avere un altro server Web che deve inviare e-mail tramite il server di posta elettronica. Quindi aggiungilo anche alla whitelist.
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="IP-address-of-the-other-web-server" accept'
Ricarica firewalld per rendere effettive le modifiche.
sudo systemctl reload firewalld
Fase 2:chiudi la porta di invio, la porta IMAP e la porta POP3
- Porta di invio :587 e 465
- Porta IMAP :143 e 993
- Porta POP3 :110 e 995
Le porte 587 e 465 sono utilizzate da client di posta come Mozilla Thunderbird e Microsoft Outlook per inviare e-mail in uscita. Gli attori dannosi possono portare a termine un attacco di forza bruta alle porte 587 e 465.
Quello che segue è un esempio trovato nel mio registro di posta (/var/log/maillog
su CentOS/RHEL). Il malintenzionato stava tentando di accedere, ma ogni volta non è riuscito l'autenticazione SASL.
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
Non voglio vedere questo tipo di attività nel mio registro di posta, quindi chiudo semplicemente le porte 587, 465, 143, 993, 110 e 995 nel firewall. E poiché l'indirizzo IP del mio server VPN è nella whitelist, solo gli utenti che sono connessi al mio server VPN possono accedere a quelle porte.
Su CentOS/RHEL, esegui i due comandi seguenti per disabilitare imap
, imaps
, smtp-submission
, smtps
, pop3s
e pop3s
servizi.
sudo firewall-cmd --permanent --remove-service={smtp-submission,smtps,imap,imaps,pop3,pop3s} sudo firewall-cmd --permanent --remove-port={587/tcp,465/tcp,143/tcp,993/tcp,110/tcp,995/tcp}
Se vedi un avviso come Warning: NOT_ENABLED: smtps
, puoi ignorare l'avviso. Ricarica firewalld per rendere effettive le modifiche.
sudo systemctl reload firewalld
Ovviamente è necessario mantenere aperta la porta 25 per ricevere e-mail da altri server SMTP.
Fase 3:protezione del pannello di amministrazione e della webmail
Possiamo chiudere le porte 80 e 443 per proteggere il pannello di amministrazione e la webmail dall'hacking. Tuttavia, ciò vieterà l'accesso pubblico a tutti gli host virtuali. Alcune persone potrebbero avere host virtuali in Apache/Nginx che devono aprirsi a Internet. Invece di chiudere le porte 80 e 443 nel firewall, possiamo utilizzare la funzione di controllo degli accessi integrata in Apache/Nginx.
Nginx
Modifica il file dell'host virtuale per la webmail, ad esempio
sudo nano /etc/nginx/conf.d/mail.your-domain.com.conf
Aggiungi le seguenti righe nel server {...}
contesto. Ciò consentirà solo l'indirizzo IP 12.34.56.78
per accedere alla webmail e negare tutti gli altri indirizzi IP.
allow 12.34.56.78; deny all;
Se hai più server VPN, puoi aggiungere più indirizzi IP in questo modo:
allow 12.34.56.78; allow 12.34.56.79; deny all;
Salva e chiudi il file. Quindi testa le configurazioni di Nginx.
sudo nginx -t
Se il test ha esito positivo, ricarica Nginx per rendere effettive le modifiche.
sudo systemctl reload nginx
Gli utenti non nella whitelist vedranno un errore 403 vietato.
Apache
Modifica il file dell'host virtuale per la webmail in /etc/httpd/conf.d/
directory, come
sudo nano /etc/httpd/conf.d/mail.your-domain.com-le-ssl.conf
Aggiungi le seguenti righe tra <VirtualHost>...</VirtualHost>
tag. Ciò consentirà solo l'indirizzo IP 12.34.56.78
per accedere alla webmail e negare tutti gli altri indirizzi IP.
<LocationMatch "^/"> Require ip 12.34.56.78 </LocationMatch>
Se hai più server VPN, puoi aggiungere più indirizzi IP in questo modo:
<LocationMatch "^/"> Require ip 12.34.56.78 12.34.56.79 </LocationMatch>
Salva e chiudi il file. Quindi testa le configurazioni di Apache.
sudo apachectl -t
Se la sintassi è ok, ricarica Apache per rendere effettive le modifiche.
sudo systemctl reload httpd
Gli utenti non nella whitelist vedranno un errore 403 vietato.
Rinnovo del certificato TLS di Certbot
Se abiliti la whitelist nell'host virtuale Apache/Nginx, bloccherai anche i server Let's Encrypt per accedere al tuo server web, che è necessario per rinnovare il certificato Let's Encrypt TLS con la sfida HTTP-01. Per risolvere questo problema, possiamo disabilitare la whitelist prima del rinnovo del certificato e riattivarla dopo il rinnovo.
Crea uno script di shell in /root/
directory.
sudo nano /root/certbot-renewal.sh
Se usi Nginx, aggiungi le seguenti righe a questo file.
#! /bin/bash # disable whitelisting in the Nginx virtual host 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
Se usi Apache, aggiungi le seguenti righe a questo file.
#! /bin/bash # disable whitelisting in the Apache virtual host sed -i 's/Require ip/#Require ip/g' /etc/httpd/conf.d/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/httpd/conf.d/mail.your-domain.com-le-ssl.conf systemctl reload apache2
Salva e chiudi il file. Quindi aggiungi l'autorizzazione di esecuzione a questo file.
sudo chmod +x /root/certbot-renewal.sh
Modifica il file crontab dell'utente root.
sudo crontab -e
Aggiungi la riga seguente alla fine del file, in modo che lo script della shell venga eseguito una volta al giorno.
@daily bash /root/certbot-renewal.sh
Salva e chiudi il file.
Chiudere la porta SSH?
Poiché l'indirizzo IP del tuo server VPN è nella whitelist, puoi anche chiudere la porta SSH nel firewall. Tuttavia, ciò comporta un rischio. Se il tuo server VPN smette di funzionare, ti blocchi fuori. Per proteggere il servizio SSH dall'hacking, consiglio di configurare l'autenticazione a chiave pubblica o l'autenticazione a due fattori.
- 2 semplici passaggi per configurare l'autenticazione con chiave pubblica SSH su CentOS/RHEL
- Configurazione dell'autenticazione a due fattori (2FA) SSH sul server CentOS/RHEL