Linux / Debian Server absichern mit iptables und fail2ban
Solltet Ihr einen eigenen Linuxserver betreiben, so müsst Ihr diesen auch selbst absichern. Hierbei solltet Ihr einige Basics beachten, denn ansonsten ist Euer Server sehr schnell gehackt.
1. Standard oder automatisch vergebenes root Passwort ändern
passwd root
Ich empfehle Euch hierfür ein komplexes Passwort mit mind. 64 Zeichen oder einen SSH-Schlüssel statt einem Passwort.
2. Installiert alle Updates (regelmäßig!)
apt-get update
apt-get upgrade
Automatische Updates können auch genutzt werden, erfordern aber eine weitere Konfiguration. Ich gehe davon aus, dass Ihr auf Eurem Server regelmäßig arbeitet und daher manuell Updates installiert.
3. SSH-Port ändern
vi /etc/ssh/sshd_config
Ändert den SSH-Port und erschwert damit automatisierte Scans und Angriffe. Bitte benutzt dabei keinen Port der bereits belegt ist.
service sshd restart
Danach muss der Dienst neu gestartet werden.
4. Installiert nicht jede Software als root
Denn das würde eine Eskalation der Rechte bei Sicherheitslücken Eurer Anwendungen erleichtern.
5. Ihr braucht SSH nicht? Schaltet den Dienst einfach ab.
service ssh stop
Nachdem Ihr die Verbindung getrennt habt, ist ein Login nicht mehr möglich. Der Service bleibt bis zum nächsten Neustart abgeschaltet, der Stop ist also nicht permanent.
6. Aktiviert die Firewall
Viele Hoster bieten Euch eine vorgeschaltete Firewall, benutzt diese und blockiert unbenutzte offene Ports. Falls Ihr über eine feste IP-Adresse verfügt (z. B. über Euren VPN-Anbieter oder ISP), erlaubt den Zugriff auf administrative Ports (z. B. SSH) nur dieser festen IP. Das Gleiche gilt natürlich z. B. für Euren FTP/SMTP-Port – falls Ihr nur alleine Euren Server benutzt.
7. Firewall mit iptables
Ihr könnt auch Firewallregeln mit iptables auf dem Server bestimmen, das solltet Ihr in jedem Fall nicht vergessen zu erledigen. So manche Administrationssoftware (z. B. Plesk) kann Euch dabei komfortabel unter die Arme greifen.
apt-get install iptables
apt-get install screen
Die Regeln könnten beispielhaft so aussehen (Webserver und FTP erlaubt, SSH beschränkt auf 1.1.1.1):
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -N f2b-apache
iptables -N f2b-modsecurity
iptables -N f2b-recidive
iptables -N f2b-BadBots
iptables -A INPUT -p tcp -m multiport --dports 80,443,7080,7081 -j f2b-BadBots
iptables -A INPUT -p tcp -j f2b-recidive
iptables -A INPUT -p tcp -m multiport --dports 80,443,7080,7081 -j f2b-modsecurity
iptables -A INPUT -p tcp -m multiport --dports 80,443,7080,7081 -j f2b-apache
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 68 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 49152:65535 -j ACCEPT
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 8447 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8447 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 8443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8443 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 8880 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8880 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 587 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 587 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 465 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 110 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 995 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 995 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 143 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 993 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 106 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 106 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 5432 -j DROP
iptables -A INPUT -p udp -m udp --dport 137 -j DROP
iptables -A INPUT -p udp -m udp --dport 138 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 139 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 445 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 53 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type 8/0 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -i lo -o lo -j ACCEPT
iptables -A FORWARD -j DROP
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -j ACCEPT
iptables -A f2b-apache -j RETURN
iptables -A f2b-modsecurity -j RETURN
iptables -A f2b-recidive -j RETURN
iptables -A f2b-BadBots -j RETURN
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -j ACCEPT
Alternativ kann natürlich auch der Zugriff auf FTP beschränkt werden (1.1.1.2):
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -N f2b-apache
iptables -N f2b-modsecurity
iptables -N f2b-recidive
iptables -N f2b-BadBots
iptables -A INPUT -p tcp -m multiport --dports 80,443,7080,7081 -j f2b-BadBots
iptables -A INPUT -p tcp -j f2b-recidive
iptables -A INPUT -p tcp -m multiport --dports 80,443,7080,7081 -j f2b-modsecurity
iptables -A INPUT -p tcp -m multiport --dports 80,443,7080,7081 -j f2b-apache
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 68 -j DROP
iptables -A INPUT -s 1.1.1.2/32 -p tcp -m tcp --dport 49152:65535 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 49152:65535 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 8447 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8447 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 8443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8443 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 8880 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 8880 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -s 1.1.1.2/32 -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 587 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 587 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 465 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 465 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 110 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 995 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 995 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 143 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 143 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 993 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 993 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 106 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 106 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 5432 -j DROP
iptables -A INPUT -p udp -m udp --dport 137 -j DROP
iptables -A INPUT -p udp -m udp --dport 138 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 139 -j DROP
iptables -A INPUT -p tcp -m tcp --dport 445 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 53 -j DROP
iptables -A INPUT -s 1.1.1.1/32 -p tcp -m tcp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type 8/0 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -i lo -o lo -j ACCEPT
iptables -A FORWARD -j DROP
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -j ACCEPT
iptables -A f2b-apache -j RETURN
iptables -A f2b-modsecurity -j RETURN
iptables -A f2b-recidive -j RETURN
iptables -A f2b-BadBots -j RETURN
Auch könnte es hilfreich sein die Regeln als Shellskript abzuspeichern und danach mit screen auszuführen:
screen -mdS firewall ./iptables.sh
Um die Regeln auch später noch (nach einem Neustart) laden zu können benötigen wir ein zusätzliches Paket welches wir mit
apt-get install iptables-persistent
installieren. Die Regeln können später mit dem nachfolgenden Befehl gespeichert werden:
iptables-save > /etc/iptables/rules.v4
8. Fail2Ban installieren und einrichten
Auch Fail2Ban kann sehr hilfreich sein um BruteForce-Angriffe abzuwehren bzw. zu erschweren.
apt-get install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Anschließend mit
nano /etc/fail2ban/jail.local
die entsprechenden Werte anpassen, darunter z. B. das Aktivieren einzelner Jails mit
enabled = true
und mit
systemctl restart fail2ban.service
Fail2Ban neu starten.
Die Logs finden sich später z. B. unter
nano /var/log/fail2ban.log # Allgemeines Fail2Ban Log
nano /var/log/auth.log # SSHD-Log
nano /var/log/proftpd/proftpd.log #FTP Log
9. FTP-Server Passive Ports
Solltet Ihr einen öffentlich erreichbaren FTP-Server betreiben empfehle ich Euch die passiven Ports entsprechend zu ändern (zum ProFTPd-Server Artikel).
Mit diesen einfachen Maßnahmen habt Ihr die Sicherheit Eures Server bereits auf ein normales Niveau gebracht. Es gibt aber je nach Verwendungszweck des Servers noch einiges mehr zu beachten. Informiert oder wendet Euch vertrauensvoll an mich.
IT-Sicherheit soll für Privatpersonen, kleine Unternehmen und Mittelständler erschwinglich sein. Daher kalkuliere ich meine Stundensätze immer individuell nach Schwierigkeitsgrad und tatsächlichem Aufwand.