6 Tipps

Linux-Server im Netzwerk absichern

21.03.2016 von David Wolski
Der eigene Linux-Server kann im 19-Zoll-Rack eines Hosters stehen oder aus einer Platine im Format eines Raspberry Pi bestehen: Sobald der Server an einem Netzwerk teilnimmt, sind Vorkehrungen zur Serversicherheit Pflicht.

Ein Linux-System ist nicht per se sicher, nur weil es den Linux-Kernel und bewährte Open-Source-Programme kombiniert. Ein System kann nur so nur sicher sein wie seine Konfiguration. Die größten Lücken werden nicht von genialen Hackern gerissen, sondern durch die Nachlässigkeit des Administrators.

Ein-Platinen-Computer wie der Raspberry Pi haben den Aufwand erheblich gesenkt, von zu Hause aus einen kleinen Linux-Server zu betreiben. Virtuelle Serverinstanzen bei Massenhostern erlauben den Betrieb eines Serversystems mit richtig schneller Internetanbindung für wenige Euro im Monat und bieten dabei volle Kontrolle für root – wie ein physikalisches System.

Sozialverträgliche Kosten bedeuten aber nicht, dass es damit auch einfach geworden ist, einen Server sicher zu betreiben. Auch wenn zum Serverbetrieb geeignete Linux-Distributionen wie Debian, Ubuntu Server, Open Suse oder Cent-OS mit einer sinnvollen Basiskonfiguration ausgeliefert werden, so müssen angehende Linux-Administratoren doch selbst einige Sicherheitsvorkehrungen treffen. Auch wenn der Server im Internet nur wenig Dienste für den eigenen Bedarf anbietet oder der heimische Miniserver nur an einer DSL-Leitung hängt und über eine dynamischen Hostadresse erreichbar ist, werden hin und wieder ungebetene Besucher anklopfen und Einlass begehren. Dahinter stecken sehr selten gezielte Angriffe, sondern in fast allen Fällen automatisierte Scans, die stur einen Adressbereich abklappern, um nach typischen Sicherheitslücken und Einfallstoren zu suchen. Die ersten Schritte auf einem frisch eingerichteten Server sollten deshalb immer der Absicherung gewidmet sein.

1. Administration: Nur mit sudo

Ein fester Bestandteil jeder Linux-Distribution ist das von Unix geerbte sudo, kurz für „substitute user do“. Das Programm erlaubt einem Benutzer, Befehle im Kontext eines anderen Benutzerkontos auszuführen, beispielsweise als root. Der Vorteil: Eine Anmeldung als allmächtiger root-User ist dazu nicht nötig und sollte im Anschluss auch gleich deaktiviert werden. Für die Verwendung von sudo muss das root-Passwort nicht bekannt sein. Es genügt zur Systempflege ein gewöhnliches Benutzerkonto, das in der Konfiguration von sudo spezifiziert sein muss, um Programme und Befehle in der Shell gezielt mit root-Privilegien ausführen zu dürfen.

Ubuntu brachte sudo einem großen Anwenderkreis näher, denn bei dieser Distribution ist es vorkonfiguriert und die Anmeldung als root ist schlicht deaktiviert, damit Anwender gar nicht erst auf die Idee kommen, den root-Account zu nutzen. Raspbian folgt diesem Beispiel und stattet den Standardbenutzer „pi“ mit sudo aus. Bei Cent-OS gibt es während der Installation die Option „Diesen Benutzer zum Administrator machen“ und bei Open Suse „Dieses Passwort für den Systemadministrator verwenden“, um das ersterstellte Benutzerkonto gleich für sudo freizuschalten. Die manuelle Aufnahme von Benutzern zu sudo erfolgt über das Konfigurationstool visudo, das als root oder mit vorangestelltem sudo ausgeführt wird. Dort gibt die angehängte Zeile

sepp ALL=ALL

dem Benutzer „sepp“ das Recht, beliebige Befehle per sudo mit root-Rechten auszuführen.

Cent-OS 7: Der erste angelegte Benutzer wird mit der Option „Diesen Benutzer zum Administrator machen“ für sudo freigeschaltet.

2. Tür zu! Kein Zugang für root

Reservierte Konten mit bekannten Namen wie „root“ sollten bei Linux-Servern im Internet über SSH gar nicht erst erreichbar sein.

Server werden üblicherweise über SSH gepflegt, eine grafische Oberfläche direkt am Server oder über VNC ist eher die Ausnahme. Bei SSH kommt es darauf an, dass alle Benutzerkonten sichere, komplexe Passwörter haben. Standardaccounts wie root sollten über SSH nicht zugänglich sein, um es Angreifern nicht unnötig leicht zu machen (die mit „root“ schon mal einen Anmeldungsbestandteil, nämlich den Benutzernamen wüssten).

Damit man sich nicht selbst aussperrt, ist es wichtig, sich erst davon zu überzeugen, dass sudo funktioniert beziehungsweise su mit dem bekannten root-Passwort zum root-Konto wechselt. Besteht darüber kein Zweifel, kann man die Konfiguration des SSH-Diensts in der Datei „/etc/ssh/sshd_ config“ anpassen und mit der Zeile

PermitRootLogin no

die SSH-Anmeldung für root verbieten. Die Änderung ist nach einem Neustart des SSH-Dienstes aktiv, was beispielsweise in Debian/Raspbian/ Ubuntu der Befehl

sudo service ssh restart

erledigt. In den Distributionen Cent- OS und Open Suse lautet der Dienstname „sshd“ statt „ssh“.

3. Automatisierte und regelmäßige Updates

Ein Linux-System kann sehr sicher sein, solange es regelmäßig Updates erhält. Denn auch ein vorbildlich konfiguriertes Linux-System kann durch neu entdeckte Bugs angreifbar werden. Obwohl die Paketmanager ein Systemupdate sehr komfortabel machen, werden Aktualisierungen im Alltag aber doch gerne mal aufgeschoben. Für Server bietet sich eine unbeaufsichtigte Aktualisierung im Hintergrund an, die neue, als Sicherheitsupdates markierte Pakete regelmäßig einspielt.

Debian, Raspbian und Ubuntu: Die Scripts für unbeaufsichtigte Updates installiert dieser Terminalbefehl:

sudo apt-get install unattended-upgrades

Danach verlangt das System nur noch kleinere Anpassungen. Rufen Sie das Konfigurationsscript mit

sudo dpkg-reconfigure --priority=low unattended-upgrades

auf, und beantworten Sie die Rückfrage nach dem automatischen Herunterladen und Installieren mit „Ja“. Die benötigten Einträge für einen täglichen Cronjob, der um 6:25 Uhr ausgeführt wird, erstellt das Konfigurationsscript nun selbständig. Testen können Sie dies mit diesem Befehl:

sudo unattended-upgrades --dry-run -d

Debian-und Ubuntu-Systeme bieten dieses unkomplizierte Konfigurationsscript für regelmäßige, unbeaufsichtigte Aktualisierungen per Cronjob.

Die Logdatei „/var/log/unattended-upgrades/unattended-upgrades.log“ protokolliert die Updates. Eine komplette Distributionsaktualisierung, die auch geänderte Abhängigkeiten unter Paketen beachtet, müssen Sie hin und wieder mit

sudo apt-get dist-upgrade

manuell ausführen.

Cent-OS: Im Klon von Red Hat Enterprise Linux gibt es das Paket „yumcron“, das unbeaufsichtigte Updates aktiviert. Sie installieren es mit

sudo yum install yum-cron

und finden die zugehörige kommentierte Konfiguration unter „/etc/yum/ yum-cron.conf“. Per Standard holt das Script alle Aktualisierungen – nicht nur Sicherheitsupdates. Mit

sudo systemctl enable yum-cron.service sudo systemctl enable yum-cron.service

schalten Sie den Dienst für Updates ein.

Open Suse: Egal ob Server oder Desktop – die Konfiguration eines Open-Suse-Systems erfolgt mit dem Tool Yast, das auch als textbasierte Version auf der Kommandozeile zur Verfügung steht. Um diese Version zu nutzen, installieren Sie zuerst mit dem Kommando

sudo zypper install yast2-onlineupdate- configuration

das Yast-Modul für automatische Updates und rufen dann Yast mit

sudo yast

in der Shell auf. Dann gehen Sie im Yast-Menü auf „Software -> Konfiguration der Online-Aktualisierung“ und schalten dort mit „Automatische Online- Aktualisierungen“ (Tastenkombination Alt-A) die Updates ein und wählen das Intervall. Voreingestellt sind wöchentliche Updates.

Für die Kommandozeile gibt es unter dieser Serverdistribution das unkomplizierte textbasierte Werkzeug system-config-firewall-tui.

4. Paketfilter: Eigene Firewallregeln erstellen

Überflüssige Serverdienste mit offenen Ports sollten auf keinem System laufen. Trotzdem kann es vorkommen, dass eine versehentlich installierte oder noch nicht fertig eingerichtete Serverkomponente unerwünscht Ports öffnet. Dagegen hilft der Paketfilter von Linux, der sehr detaillierte Regeln für Netzwerkpakete erlaubt.

Debian, Raspbian und Ubuntu machen es heute mit dem Tool ufw einfach, Regeln für das nicht ganz triviale Kernel-Modul Iptables zu erstellen. Das Tool für die Kommandozeile ist mit

sudo apt-get install ufw

schnell installiert und hört auf eine sehr einfache Syntax. Um beispielsweise Verkehr von außen an die Ports 22 (SSH), 80 (HTTP) und 443 (HTTPS) durchzulassen, genügen diese drei einfachen Befehle:

sudo ufw allow 22 sudo ufw allow 80 sudo ufw allow 443

Anschließend wird die Firewall mit

sudo ufw enable

gestartet und mit

sudo ufw status

überprüft.

Die Firewallkonfiguration wirkt anspruchsvoll, erlaubt aber auch die Auswahl von Diensten anhand des Namens.

Cent-OS: Auch von Red Hat gibt es ein Konfigurationstool für Iptables in der Kommandozeile, das über sudo yum install system-configfirewall-tui schnell installiert ist. Der Befehl

sudo system-config-firewall-tui

startet das recht bequeme Tool, das einfache Firewallregeln über Dienstnamen unter der Option „Anpassen“ aktivieren kann.

Open Suse: Eine Konfiguration für die Firewall ist in Yast von Haus aus enthalten und erfolgt über die Menüs von Yast im Textmodus. Die vergleichsweise umfangreichen Einstellungen öffnet das Menü „Sicherheit und Benutzer -> Firewall“. Unter „Erlaubte Dienste“ lassen sich gestattete Serverdienste per Namen hinzufügen, und über „Start“ wird die Firewall dann aktiviert.


Generell ist große Vorsicht geboten, dass zumindest SSH auf seinem Standardport 22 zur Fernwartung erlaubt ist und man sich nicht durch allzu strenge Regeln selbst aussperrt.

5. Logwatch: Die Logdateien im Blick

Jedes Linux-System protokolliert etliche Prozesse und Leistungsdaten in seinem Logsystem und hilft damit bei der Problemanalyse. Weil es nicht einfach ist, alle relevanten Logs stets im Auge zu behalten, gibt es das Tool logwatch, das einen verkürzten Bericht als Zusammenfassung erstellt und per Mail an einen Empfänger senden kann. Empfehlenswert ist die Einrichtung dieser Berichte bei Servern, die wichtige Aufgaben erfüllen. Bei reinen Heimservern grenzt der Einsatz von logwatch dagegen schon an paranoiden Overkill.

Das Perl-Programm logwatch schickt täglich diese kurze Zusammenfassung der Serverlogs an die angegebene Mailadresse – empfehlenswert für wichtige Server.

Debian, Raspbian, Ubuntu, Cent- OS und Open Suse bieten alle das Paket „logwatch“ in ihren Paketquellen. In Debian und seinen Derivaten wird es beispielsweise mit

sudo apt-get install logwatch

installiert. In seinen Standardeinstellungen trägt sich logwatch als täglicher Cronjob unter „/etc/cron.daily“ ein und legt seine Konfiguration unter „/usr/share/logwatch/default.conf/logwatch. conf“ ab. Diese Konfigurationsdatei gilt es noch anzupassen. Öffnen Sie die Datei mit sudo in einen Texteditor, gehen Sie zur Zeile „MailTo = root“ und tragen Sie statt root die gewünschte E-Mail-Adresse ein.

6. Unbeschränkte Zugriffsrechte finden

Ein Schritt, der sich am Ende der gesamten Serverkonfiguration empfiehlt, wenn bereits der Webserver und alle Dienste laufen, ist eine systematische Suche nach Dateien und Verzeichnissen mit zu laxen Zugriffsrechten. Wer keine Gruppen für gemeinsame Zugriffsrechte für Verzeichnisse und Dateien einrichtet, behilft sich oft mit einer simplen, aber unsicheren Abkürzung: Dateien bekommen kurzerhand die Zugriffsrechte 666 oder gar 777 zugewiesen und Verzeichnisse die Rechte 777. Damit sind Lese- und Schreibberechtigungen effektiv ausgehebelt, da alle Welt Vollzugriff auf diese Dateisystemobjekte hat.

Auf einem Server ist dies keine gute Idee und schlicht ein Konfigurationsfehler, auch wenn nachlässig geschriebene Anleitungen diese Rechte oft empfehlen. Denn auch unprivilegierte Benutzer und eigentlich abgeschottete Serverdienste könnten diese Dateien und Verzeichnisse manipulieren. Sie können Dateien und Verzeichnisse mit unbeschränkten Zugriffsrechten einfach ausfindig machen und benötigen dazu noch nicht mal root-Rechte.


Das Kommando

find / -path /proc -prune -o -type f -perm 666

findet alle Dateien im gesamten Dateisystem, ausgenommen „/proc“, die von allen gelesen und beschrieben werden dürfen. Ferner listet

find / -path /proc -prune -o -type f -perm 777

alle Dateien auf, die dazu noch ausführbar sind. Genauso findet

find / -path /proc -prune -o -type d -perm 777

Verzeichnisse, die zum Lesen und Schreiben offenstehen.

Anstatt für Dateien und Verzeichnisse uneingeschränkten Vollzugriff zu setzen, ist es besser, Gruppen für gemeinsam genutzte Dateien zu verwenden. Der Befehl

chgrp [Gruppe] [Datei/Verzeichnis]

ändert die Gruppe für Dateisystemobjekte. Für den Vollzugriff für Besitzer und Gruppe genügen dann bei Verzeichnissen die Rechte 770 sowie bei Dateien 660.

Zum Abschluss: Wenn Ihnen dieser Beitrag geholfen hat, interessieren Sie sich vielleicht auch für die umgekehrte Perspektive: Nicht was man tun sollte, um einen Linux-Server abzusichern, sondern welche Fehler man auch vermeiden sollte, wird in diesem Ratgeber erklärt.

(PC-Welt/ad)