Dies ist quasi das erste Tutorial aus der Reihe: Der perfekte Server. Ich habe längere Zeit überlegt, womit genau ich anfangen soll und mich dann schließlich für dieses Thema entschieden, einfach weil es wohl eines der wichtigsten überhaupt ist. In einem etwas kürzerem Tutorial hatte ich bereits einige Grundlagen dazu erläutert.

Man sollte nämlich nie vergessen, dass ihr für euren Server bzw. vServer und den evtl. davon ausgehenden Schaden selbst verantwortlich seid. Darauf weisen die wenigsten Hoster einen natürlich hin, im Ernstfall kann das aber nicht nur ganz schön teuer werden, sondern auch ernste Konsequenzen nach sich ziehen. Von einfachen Spam- und Phishing-Mails, über DDos Attacken bis hin zum Umschlagpunkt für Kinderpornografie, so ein Server lässt sich mit genügend krimineller Energie zu so einigem missbrauchen.

Wem der Arbeitsaufwand hierbei zu hoch ist, aber dennoch anstelle eines einfachen Webhosting Pakets einen eigenen Server betreiben möchte, dem empfehle ich hierbei ein paar Euro mehr in die Hand zu nehmen und sich einen „managed“ Server zu mieten. Absicherung, Verwaltung und Wartung werden hier in Absprache mit dem Kunden direkt vom Hoster übernommen. Ich denke es ist überflüssig zu erwähnen, dass das Ganze nicht gerade kostengünstig ist.

Meine persönliche Meinung dazu? Das Managen eines Servers ist sicherlich kein Hexenwerk, wer sich hier ein bisschen mit dem Thema vertraut macht und einige Regel befolgt, der kann sich das Geld getrost sparen.

Wenn ihr den Server innerhalb weniger Stunden vollständig einrichtet könnt ihr die Absicherung auch gerne erst als letzten Schritt durchführen – erfahrungsgemäß kann ich aber sagen, dass die Meisten sich dann doch ein bisschen mehr Zeit zum Einrichten nehmen. Also worauf warten? Sicher ist sicher.

SSH Port ändern

Gemessen am Arbeitsaufwand ist die Änderung des Standard SSH Ports wohl am einfachsten und effektivsten. Denn die meisten Angreifer zielen direkt auf den Port 22 ab. Wenn ich z.B. bei DigitalOcean ein neues Droplet starte dauert es keine 10 Minuten und ich habe die ersten Zugriffsversuche und Bruteforce Attacke aus Ländern wie China, die alle auf diesen Port abzielen.

Hierzu ändern wir einfach in der /etc/ssh/sshd_config den Standard Port von 22 auf einen anderen Port unserer Wahl. Achtet aber bei eurer Auswahl darauf, dass ihr nicht gerade einen Port belegt, der anderweitig benötigt wird. Der Standardport für HTTP wäre z.B. Port 80. Das wissen natürlich auch die Browser, weswegen die Kommunikation hier ohne Probleme verläuft. Änderungen würden also dafür führen, dass eure gehosteten Webseiten nicht mehr erreichbar wären.

Die ganz Schreibfaulen könnten das Ganze auch bequem in einem einzigen Befehl verpacken:

Hier mal eine kurze Überblick über die Ports:

  1. Ports 0 – 1023: Well known Ports – die meisten bekanntesten Dienste laufen hier
  2. Ports 1024 – 49151: Registered Ports – einige Ports sind für bekannte Dienste reserviert, andere sind unbelegt
  3. Ports 49152 – 65535: Private / Dynamic Ports – können in der Regel ohne Probleme genutzt werden

Im Zweifelsfall, einfach mal den gewünschten Port googlen.

Zu guter Letzt müssen wir den SSh Dienst natürlich einmal neustarten. Danach können wir uns über unseren neuen Port via SSH einloggen.

So, das wärs schon. Der erste Schritt zum Sicheren Server!

Benachrichtigung bei SSH Login

Darüber lässt sich jetzt sicher diskutieren, ob das Ganze sinnvoll, oder vielleicht nur Spam ist. Fakt ist aber, dass es sicherlich nicht schaden kann, wenn ihr eine kure Nachricht bekommt, sobald sich jemand via SSH auf eurem Server einloggt. Weniger geeignet wäre so eine Benachrichtigung, wenn ihr regelmäßig via SSH auf den Server zugreift, quasi um Daten abzurufen oder Veränderungen vorzunehmen. In meinem Fall logge ich mich aber wenn es hoch kommt zwei Mal die Woche auf dem Server ein und das auch meist nur, um Updates zu installieren.

Hierfür erstellen wir einfach ein kurzes und simples Shell Skript /opt/shell-login.sh:

Anschließend vergeben wir die passenden Rechte und

Jetzt sollte eigentlich sobald sich ein user via SSH auf eurem Server einloggt eine kurze Nachricht an die hinterlegte email geschickt werden. Je nach Server Grundkonfiguration müssen wir hier noch sendmail konfigurieren. Dazu aber an anderer Stelle mehr.

Fail2ban

Fail2ban gehört auf jeden Fall zu meinen Favoriten, wenn es um das Absichern von Server geht. fail2ban arbeit sowohl simple, als auch effektiv. Es ermittelt mit Hilfe der Daten aus den Logfiles, ob und wie oft sich eine IP Adresse versucht hat einzuloggen. Hierbei ist die Überwachung nicht nur auf den SSh Zugang beschränkt, sondern es lassen sich auch ohne Probleme alle anderen Logins überwachen, z.B. für FTP Accounts, nginx Logins, etc..

Ihr könnt mit Hilfe der Config selbst festlegen, welche Logins überwacht werden sollen, bzw. wie bei zweifelhaften Aktionen verfahren werden soll, sprich wie lange eine IP Adresse gebannt werden soll und ab wie vielen missglückten Einloggversuchen.

Installieren können wir fail2ban bequem per apt.

Im Ordner /etc/fail2ban/ findet ihr anschließend die Konfigurationsdatei. Wobei es zu empfehlen ist eine Kopie namens jail.local zu erstellen, da die original Datei bei jedem Update überschrieben wird.

In der jail.local zu können wir nun all unsere Anpassungen vornehmen. Um den Rahmen dieses Tutorials nicht ganz zu sprengen möchte ich das Ganze nur kurz am Beispiel des SSH Logins zeigen:

In meinem Beispiel wird also nach 4 fehlgeschlagenen SSH Logins die IP für 86.400 Sekunden gebannt, das entspricht genau einem Tag. Zusätzlich werde ich per email über den Ban benachrichtigt. Netterweise gibt es noch einige zusätzlich Infos, so dass man gleich sieht, woher der Angriff kommt. Nicht unbedingt nötig – aber in jedem Fall „nice to have“.

Mein potentieller Angreifer stammt also aus China, zumindest wird ein Rechner/Server von dort benutzt. Soll mich aber nicht weiter stören, fail2ban übernimmt den Rest!

Port Knocking

Port Knocking ist auf jeden Fall noch eine super Sache, um seinen Server gegen Unbefugte abzusichern. Man kann sich das Ganze in etwa wie ein Klopfzeichen vorstellen. In den guten alten Gangsterfilmen hatten diese meistens ja auch eine Art Klopfzeichen. Zwei Mal kurz, ein Mal lang, erst dann wurde einem die Tür geöffnet. So in etwa funktioniert das beim Port Knocking auch. Der eigentliche SSH Port ist geschlossen, weswegen man ihn auch nicht als Angriffsziel nutzen kann. Erst wenn an eine bestimmte Anzahl anderer Ports in einer bestimmten Reihenfolge angeklopft wird, wird der eigentliche SSH Port geöffnet.

Da ich das Port Knocking aber gerade im Alltag eher unpraktisch finde, möchte ich an dieser Stelle nicht weiter darauf eingehen. Eine Kurze Anleitung hatte ich mal an dieser Stelle geschrieben. Man muss halt immer auch ein wenig zwischen Sicherheit und Komfort abwägen.

Systemupdates checken

Ähnlich wie an eurem heimischen Computer oder Notebook, wird auch die Software auf eurem Server ständig geupdatet. Neben Stabilität geht es dort natürlich auch um Sicherheitsupdates. Automatische Updates können hier aber mit unter heikel sein, da man gerade bei Problemen kaum eine Chance hat nach zu verfolgen, wo der Fehler liegt.

Sich jetzt aber täglich auf dem Sever einloggen, nur um zu gucken, ob es ein neues Update gibt wäre sicherlich ein wenig übertrieben. Aber das ist dank apticron auch gar nicht nötig. Apticron informiert euch per mail, sobald ein neues Update verfügbar ist. Ihr könnt euch dann bequem per SSH einloggen und euren Server manuell updaten.

Anschließend müssen wir nur noch in der /etc/apticron/apticron.conf unsere Informationen eintragen:

Die emails die apticron verschickt sehen dann in etwa so aus:

Rootkits aufspüren

Sollte es dennoch, trotz unseren Schutzmaßnahmen mal einem Angreifer gelingen in euer System einzudringen, ist es meist schwer nachzuvollziehen, wo genau der Einbruch stattgefunden hat, bzw. welche Spuren er hinterlassen hat. Das Tool Rootkit Hunter unterstützt uns hierbei und scannt unser System nach bekannten Rootkits, verdächtigen Strings, etc.

Anschließend fügen wir noch unsere email in die Konfigurationsdatei /etc/rkhunter.conf ein, so kann rkhunter uns bei Problemen via mail benachrichtigen.

Nun indexieren wir erst einmal all unsere Files. Dies sollte eigentlich zu Beginn bei einem frisch aufgesetzten System geschehen. Anschließend updaten wir die Datenbank.

Mit Hilfe eines Cronjobs überprüft rkhunter regelmäßig unser System:

Wir können uns nun also zurücklehnen und rkhunter behält für uns alles im Auge.

Es gibt sicherlich noch eine Vielzahl von Möglichkeiten euren Server abzusichern. In meinen Augen sind dies hier aber die effektivsten.

6 Kommentare

  1. vielen dank dafür. was ist mit ssh login via schlüsseln? hast du das extra nicht erwähnt oder gehst du davpn aus das dies eh gemacht werden sollte?

    • Auf die Option gehe ich absichtlich nicht ein, da es mir unpraktisch erscheint, wenn man von unterwegs auf seinen Server zugreifen will, beispielsweise vom Smartphone, oder dem Notebook, etc, … Man müsste imme rund überlal die Keyfiles mit sich rum schleppen, .. wenn die mal verloren gehen ist das Geschrei dann groß, denn die wenigsten können wohl einfach nen Keyboard am Server anschließen.

  2. Läuft ganz gut durch deine Auflistung.

    Nur irgendwo musste ja der Wurm drin sein! cronjob will nich…

    Hab alles genau nach deiner Auflistung gemacht (ausser das ich SSH über Keys geregelt hab) und dann meckert cronjob rum
    /usr/bin/rkhunter: 1: eval: Syntax error: end of file unexpected

    Jetzt bin ich verwirrt…

    habs mal versucht zu ergoogeln (muss aber ehrlich zugeben nicht sehr erfolgreich)

    • Hm, rkhunter scheint sich eher zu beschweren, sehe gerade nicht, wo der Zusammenhang zu cronjob ist? Ferndiagnosen sin da ähnlich wie bei Krankheiten nicht wirklich möglich. Aber wo genau taucht der Fehler denn auf? Bzw. funktioniert alles ohne rkhunter?

    • Uff Sorry, da bin ich gerade überfragt – ohne genau zu wissen, was du für nen System hast, was für Pakete installiert sind, bzw was du installierst hast, … ist das per Ferndiagnose nicht einfach.

Kommentieren Sie den Artikel

Please enter your comment!
Please enter your name here