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.
2. Tür zu! Kein Zugang für root
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
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.
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.
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.
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)