Systeme grundlegend absichern

Workshop: Linux-Hardening

28.07.2011 von Thomas Steudten
Die Optionen von Linux sind sehr vielschichtig. Unzählige Pakete sind verfügbar, Benutzerverwaltung, Netzwerk- und Dateizugriff lassen sich oft beliebig konfigurieren. Doch wer darf was, und welche Komponenten werden überhaupt benötigt? Linux-Hardening widmet sich speziell dieser Frage, um das System möglichst sicher zu machen.

Ein Linux-System in der Funktion als Server bietet zahlreiche Netzwerk-Services an. Zwar werden nicht alle gebraucht, doch sie bieten einen recht freien Zugriff auf Ressourcen. Und auch ein benötigter Service sollte nicht jedem System und Benutzer den Zugriff erlauben.

Nachdem ein grundlegender Funktionstest erfolgreich durchlaufen ist, empfiehlt es sich im nächsten Schritt, das Linux-System an die Bedürfnisse anzupassen. Allgemein spricht man hier im anglizistischen Sprachgebrauch von "Customizing" oder speziell von "Hardening", wenn das System wirklich nur die vorgegebenen Aufgaben und Anforderungen erfüllen soll. Es sollten also nur die notwendigen Prozesse mit minimalen Rechten aktiv sein.

Bildergalerie: Linux-Server-Distributionen
RHEL - Einsatzgebiet
Welche Art von Server bestimmen Sie in dieser Maske.
Empfehlenswerte Linux-Distributionen für Server.
RHEL - Mehrwert
Sie können bereits während der Installation Zusatzpakete angeben und einspielen lassen.
RHEL - Webserver
Beim Basis-Server ist die Webunterstützung per Standard nicht dabei.
RHEL - Grafisch
Sollten Sie eine grafische Benutzerpberfläche installiert haben, gibt es auch entsprechende Administrationswerkzeuge.
RHEL - Platzwahl
Hier partitionieren Sie das System.
Novell SLES - Webserver
In dieser Maske können Sie Apache konfigurieren.
Novell SLES - Sicherheit
SLES setzt auf AppArmor, das Sie ebenfalls grafisch administrieren können.
Novell SLES - Startbildschirm
Der erste Bildschirm von SUSE Linux Enterprise Server.
Novell SLES - YaST
Yet another Setup Tool ist das Rückgrad der Linux-Distribution.
Novell SLES - Virtualisierung
Welches Betriebssystem hättens denn gerne?
Ubuntu
Auch die Server-Variante lässt sich auf Deutsch installieren.
Ubuntu - Sprache
Allerdings ist die Übersetzung laut eigenen Angaben noch nicht vollständig.
Ubuntu - Name
Taufen Sie ihren Server in dieser Maske.
Ubuntu - Installation
Je nach Rechner, dauert das eine gewisse Zeit.
Ubuntu - Dienste
Hier können Sie bestimmen, welche Aufgaben ihr Server erledigen soll. Sie können das später natürlich ausweiten.
Ubuntu - Anmelden
Ubuntu Server bringt per Standard keine grafische Oberfläche mit sich.
Debian - Geduld
Die Installation von Debian kann nach Hardware schon etwas dauern.
Debian - Paket-Auswahl
Dass Debian kein reines Desktop-System ist, sollte dieses Bild deutlich beweisen.
Debian - Squeeze
Seit kurzer Zeit ist Debian 6.0.0 verfügbar.
Debian - Paketverwaltung
Mit Synaptic können Sie das riesige Debian-Repository benutzen.
Debian - Grafische Benutzeroberfläche
Unter anderem stellt Debian GNOME zur Verfügung.
Collax - Nagios integriert
Der Collax Business Server bietet eingebaute Monitoring-Software
Collax - So simple: Stimmt!
Collax Businsess Server ist in wenigen Schritten installiert.
Collax - Wizard
Die Assistenten sind eine Wohltat und man kann auch mit weniger tiefem Wissen zum Beispiel einen Mailserver konfigurieren.
Collax - phpMyAdmin
Collax setzt bei der Datenbank-Administration auf bewährte Open-Source-Software
Collax - Datei- und Druck-Server
SMB- und CIFS-Dienste dürfen bei keinem Linux-Server fehlen.
SME Server
Basiert auf CentOS, das wiederum auf die quelloffenen Pakete von Red Hat setzt.
SME Server - Testen
Vor einer Installation können Sie das medium auf Fehler prüfen lassen.
SME Server - Sprache
Sie können das System auch auf Deutsch installieren.
SME Server - Installation
Das Einspielen der Pakete hängt vom eingesetzten Rechner ab.
SME Server - Datensicherung
Haben Sie eine Datensicherung, können Sie diese an diesem Punkt wieder einspielen.
SME Server - Netzwerk
Während der Installation können Sie eine IP-Adresse festlegen.
SME Server - Administration
SME Server können Sie bequem via Brwoser administrieren.
SME Server - Angemeldet
Hier sehen Sie die Möglichkeiten, die Ihnen SME Server zur Verfügung stellt.
SME Server - ClamAV
Sie können den Virenscanner so einstellen, dass er einmal täglich auf Malware prüft und diese dann in Quarantäne sperrt.
Fedora 17
Die derzeit aktuelle Version der Linux-Distribution. Version 18 ist für Januar 2013 geplant.
Fedora 17 - Oberfläche
Fedora setzt per Standard auf GNOME.
Fedora 17 - Anwendungen
Das von Red Hat gesponserte Betriebssystem bringt diverse Applikationen vorinstalliert mit sich.
Fedora 17 - Browser
Mozillas Firefox ist auch mit von der Partie.
Fedora 17 - Datensicherung
Automatische Backups mit Fedora 17.
Fedora 17 - Dateisysteme
Unterstützung für Btrfs ist auch während der Installation vorhanden.
Fedora 17 - Kernel
Fedora 17 setzt auf Linux 3.3.
openSUSE
Ausprobieren oder Installieren?
openSUSE - Installation
Das Einspielen übernimmt YaST.
openSUSE - KDE
Sie können zwischen KDE oder GNOME wählen.
openSUSE - Dateimanager
Dolphin ist KDEs Standard-Dateimanager.
openSUSE - Kontrollzentrum
YaST übernimmt alle administrativen Aufgaben.
openSUSE - Kommunikation
Die Netzwerkeinstellungen bieten auch VPN an.
Virtuelle Umgebung
Proxmox 2.0 eignet sich zum Konsolidieren von Servern.
Proxmox - Lizenz
Nach Bestätigung geht es weiter.
Proxmox - Zeitzone
Ein Installations-Assistent nimmt Sie an die Hand.
Proxmox - Kennwort
Hier geben Sie Passwort und E-Mail-Adresse an.
Proxmox - Netzwerk
Bereits während der Installation lassen sich notwendige Einstellungen angeben.
Proxmox - Anmelden
Wie man sieht, basiert Proxmox 2.0 auf Debian 6 "Squeeze".
Proxmox - Administration
So sieht die Oberfläche für den Systemverwalter aus.
Proxmox - neue VM
Hier können Sie eine neue virtuelle Maschine erstellen.
Proxmox - Betriebssystem
Proxmox unterstützt auch Windows 7.
Proxmox - Rollen
Wie viele Rechte die einzelnen Nutzer haben, bstimmen Sie hier.
Proxmox - Speicher
Hier konfigurieren Sie ISO-Abbilder und andere Speicherorte.
Proxmox - Datensicherung
Backups sind auf Systemen wie Proxmox Pflicht. Das Betriebssystem macht diese Aufgabe zu einem Kinderspiel.

Grob kann man den Zugriff auf ein Linux-System differenzieren nach dem Zugriff von außen auf das System (über die lokale Konsole oder das Netzwerk), dem ausgehenden Netzwerkverkehr und den erlaubten Aktionen auf dem System (von innen). Deaktivieren wir das Netzwerk-Interface, so kann ein Benutzer, der Zugriff zum System über die Konsole erhalten hat, noch Daten manipulieren oder über die vorhandenen I/O-Schnittstellen (USB, Firewire, FiberChannel, eSata) diese kopieren.

Hardening

Ein IT-System mit dem Betriebssystem Linux sicherer zu machen ermöglicht auch einen Blick hinter die Kulissen, und dabei kann man einige grundlegende Fragen beantworten:

Einem Desktop-System mit immer dem gleichen Benutzer braucht man in der Regel keine restriktiven Vorgaben zu machen. Aber auch hier gilt: Je restriktiver, desto sicherer. Zudem lässt sich eine "Stateful"-Firewall, wenn diese schon im Kernel vorhanden ist, mit einfachen Mitteln in kurzer Zeit aktivieren.

Grundsätzlich zeigt sich, dass über die Jahre die Linux-Distributionen restriktiver mit Ressourcen und Zugängen umgehen. Der X11-Window-Server erlaubt keinen oder nur lokalen Netzwerkzugriff, die Firewall gestattet lediglich eingehende Antwortpakete, der Nameserver verrichtet seine Tätigkeit in einem Chroot-Umfeld, und viele privilegierte Prozesse verwerfen ihre Rechte.

Aus der Praxis

Ein Prozess mit Root-Rechten (privilegierter Prozess), der vollen Zugriff auf das Dateisystem hat und an keine Prozesslimits stößt, ist für viele Applikationsentwickler der Idealfall. So braucht man sich im Vorfeld keine Gedanken über Zugriffsrechte und Isolation zu machen.

Allerdings gibt es dafür eine Reihe von Nachteilen:

Privilegien

Linux- wie auch traditionelle Unix-Implementierungen unterscheiden nach privilegierten (effektive Benutzer-ID ist null) und nicht privilegierten Prozessen. Erstere umgehen die meisten Kernel-Zugriffskontrollen. Die anderen durchlaufen die vollen Zugriffskontrollen, basierend auf den Prozessrechten (normalerweise: die effektive UID, effektive GID und zusätzliche Gruppenzugehörigkeit).

Seit Kernel 2.2 unterteilt Linux die privilegierten Zugriffsrechte, den sogenannten Capabilities, die auf Thread-Basis unabhängig voneinander de- und aktiviert werden können.

Ansatzpunkte für Hardening

Möchte man ein Linux-System härten, so bieten sich nachfolgende Ansatzpunkte an:

Netzwerk:

Prozesse:

Ressourcen:

Hardening: Virtualisierung & SELinux

Die Linux Container (lxc) bieten die Möglichkeit, einzelne Prozesse oder ein vollständiges Betriebssystem vom laufenden System zu isolieren und eine Ressourcensteuerung zu implementieren.

Auch andere Virtualisierungslösungen wie qemu, KVM, XEN oder VMware trennen das laufende System vom Gastsystem und bieten so zwar einen erhöhten Verwaltungsaufwand, aber eine gewisse Isolierung ist vorhanden.

SELinux

Sind Dateien und Verzeichnisse beim Einsatz von SELinux korrekt mit einem Label versehen, dann wird jeder Zugriff überwacht. Aktivieren lässt es sich zu jeder Zeit per "setenforce enforcing", wobei hier zwischen den beiden Modi gewechselt wird. Der Vorgang "labeln" ordnet jedem Dateiobjekt einen Kontext zu, beispielsweise "f_tmp" für Prozesse und Verzeichnisse, die nach /tmp oder /var/tmp schreiben dürfen.

Zwei wesentliche Modi kommen hier im täglichen Betrieb vor:

Der Permissive-Modus unterscheidet sich vom Enforced-Modus dadurch, dass dieser einen Zugriff zwar überwacht und loggt, aber nicht verweigert. Auch kann SELinux so konfiguriert werden, dass der Modus erst nach einem Neustart geändert werden kann.

Konfigurationsdateien für SELinux finden sich unter /etc/selinux.

Hardening: tcpwrapper, xinetd & udev

Bei Netzwerkdiensten, die nicht über den inetd beziehungsweise xinetd gestartet werden und sich somit der einfachen Zugriffskontrolle und -überwachung dort entziehen, lässt sich die Konfiguration meist über tcpwrapper aktivieren. Ob ein Prozess diese Methoden nutzen kann, verrät ein Blick in die Manualseite; man kann aber auch nachsehen, ob die notwendige Shared-Library - sinngemäß "libwrap"-- eingebunden ist.

# ldd /usr/sbin/snmpd | grep --color libwrap

libwrap.so.0 => /lib64/libwrap.so.0

Die Zugriffssteuerung erfolgt hierbei im Wesentlichen über zwei Konfigurationsdateien im /etc-Verzeichnis:

Deren Aufbau ist durch folgende Zeile charakterisiert:

Prozessnamen : System [ : shell_command]

xinetd

Über die Konfigurationen des neuen Superdaemons xinetd kann der Zugriff auf einen Netzwerkservice vielfältig beschränkt und überwacht werden. Eine White- oder Blacklist (only_from, no_access) für IP-Adressen, Host-Namen und Netzwerknamen, ein Zeitfenster (access_times) oder eine Zugriffsperre bei hoher Systemlast (max_load) sind nur einige davon. Ein erfolgreicher oder misslungener Zugriff kann ebenso geloggt werden. Die Möglichkeit, den neuen Prozess mit anderer User- und Gruppen-ID auszuführen, sollte man nutzen. Mit der "bind/ interface"-Option kann der Service auf ein definiertes Netzwerk-Interface fixiert und so beispielsweise der Zugriff über telnet nur aus dem LAN heraus aktiviert werden.

Bei einem Stand-alone-Daemon, der seinen I/O-Verkehr nicht über die Dateihandle stdin und stdout abwickelt, bleibt nur die Möglichkeit, über den tcpwrapper oder letztendlich über die Firewall eine Zugriffskontrolle zu implementieren. Die Möglichkeit, über openSSH einen Tunnel aufzubauen, erschwert die Kontrolle der Zugriffe.

Wenn möglich, sollte ein Netzwerkservice immer auf den Host-Namen "localhost" beziehungsweise die IP 127.0.0.1 oder das Interface "lo" gebunden werden. Denn nur so ist ein Zugriff darauf ausschließlich vom gleichen System möglich, und es können auch Firewall-Regeln mit dem Interface "lo" definiert werden.

udev

Wurden die sogenannten Device-Knoten im Verzeichnis "/dev" vor einiger Zeit noch statisch per "mknod" angelegt, übernimmt dies heute der "udev"-Daemon. Dieser ist in der Lage, anhand von speziellen Merkmalen der Hardware, wie Hersteller, Seriennummer oder Typ, den Device-Knoten immer mit dem gleichen Namen und der gleichen Major- und Minor-Nummer anzulegen, auch wenn Letztere in neueren Kernels keine große Rolle mehr spielen.

Die Systemregeln unter /lib/udev/rules.d können durch eigene Regeln unter /etc/udev/rules.d ersetzt und somit auch deaktiviert werden.

Secure Shell (SSH)

Die Secure Shell ist mittlerweile der De-facto-Standard, wenn es um Remote-Logins , Port-Weiterleitung, secure-ftp und Tunneling geht. Von daher sollte SSH gegenüber telnet, rlogin und ftp bevorzugt werden.

Die Konfiguration erfolgt über die Dateien im Verzeichnis /etc/ssh/:

Die eigenen Keys finden sich dann im Home-Verzeichnis $HOME/.ssh und heißen normalerweise je nach Schlüssel-Type id_rsa* und id_dsa* für die privaten Schlüssel und tragen die Endung ".pub" für die öffentlichen Schlüssel.

Über die Konfigurationsdatei config kann jeder Benutzer noch individuelle Einstellungen vornehmen. In der Datei known_hosts merkt sich der Client-SSH die kontaktierten Systeme in Form des öffentlichen Systemschlüssels aus /etc/ssh/ssh_host*.pub. Der SSH-Client würde also bemerken, wenn sich ein Host-Schlüssel verändert hat, und somit eine Man-in-the-Middle-Attacke erkennen.

Ist der Zugriff für ein oder mehrere Systeme auf einen IP-Port über die IP-Adresse oder die Host-Namen per tcpwrapper, xinetd-Konfiguration oder die iptables-Firewall freigeschaltet, sollte man auf jeden Fall die Applikation und die Services individuell für die notwendigen Zugriffsarten konfigurieren. Für die Secure-Shell (SSH) empfiehlt es sich, nur den Zugriff über die vorher generierten Schlüssel (Public/ Private Keys) zu erlauben und die interaktive Passwort-Authentifizierung zu verbieten:

PasswordAuthentication no

UsePAM no

Die Verzeichnisrechte auf $HOME/.ssh sollten restriktiv gesetzt werden, ansonsten verweigert der SSH-Daemon schon mal den erwarteten Login über den öffentlichen Key (Option "StrictModes yes").

Capabilities

Neben einer chroot-Umgebung und dem Ausführen unter einer Benutzer- und Gruppen-ID größer null kann ein Prozess noch selektiv seine Freiheiten begrenzen. Die Capabilities, das heißt die Rechte eines privilegierten Threads, kann dieser je nach Bedarf deaktivieren und somit seine Privilegien begrenzen. Die Liste der möglichen Capabilities wächst mit der Zeit.

Als Beispiel kann ein Prozess oder auch Thread, der mit der effektiven Benutzer-ID 0 gestartet wurde und das Privileg "CAP_NET_BIND_SERVICE" deaktiviert hat, sich nicht mehr auf einen Netzwerk-Port unterhalb der Port-Nummer 1024 binden.

Fazit

Mit wenig Aufwand lässt sich in aktuellen Distributionen das Linux-System den Bedürfnissen anpassen und auch gleich besser absichern. Auch wenn der Aufwand für den Betrieb dafür größer ist, das Resultat rechtfertigt diesen in jedem Fall.

Ein System-Hardening über die integrierte Firewall, den Zugriffsschutz über tcpwrapper oder den Inet-Superdaemon sollte heute eine Selbstverständlichkeit sein. (cvi)