Server absichern

So, heute wollen wir uns mal mit dem Thema Sicherheit befassen! Wie ich bereits hier beschrieben habe, gab es in den letzten Tagen vermehrt Angriffe auf meinen Server.

In diesem Tutorial möchte ich euch zeigen, wie man am besten vorgeht, wenn der eigene Server unter Beschuss steht, bzw. wie man einer möglichen Attacke evtl. sogar vorbeugen kann. Im speziellen gehe ich dabei auf CentOS ein. Der Vorgang sollte sich aber nicht groß von dem anderer Linux Distributionen unterscheiden.

Wie verhält man sich bei einem Angriff?

Zunächst einmal gilt hier das gleiche, wie bei einem gelungenen Hack eurer Worpress Installation. Erst einmal Ruhe bewahren!

Linux kommt von Haus aus eigentlich mit einer perfekten Firewall daher, warum nutzen wir diese nicht direkt, um unsere Angreifer fürs erste auszusperren? Ich spreche hier von iptables. Nachdem wir beispielsweise in der /var/log/secure ausfindig gemacht haben, woher unsere Angreifer kommen, können wir diese ganz einfach blockieren. Dafür tragen wir einfach die passenden IPs in unsere Blocklist ein. Dadurch werden zukünftige Anfragen von diesen IPs komplett blockiert. Sowohl Loginversuche, als auch Seitenaufrufe eurer Homepage.

Dazu loggen wir uns per ssh auf unserem Server ein und blockieren die jeweiligen IPs von Hand:

# iptables -A INPUT -s 1.2.3.4 -j DROP

Natürlich können wir damit nicht nur einzelne IPs sperren, sondern auch ganze IP Bereiche. Das macht z.B. dann Sinn, wenn der Angreifer auf ein Botnetz setzt, welches über viele einzelne Rechner in einem Netzwerk verfügt, die natürlich über fortlaufende IPs verfügen.

# iptables -A INPUT -s 1.2.3.0/24 -j DROP

Theoretisch können wir auch mit Hilfe von iptables nur einzelne Ports für Angreifer von Außen sperren. Das ganze funktioniert mit diesem Befehl:

# iptables -A INPUT -p tcp --dport 22(falls ihr den Standard ssh Port benutzt) -j DROP

Zusätzlich empfiehlt es sich auch, wie bei einem Hack eurer WordPress Installation, sämtliche Passwörter einmal zu ändern. – Wobei das kein Muss ist, es hat ja bis jetzt zumindest kein Angriff erfolgreich stattgefunden.

Das sollte dem Angreifer zumindest erst einmal den Wind aus den Segeln nehmen!

Wie kann man einem Angriff vorbeugen?

Standardmäßig wird für eine SSH Verbindung zum Server der Port 22 benutzt. Das macht das Einrichten von externen Programmen wie Putty, oder anderen Anwendungen zwar einfacher und ihr müsst euch nicht wirklich den Port merken, wenn ihr mal per SSH auf eure Maschine zugreifen wollt, nur leider wissen das eben auch potentielle Angreifer. Somit gehört die Änderung des SSH Ports für mich persönlich auf jeden Fall zu den ersten Sicherungsmaßnahmen.

Standard Port ändern

Diese Aufgabe ist eigentlich in wenigen Minuten erledigt, aber bietet dafür direkt einiges an Schutz. Unter CentOS findet ihr das passende Config File hier: /etc/ssh/sshd_config. Dort ändert ihr nun einfach den Port. Sinnvoll ist eine relativ hohe Portnummer zu wählen, die nicht gerade von anderen Anwendungen benutzt wird. Bevor ihr den Dienst nun neu startet, solltet ihr die Firewall aktualisieren, bevor ihr euch am Ende selbst aussperrt. Dazu einfach den neuen Port in iptables eintragen, die Änderung speichern und den Dienst neustarten.

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport [NEUER PORT] -j ACCEPT
# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

Überprüfen, ob der neue Port übernommen wurde könnt ihr mit Hilfe von:

# netstat -tulpn | grep sshd

Wenn alles ohne Probleme funktioniert hat, könnt ihr iptables und sshd nun neustarten.

# service iptables stop
# service iptables start
# service sshd reload

Vergesst nur nicht, wenn ihr euch von nun an per SSH auf eurer Kiste einloggen wollt, müsst ihr natürlich den neuen Port benutzten.

Fail2Ban

Kommen wir nun zur Firewall zurück. Auch bei der Absicherung können wir uns auf unsere interne Firewall verlassen. Statt jetzt aber jede einzelne IP, bzw. IP Range von Hand zu blockieren, können wir diese Aufgabe Fail2Ban überlassen. Dabei handelt es sich um ein in Python geschriebenes Framework zur Vorbeugung gegen Einbrüche. Fail2Ban registriert also fehlgeschlagene Loginversuche und blockiert daraufhin die jeweilige IP Adresse.

Die Installation lässt sich unter CentOS unkompliziert mit Hilfe von yum durchführen. Alternativ kann natürlich unter z.B. Debian apt-get verwendet werden.

# yum install fail2ban

Damit sollte eigentlich schon alles erledigt sein. Wobei wir noch ein wenig die Config an unsere Bedürfnisse anpassen müssen. Dafür nutzen wir nicht die  /etc/fail2ban/jail.conf, sondern erstellen uns stattdessen /etc/fail2ban/jail.local. 

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Dort könnt ihr nun unter bantime die Dauer des Bans eingeben, ich verwende hier meist 86400 Sekunden, also 24h , bzw. unter findtime die Zeit, in der die falschen Logins durchgeführt werden müssen, um in einem Ban zu resultieren.  Für den SSH Login sieht das Ganze in  meinem Fall in etwa so aus:

[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=[EUER PORT], protocol=tcp]
sendmail-whois[name=SSH, dest=[EURE MAILADRESSE], sender=fail2ban@geekmonkey.de, sendername="Fail2Ban"]
logpath = /var/log/secure
maxretry = 3

Achtet auf jeden Fall darauf, dass ihr euren SSH Port hier eintragt. Die email ist nicht zwingend notwendig, aber ich finde es ganz praktisch, bei einem Angriffsversuch eine Nachricht zu bekommen. Nützlich ist auch, dass die mails zusätzliche whois Abfragen der jeweiligen IP beinhaltet, ihr seht also direkt, aus welchem Land euer Angreifer kommt.

Praktischerweise gibt es für die Faulen unter euch, auch eine Möglichkeit Fail2Ban unter Plesk zu administrieren. Dafür einfach nach erfolgreicher Installation von Fail2Ban das passende Paket unter Plesk installieren und aktivieren. Hier könnt ihr bequem Einstellungen ändern, oder euch einen Überblick über derzeit gebannte IPs verschaffen.

tuxpoDas wären erst einmal zwei der, meiner Meinung nach, effektivsten Möglichkeiten, euren Server gegen Angriffe von Außerhalb zu schützen.

Hierbei hält sich der Arbeitsaufwand in Grenzen und an der täglichen Nutzung ändert sich auch nichts. Für den 0815 Server sollten diese beiden Methoden eigentlich ausreichen. Wer aber noch einen Schritt weiter gehen will, der kann sich auch noch den letzten Abschnitt dieses Tutorials durchlesen.

Port Knocking – Anklopfen

Beim Port Knocking ist der Zugang via SSH grundlegend gesperrt. Erst wenn bei verschieden Ports in der richtigen Reihenfolge „angeklopft“ wird, öffnet sich der Zugang zum SSH Port und wir können uns wie gewohnt einloggen.

Zunächst einmal müssen wir den Knock Server installieren:

# yum install libpcap*
# wget //li.nux.ro/download/nux/misc/el6/i386/knock-server-0.5-7.el6.nux.i686.rpm
# rpm -ivh knock-server-0.5-7.el6.nux.i686.rpm

Bevor wir unseren Knock Server anschließend konfigurieren, müssen wir die firewall ein wenig anpassen. Wir weisen quasi alle Zugriffe per SSH erst einmal ab.

# iptables -A INPUT -p tcp --dport [EUER SSH PORT] -j DROP
# service iptables save

WARNUNG: Diesen Befehl erst zu einem späteren Zeitpunkt benutzten, wenn ihr jetzt gerade per SSH auf der Kiste seid, … sonst fliegt ihr und es gibt erst einmal so schnell keinen Weg zurück.

Als nächstes passen wir die /etc/knockd.conf an.

[options]
        logfile = /var/log/knockd.log

[openSSH]
        sequence = 5040,6010,6500
        seq_timeout = 30
        tcpflags = syn
        Start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

[closeSSH]
        sequence = 4040,5050,8080
        seq_timeout = 30
        command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport [EUER PORT] -j ACCEPT
        tcpflags = syn

Zu guter Letzt können wir nun den Dienst starten:

# service knockd  start

Aber wie genau funktioniert das Ganze jetzt? Wie können wir uns per SSH auf unserem Server einloggen?

Ganz einfach! Unser SSH Port öffnet sich nur, wenn wir bei den vorher festgelegten Ports kurz anklopfen. Natürlich muss hierbei auch die Reihenfolge stimmen, denn erst dann wird unsere Anfrage zum SSH Port durchgelassen.

Anklopfen könnt ihr mit z.B. Telnet oder Nmap. Ein Anklopfen mit Putty ist derzeit leider nicht möglich.

Zum Öffnen des SSH Ports

# nmap -p 5040 SERVER-IP
# nmap -p 6010 SERVER-IP
# nmap –p 6500 SERVER-IP

Zum Schließen des SSH Ports

# nmap -p 4040 SERVER-IP
# nmap -p 5050 SERVER-IP
# nmap -p 8080 SERVER-IP

Das ganze sieht in euer /var/log/knockd.log dann in etwa so aus:

[2015-03-13 15:31] 91.21.*.*: openSSH: Stage 1
[2015-03-13 15:32] 91.21.*.*: openSSH: Stage 2
[2015-03-13 15:32] 91.21.*.*: openSSH: Stage 3
[2015-03-13 15:32] 91.21.*.*: openSSH: OPEN SESAME
[2015-03-13 15:32] openSSH: running command: /sbin/iptables -I INPUT -s 91.21.*.* -p t

Ja, es erinnert echt ein wenig an Ali Baba und die 40 Räuber:

Sesam öffne dich!

Die letzte Möglichkeit zählt sicherlich zu den Sichersten, ist vom Arbeitsaufwand auch nicht wesentlich intensiver als z.B. Fail2Ban. Schränkt Einen doch aber in der alltäglichen Nutzung ein wenig ein, gerade wenn man von unterwegs auf seinen Server zugreifen möchte. Aber die Entscheidung bleibt natürlich jedem selbst überlassen.

2 Kommentare

  1. Hallo Veit super Beitrag den werde ich mal auf meinen Script verseuchten Server aus probieren! Keine Sorge die Scripte hab ich schon entfernt! Waren so pauschal mal 15 domains die ich platt gemacht habe! Dein Blog werde ich im Auge behalten
    Liebe Grüße Mathias

    • Danke für die Blumen! Die Probleme kennt wohl jeder Blogger, der ein bisschen aktiver ist. Irgend welche Script Kiddies von Gott weiß woher haben es immer auf einen abgesehen – haha.

Kommentieren Sie den Artikel

Please enter your comment!
Please enter your name here