In diesem Tutorial teile ich meine Tipps und Tricks mit Ihnen, um E-Mail-Server vor Hacking zu schützen mit einem selbst gehosteten VPN-Server. Viele Spammer versuchen, sich in die E-Mail-Server anderer Leute zu hacken. Im Erfolgsfall würden sie den gehackten E-Mail-Server verwenden, um große Mengen an Spam zu versenden oder wertvolle Daten zu stehlen. Warum verwenden wir einen selbst gehosteten VPN-Server? Weil Sie Whitelisting aktivieren können, sodass nur vertrauenswürdige Benutzer, die mit dem VPN-Server verbunden sind, auf Ihren Mailserver zugreifen können.
Voraussetzungen
Es wird davon ausgegangen, dass Sie einen E-Mail-Server haben in Betrieb. Wenn nicht, folgen Sie einem der folgenden Tutorials, um Ihren eigenen Mailserver einzurichten.
- Einfach einen vollwertigen Mailserver auf Ubuntu 20.04 mit iRedMail einrichten
- Einfach einen Mailserver auf Debian 10 Buster mit iRedMail einrichten
Außerdem wird davon ausgegangen, dass Sie einen VPN-Server eingerichtet haben . Wenn nicht, folgen Sie bitte einem der folgenden Tutorials. Der Mailserver und der VPN-Server können auf separaten Hosts oder auf demselben Host laufen.
- Richten Sie Ihren eigenen WireGuard VPN-Server auf Ubuntu ein
- Richten Sie Ihren eigenen WireGuard VPN-Server auf Debian ein
Hinweis :Es wird empfohlen, VPN-Server und Mailserver auf separaten Hosts auszuführen, um die Komplexität des Betriebs zu reduzieren . Wenn der Mailserver und der VPN-Server auf demselben Host ausgeführt werden, sind zusätzliche Schritte erforderlich, nämlich das Einrichten einer Reaktionsrichtlinienzone auf dem VPN-Server, um den DNS-A-Eintrag Ihres Mailserver-Hostnamens außer Kraft zu setzen.
- Response Policy Zone (RPZ) im BIND-Resolver auf Debian/Ubuntu einrichten
Nehmen wir an, der DNS-A-Eintrag für mail.yourdomain.com
wird zu 12.34.56.78
aufgelöst , dann müssen Sie einen Eintrag in der Antwortrichtlinienzone erstellen, um ihn in die private IP-Adresse 10.10.10.1
des VPN-Servers aufzulösen .
In den folgenden Texten verwende ich 12.34.56.78
als öffentliche IP-Adresse des VPN-Servers. Wenn der VPN-Server und der Mailserver auf demselben Host laufen, müssen Sie 12.34.56.78
ersetzen mit der privaten IP-Adresse des VPN-Servers 10.10.10.1
.
Schritt 1:VPN-Server-IP-Adresse zur Firewall-Whitelist hinzufügen
Sobald Sie einen Mailserver und einen VPN-Server eingerichtet haben, sollten Sie die IP-Adresse des VPN-Servers zur Whitelist der Mailserver-Firewall hinzufügen. Wenn Sie eine UFW-Firewall verwenden (Debian/Ubuntu), führen Sie den folgenden Befehl auf dem Mailserver aus. Ersetzen Sie 12.34.56.78 durch die IP-Adresse des VPN-Servers.
sudo ufw insert 1 allow in from 12.34.56.78
Sie können auch die IP-Adressen Ihrer anderen Server auf die Whitelist setzen. Beispielsweise haben einige Leute möglicherweise einen anderen Webserver, der E-Mails über den E-Mail-Server senden muss. Dann fügen Sie es auch zur Whitelist hinzu.
sudo ufw insert 1 allow in from IP-address-of-the-other-web-server
Schritt 2:Übermittlungsport, IMAP-Port und POP3-Port schließen
- Übermittlungsport :587 und 465
- IMAP-Port :143 und 993
- POP3-Port :110 und 995
Port 587 und 465 werden von E-Mail-Clients wie Mozilla Thunderbird und Microsoft Outlook verwendet, um ausgehende E-Mails zu übermitteln. Hacker können Brute-Force-Angriffe auf Port 587 und 465 ausführen.
Das Folgende ist ein Beispiel aus meinem Mail-Log (/var/log/mail.log
auf Debian/Ubuntu, /var/log/maillog
auf CentOS/RHEL). Der Angreifer hat versucht, sich anzumelden, aber die SASL-Authentifizierung ist jedes Mal fehlgeschlagen.
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
Ich möchte diese Art von Aktivität nicht in meinem Mail-Log sehen, also schließe ich einfach die Ports 587, 465, 143, 993, 110 und 995 in der Firewall. Und da die IP-Adresse meines VPN-Servers auf der weißen Liste steht, können nur Benutzer, die mit meinem VPN-Server verbunden sind, auf diese Ports zugreifen.
Um diese Ports in der UFW-Firewall zu schließen, listen Sie zuerst Ihre Firewall-Regeln auf.
sudo ufw status numbered
Beispielausgabe
Wie Sie sehen können, gibt es sowohl IPv4- als auch IPv6-Regeln. Um Port 587 zu schließen, muss ich die Regel #16
löschen und #6
. (Sie sollten zuerst die Regel mit einer höheren Indexnummer löschen.)
sudo ufw delete 16 sudo ufw delete 6
Dann sollten Sie sudo ufw status numbered
ausführen Befehl erneut, um eine neue Liste der Firewall-Regeln zu erhalten. Beachten Sie, dass sich die Indexnummer für einige Regeln geändert hat.
Dieses Mal möchte ich Port 465 schließen, also muss ich die Regel #15
löschen und #6
.
sudo ufw delete 15 sudo ufw delete 6
Verwenden Sie dann die gleiche Methode, um die Ports 143, 993, 110 und 995 zu schließen. Natürlich müssen Sie Port 25 offen halten, um E-Mails von anderen SMTP-Servern zu empfangen.
Schritt 3:Admin-Panel und Webmail schützen
Wir können Port 80 und 443 schließen, um das Admin-Panel und Webmail vor Hackern zu schützen. Dies verbietet jedoch den öffentlichen Zugriff auf alle virtuellen Hosts. Einige Leute haben möglicherweise virtuelle Hosts in Apache/Nginx, die sich für das Internet öffnen müssen. Anstatt Port 80 und 443 in der Firewall zu schließen, können wir die eingebaute Zugriffskontrollfunktion in Apache/Nginx verwenden.
Nginx
Bearbeiten Sie die virtuelle Hostdatei für Webmail, z. B.
sudo nano /etc/nginx/conf.d/mail.your-domain.com.conf
Fügen Sie dem SSL-Serverblock die folgenden Zeilen hinzu. Dadurch wird nur die IP-Adresse 12.34.56.78
zugelassen auf das Webmail zugreifen und alle anderen IP-Adressen verweigern.
allow 12.34.56.78; deny all;
Wenn Sie mehrere VPN-Server haben, können Sie wie folgt mehrere IP-Adressen hinzufügen:
allow 12.34.56.78; allow 12.34.56.79; deny all;
Speichern und schließen Sie die Datei. Testen Sie dann die Nginx-Konfigurationen.
sudo nginx -t
Wenn der Test erfolgreich ist, laden Sie Nginx neu, damit die Änderungen wirksam werden.
sudo systemctl reload nginx
Benutzern, die nicht auf der Whitelist stehen, wird ein 403-Fehler angezeigt.
Apache
Bearbeiten Sie die virtuelle Hostdatei für Webmail, z. B.
sudo nano /etc/apache2/sites-enabled/mail.your-domain.com-le-ssl.conf
Fügen Sie die folgenden Zeilen zwischen <VirtualHost>...</VirtualHost>
hinzu Stichworte. Dadurch wird nur die IP-Adresse 12.34.56.78
zugelassen auf das Webmail zugreifen und alle anderen IP-Adressen verweigern.
<LocationMatch "^/"> Require ip 12.34.56.78 </LocationMatch>
Wenn Sie mehrere VPN-Server haben, können Sie wie folgt mehrere IP-Adressen hinzufügen:
<LocationMatch "^/"> Require ip 12.34.56.78 12.34.56.79 </LocationMatch>
Speichern und schließen Sie die Datei. Testen Sie dann die Apache-Konfigurationen.
sudo apache2ctl -t
Wenn die Syntax in Ordnung ist, laden Sie Apache neu, damit die Änderungen wirksam werden.
sudo systemctl reload apache2
Benutzern, die nicht auf der Whitelist stehen, wird ein 403-Fehler angezeigt.
Certbot TLS-Zertifikatserneuerung
Wenn Sie Whitelisting im virtuellen Apache/Nginx-Host aktivieren, blockieren Sie auch Let’s Encrypt-Server für den Zugriff auf Ihren Webserver, was für die Erneuerung des Let’s Encrypt-TLS-Zertifikats mit HTTP-01-Challenge erforderlich ist. Um dieses Problem zu lösen, können wir die Whitelist vor der Zertifikatserneuerung deaktivieren und nach der Erneuerung wieder aktivieren.
Erstellen Sie ein Shell-Skript im Verzeichnis /root/
Verzeichnis.
sudo nano /root/certbot-renewal.sh
Wenn Sie Nginx verwenden, fügen Sie dieser Datei die folgenden Zeilen hinzu.
#! /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
Wenn Sie Apache verwenden, fügen Sie dieser Datei die folgenden Zeilen hinzu.
#! /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
Speichern und schließen Sie die Datei. Fügen Sie dieser Datei dann die Ausführungsberechtigung hinzu.
sudo chmod +x /root/certbot-renewal.sh
Bearbeiten Sie dann die Crontab-Datei des Root-Benutzers.
sudo crontab -e
Fügen Sie die folgende Zeile am Ende der Datei hinzu, damit das Shell-Skript einmal am Tag ausgeführt wird.
@daily bash /root/certbot-renewal.sh
Speichern und schließen Sie die Datei.
SSH-Port schließen?
Da die IP-Adresse Ihres VPN-Servers auf der Whitelist steht, können Sie den SSH-Port auch in der Firewall schließen. Dies birgt jedoch ein Risiko. Wenn Ihr VPN-Server nicht mehr funktioniert, würden Sie sich selbst aussperren. Um den SSH-Dienst vor Hackern zu schützen, empfehle ich die Einrichtung einer Authentifizierung mit öffentlichem Schlüssel oder einer Zwei-Faktor-Authentifizierung.
- Zwei einfache Schritte zum Einrichten einer passwortlosen SSH-Anmeldung auf Ubuntu
- Richten Sie die SSH-Zwei-Faktor-Authentifizierung (2FA) auf dem Ubuntu-Server ein