Amazon.de Widgets
Skip to content
7.November 2009 / Patrick

Linux Server absichern

closeDieser Beitrag wurde vor über 3 Monaten veröffentlicht. Die darin beschriebenen Informationen sind mit Vorsicht zu geniessen, da sie bereits veraltet oder nicht mehr gültig sein könnten. Solltest du von Neuerungen oder Verbesserungen wissen, so freue ich mich über einen klärenden Kommentar.

Ich habe mich in letzter Zeit mal wieder mit dem Absichern meiner Ubuntu Server beschäftigt.

Dabei wollte ich vorallem den SSH-Zugang besser schützen, mindestens vor automatisierten Bruteforce-Attacken.

Dabei bieten sich mir diverse Möglichkeiten:

  • Keyfiles
  • PermitRootLogin
  • AllowUsers
  • Portänderung
  • fail2ban
  • PortKnocking
  • OTP

Als erstes habe ich mal das einloggen vom User “root” verboten. Damit sind bereits 80% aller automatisierten Attacken erfolglos.

PermitRootLogin

Dazu setzt man unter

/etc/ssh/sshd_config

hinter dem Punkt PermitRootLogin ein

no

AllowUsers

Noch besser als das Login als root zu verbieten, ist es, nur bestimmte User zuzulassen.

Dazu muss man in der Datei

/etc/ssh/sshd_config

unter dem Punkt AllowUsers alle Benutzer eingeben, welche Zugriff haben dürfen:

AllowUsers user1 user2 user3

Keyfiles

Keyfiles sind auch noch eine gute Möglichkeit um automatisierte Angriffe abzublocken. Denn, wer die passenden Keyfiles nicht hat, kann sich auch mit dem richtigen Passwort nicht einloggen.

Doch für mich persönlich sind Keyfiles eher unpraktisch, da ich mich oft von verschiedenen Maschinen aus einloggen soll, und meistens da die Keyfiles dann fehlen würden.

Portänderung

Gegen automatisierte Angriffe kann auch eine Umstellung der Ports über welche SSH (22) kommuniziert, helfen.

Das Problem jedoch, mit einem kurzen Scan kann man aufdecken, auf welchem Port SSH nun wirklich läuft.

Ändern kann man den Port unter dem Punkt

Port

in der Konfig von SSH unter

/etc/ssh/sshd_config

fail2ban

Mittels dem Tool fail2ban kann man eine IP Adresse nach einer vordefinierten Anzahl fehlgeschlagener Logins automatisch sperren.

Dies ist besonders praktisch, da ich somit nicht nur ein Mittel gegen automatisierte sondern auch gegen jegliche andere SSH Attacken habe.

Und mitels fail2ban kann man nicht nur den Zugriff auf SSH, sondern auch noch für unzählige andere Dienste wie Appache, DNS, FTP und viele mehr.

fail2ban gibt es auf den Ubuntu Packetservern über

sudo apt-get install fail2ban

Nach der Installation heisst es erst mal Einstellungen bearbeiten. Die Konfig ist unter

/etc/fail2ban/jail.conf

abgelegt.

Um den SSH Zugriff überwachen zu lassen, gilt es folgenden Textschnippsel noch zu ergänzen:

[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 3

Damit wird jede IP-Adresse, welche sich 3mal mit falschem Passwort einloggen will, automatisch gebannt.

Portknocking

Eine weitere, sehr effektive Massnahme ist das sogenannte Portknocking. Das beschreibt ein Verfahren, bei welchem man zuerst mit dem geheimen Zeichen anklopfen muss, bevor man sich per SSH einloggen kann.

Wird das geheime Zeichen nicht vorweg gesendet, so erscheint der Port 22 nach aussen als geschlossen.

Realisieren lässt sich dies mittels knockd, welches wiederum in den Packetquellen verfügbar ist

sudo apt-get install knockd

Konfiguriert wird das Programm über eine zentrale Datei

/etc/knockd.conf

Um knocked nun auf den SSH Port vorzubereiten, muss man die Datei mit folgenden Eintrag ergänzen:

[openSSH] sequence = 1234,1234,1234 seq_timeout = 5 command =
/sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn

[closeSSH]
sequence = 1234,1234,1234
seq_timeout = 5
command = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j DENY
tcpflags = syn

Will man sich nun per SSH einloggen, so muss man zuerst mittels

knock ip 1234 1234 1234

den Port freischalten. Nach vollbrachter Arbeit wird der Port über selbiges Kommando auch wieder geschlossen.

OTP

OTP ist ein Verfahren, mittels welchem für jedes Login ein neues Passwort generiert wird. Hier bedanke ich mich bei Benjamin für den Gedankenanstoss und die ausführliche Anleitung.

Er beschreibt dabei wie OTP in Kombination mit seinem Android Handy verweden kann. Doch auch iPhone-Benützern wie mir wird mit dem Tool “OTP Generator” von Dragon Technology Ltd geholfen, welches für CHF 3.30 im Appstore verfügbar ist.

Fazit

Für mich ist fail2ban und PermitRootLogin am besten geeignet. Obwohl ich der Meinung bin, das Portknocking wohl das effektivste wäre, weiss ich noch nicht, ob ich mein “Geheimzeichen” auch von anderen Betriebssystemen aus versenden kann. Deshalb ist dieses Verfahren vorerst mal auf Eis gelegt.

OTP ist für mich schon fast wieder übertriebene Sicherheit, und der Aufwand, jedes mal ein neues Passwort zu generieren ist mir einfach zu gross.

Natürlich ist ein offener SSH Port immer ein Sicherheitsrisiko, aber mit den obig aufgezeigten Möglichkeiten, sollte man 95% aller Attacken abwehren können.

Und sonst gilt halt immer noch: Wählt ein sicheres Passwort :)

[Quellen: 4t2, Horst und FreiesMagazin]

  • Horst

    Was auch hilfreich ist, ist die Begrenzung auf einen User bzw. eine Gruppe mit:

    AllowUsers user1, user2, …

    bzw.

    AllowGroups group1, group2, …

    Damit kann sich nur der User bzw. die Gruppe anmelden. Das macht die Sache sicherer, als nur den Root Zugriff zu verbieten.

  • der

    Super Beitrag!
    Habe es im uu.de – Planet gelesen.
    Ich hab zwar selber kein Server lese aber gerne solche sachen, da ich auch mal meinen eigenen haben will. Und Ausserdem waren mir PermitRootLogin und Portknocking neu.

    Vielen Dank!

  • Benni

    Super, danke! Habe diesen Artikel mal gebookmarked ;-)

  • burli

    Toller Beitrag. Kommt mir gerade recht. Vielleicht kannst du es noch ergänzen, wenn man zwei Netzwerkkarten hat, so das man nur über eine Netzwerkkarte Zugriff hat (z.B. beim Laptop, dass SSH nur über LAN funktioniert, nicht aber über WLAN)

  • Diddman

    Toller Beitrag. Passt zu meinem Vorhaben einen Server aufzusetzen

    Danke!

  • http://www.riecken.de Maik Riecken

    Danke für diesen Artikel. Er enthält viele nützliche Hinweise zur Absicherung des sshd. Die eigentliche Absicherung eines Servers erfolgt nach meinen Erfahrungen aber nicht an dieser Stelle.

    Alle Exploits, die ich kenne, kommen über Sicherheitslücken in Websoftware an den Server, namentlich über PHP. Wenn dort keine wesentlich komplexeren Sicherungsmaßnahmen ergriffen werden, kann Code zumindest im Kontext des Webservers ausgeführt werden. Rootrechte gibt es dann über Kernelbugs – s. aktuellen Bug bei heise. Dagegen kann man sich nur mit weitaus mehr Aufwand wehren.

    Ein Linuxserver wird nicht sicher(er), indem ich sshd absichere…

  • http://encodingit.ch Patrick

    Hey Leute, danke für das positive Feedback :)

    @Horst: Genau, das habe ich noch vergessen, merci.
    @burli: Mir ist leider nicht bekannt, das sowas möglich ist. Was vielleicht eine Möglichkeit wäre, ist “hosts.allow”, wo man einträgt, welche IPs sich verbinden dürfen.
    Das ganze ist leider sehr unflexibel, weshalb ich es auch nicht vorgestellt habe.

    grz

  • Phil

    Trotz allen Sicherheitsmaßnahmen, sollte man nicht vergessen, dass der Schutz nur so gut ist wie die Passwörter der Benutzer…
    Daher würde ich in diesem Zusammenhang noch auf http://cracklib.sourceforge.net/ hinweisen.

    gruß
    phil

  • http://encodingit.ch Patrick

    @Maik Riecken
    Sicher wird er nie, sicherer garantiert!
    Die beste Absicherung für Dienste wie Webserver etc nützt dir nichts, wenn du SSH offen hast. Genauso natürlich andersrum.
    Und Trends zeigen nun mal, dass immer mehr automatisierte Angriffe über SSH statt finden.
    Aber da auf meinem Server kein Webserver betrieben wird, muss ich da auch nichts absichern.

    grz

  • http://my.opera.com/freedo/blog/ Fredo

    Nach wie vor halte ich das Private-Key-Verfahren für eine der besten Methoden, seinen SSH-Server abzusichern. Den Key kann man sich ja z.B. auf einem USB-Stick speichern, dann hat man ihn auch immer dabei, wenn man sich von unterschiedlichen Rechnern einloggen will.

  • http://www.yetanotherlinuxblog.de LinuxHobby

    @ burli:
    Man kann den sshd an eine Adresse binden: ListenAddress 192.168.x.y
    Damit kann man z.B. nur ssh per lan erlauben (wenn man feste Ips vergibt).

  • http://www.ubuntuverse.at/ bernd

    wenn moeglich kann auch der Zugang nur auf gewisse IPs eingestellt werden.