Ein frisch installierter Linux-Server ist kein gehärtetes System. Die Standardinstallation
vieler Distributionen ist auf Kompatibilität und Benutzerfreundlichkeit ausgelegt, nicht auf
maximale Sicherheit. Dienste lauschen auf Ports, die nicht benötigt werden. Passwortrichtlinien
sind zu lax. Kernelparameter sind nicht für eine feindliche Netzwerkumgebung konfiguriert.
Wer einen Server in das Internet stellt, ohne ihn vorher zu härten, lädt Angreifer geradezu ein.
Linux-Härtung (englisch: Linux Hardening) bezeichnet die systematische Reduktion der
Angriffsfläche eines Systems. Das Ziel ist nicht, einen Angriff mit absoluter Sicherheit zu
verhindern – das ist prinzipiell unmöglich –, sondern den Aufwand für einen erfolgreichen Angriff
so weit zu erhöhen, dass er sich für den Angreifer nicht lohnt, und im Falle eines Einbruchs
den Schaden möglichst gering zu halten.
1.1 Angriffsszenarien
Die häufigsten Angriffsvektoren auf Linux-Server umfassen automatisierte Brute-Force-Angriffe
auf SSH, die Ausnutzung ungepatchter Schwachstellen in Diensten wie Nginx, Apache oder MySQL,
fehlerhafte Sudo-Konfigurationen, die eine Privilege Escalation ermöglichen, sowie
schlecht gesicherte Webanwendungen, die als Einstiegspunkt für laterale Bewegungen im
System dienen. Insider-Bedrohungen durch überprivilegierte Benutzerkonten runden das Bild ab.
1.2 Defense in Depth
Das Prinzip Defense in Depth (Tiefenverteidigung) besagt, dass Sicherheitsmaßnahmen
auf mehreren unabhängigen Schichten implementiert werden sollen. Fällt eine Schicht weg oder
wird kompromittiert, greifen die nachfolgenden. Für einen Linux-Server bedeutet das: Firewall,
Benutzerverwaltung, Mandatory Access Control, Auditing und Monitoring sind keine Alternativen
zueinander, sondern ergänzen sich gegenseitig.
1.3 CIS Benchmark als Referenz
Das Center for Internet Security (CIS) veröffentlicht für alle gängigen
Linux-Distributionen sogenannte CIS Benchmarks – umfangreiche Härtungsrichtlinien,
die von einer Community aus Sicherheitsexperten gepflegt werden. Sie sind frei verfügbar unter
cisecurity.org und bilden eine hervorragende Checkliste für die Absicherung
produktiver Systeme. Viele der in diesem Artikel beschriebenen Maßnahmen orientieren sich
an diesen Benchmarks.
2. Benutzerverwaltung
Fehlerhafte Benutzerverwaltung ist eine der häufigsten Ursachen für erfolgreiche Angriffe.
Das Prinzip der geringsten Privilegien (Least Privilege) muss konsequent umgesetzt
werden: Jeder Benutzer und jeder Prozess erhält nur die Rechte, die er für seine Aufgabe
tatsächlich benötigt.
2.1 Direkten Root-Login deaktivieren
Das Root-Konto sollte niemals direkt über SSH erreichbar sein. Stattdessen meldet sich ein
Administrator mit einem persönlichen Konto an und wechselt bei Bedarf über sudo
zu erhöhten Rechten. Dies schafft eine Audit-Trail und verhindert anonyme Root-Anmeldungen.
In der SSH-Konfiguration wird der direkte Root-Login wie folgt deaktiviert:
# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Nach der Änderung muss der SSH-Dienst neu geladen werden:
sudo systemctl reload sshd
2.2 Sudo-Konfiguration
Die Datei /etc/sudoers steuert, welche Benutzer welche Befehle mit erhöhten
Rechten ausführen dürfen. Sie sollte ausschließlich über visudo bearbeitet
werden, da dieses Werkzeug die Syntax vor dem Speichern prüft. Ein fehlerhaftes
sudoers-File kann das System unzugänglich machen.
2.3 Starke Passwortrichtlinien mit libpam-pwquality
Das PAM-Modul libpam-pwquality erzwingt Qualitätsanforderungen an Passwörter.
Es ersetzt das ältere cracklib-Modul und ist auf Debian/Ubuntu über den
Paketmanager verfügbar.
sudo apt install libpam-pwquality
Die Konfiguration erfolgt in /etc/security/pwquality.conf:
# /etc/security/pwquality.conf
minlen = 14 # Mindestlänge 14 Zeichen
dcredit = -1 # Mindestens 1 Ziffer
ucredit = -1 # Mindestens 1 Großbuchstabe
lcredit = -1 # Mindestens 1 Kleinbuchstabe
ocredit = -1 # Mindestens 1 Sonderzeichen
maxrepeat = 3 # Nicht mehr als 3 gleiche Zeichen hintereinander
usercheck = 1 # Benutzername darf nicht im Passwort vorkommen
enforcing = 1 # Verstöße werden abgelehnt (nicht nur gewarnt)
2.4 Account Locking mit faillock
Um Brute-Force-Angriffe auf lokale Logins zu erschweren, kann über das PAM-Modul
pam_faillock ein automatisches Sperren von Benutzerkonten nach einer
definierten Anzahl fehlgeschlagener Anmeldeversuche konfiguriert werden.
Ungepatchte Software ist einer der häufigsten Einstiegspunkte für Angreifer. Ein
konsequentes Patch-Management ist deshalb keine optionale Maßnahme, sondern ein
Grundpfeiler der Systemsicherheit.
3.1 Automatische Sicherheitsupdates mit unattended-upgrades
Auf Debian und Ubuntu ermöglicht das Paket unattended-upgrades das
automatische Einspielen von Sicherheitsaktualisierungen ohne manuellen Eingriff.
Automatic-Reboot sollte auf Produktivsystemen auf false
gesetzt und ein Reboot-Fenster manuell geplant werden, da Kernel-Updates erst nach
einem Neustart aktiv werden.
3.2 Nur notwendige Pakete installieren
Jedes installierte Paket ist eine potenzielle Angriffsfläche. Server-Systeme sollten
im Minimal-Modus installiert werden. Bereits installierte, nicht benötigte Pakete
können mit folgendem Befehl aufgelistet und anschließend entfernt werden:
# Alle installierten Pakete auflisten
dpkg -l | grep "^ii" | less
# Pakete entfernen und Konfigurationsdateien löschen
sudo apt purge PAKETNAME
# Verwaiste Abhängigkeiten entfernen
sudo apt autoremove --purge
Typische Kandidaten für die Entfernung auf einem reinen Web-Server sind beispielsweise
cups (Druckdienst), avahi-daemon (mDNS/Bonjour),
bluetooth oder nicht benötigte Compiler und Entwicklungswerkzeuge.
4. Netzwerk-Härtung
Die Netzwerkschicht ist der primäre Angriffspunkt für externe Bedrohungen. Eine
restriktive Firewall-Konfiguration in Kombination mit gehärteten Kernelparametern
reduziert die Angriffsfläche erheblich.
4.1 Firewall mit UFW
UFW (Uncomplicated Firewall) ist ein benutzerfreundliches Frontend für
iptables bzw. nftables und auf Ubuntu standardmäßig
verfügbar. Grundregel: alles sperren, nur explizit benötigte Ports öffnen.
Linux-Kernelparameter können über sysctl zur Laufzeit und persistent
über /etc/sysctl.d/ gesetzt werden. Die folgenden Einstellungen
verbessern die Netzwerksicherheit deutlich:
Die Einstellungen werden mit folgendem Befehl sofort angewendet:
sudo sysctl --system
4.3 Lauschende Ports prüfen
Regelmäßig sollte geprüft werden, welche Dienste auf welchen Ports lauschen.
Unbekannte oder unerwartete Einträge können auf kompromittierte Software oder
Fehlkonfigurationen hinweisen.
# Alle TCP-Ports mit zugehörigem Prozess anzeigen
sudo ss -tlnp
# Alle UDP-Ports anzeigen
sudo ss -ulnp
# Alternativ mit netstat (falls installiert)
sudo netstat -tlnp
5. AppArmor
AppArmor ist ein Mandatory Access Control (MAC) System, das in den Linux-Kernel
integriert ist und auf Ubuntu sowie Debian standardmäßig verfügbar ist. Es schränkt
Prozesse auf Basis von Profilen ein: Jedes Profil definiert, auf welche Dateien, Netzwerke
und Capabilities ein Programm zugreifen darf – unabhängig von den Unix-Dateiberechtigungen.
5.1 Profile-Konzept und Modi
AppArmor kennt zwei Betriebsmodi für Profile:
enforce: Zugriffe, die nicht im Profil erlaubt sind, werden blockiert und protokolliert.
complain: Verstöße werden nur protokolliert, aber nicht blockiert. Nützlich beim Erstellen neuer Profile.
5.2 Status prüfen und Profile verwalten
# AppArmor installieren (falls nicht vorhanden)
sudo apt install apparmor apparmor-utils apparmor-profiles apparmor-profiles-extra
# Aktuellen Status anzeigen: geladene Profile und deren Modus
sudo aa-status
# Profil in den enforce-Modus setzen
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx
# Profil in den complain-Modus setzen (zum Testen)
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx
# Alle Profile neu laden
sudo systemctl reload apparmor
5.3 Vorgefertigte Profile für Nginx und MySQL
Das Paket apparmor-profiles-extra enthält vorgefertigte Profile für
viele gängige Dienste. Für Nginx und MySQL sind Profile in der Regel bereits vorhanden
und müssen nur aktiviert werden:
Das Linux Audit-System (auditd) ermöglicht die detaillierte
Protokollierung sicherheitsrelevanter Ereignisse auf Kernelebene. Im Gegensatz zu
einfachen Systemlogs erfasst auditd auch Ereignisse wie Dateizugriffe, Systemaufrufe,
Benutzeranmeldungen und Änderungen an sicherheitskritischen Dateien – und das
manipulationsresistent, da die Logs direkt vom Kernel geschrieben werden.
6.1 Installation und Grundkonfiguration
sudo apt install auditd audispd-plugins
# Dienst starten und für Autostart konfigurieren
sudo systemctl enable --now auditd
# Aktuellen Status prüfen
sudo auditctl -s
6.2 Audit-Regeln für kritische Dateien
Audit-Regeln werden in /etc/audit/rules.d/ als .rules-Dateien
abgelegt. Die folgende Konfiguration überwacht sicherheitskritische Dateien und
Verzeichnisse auf Lese- und Schreibzugriffe:
# /etc/audit/rules.d/hardening.rules
# Änderungen an Benutzer- und Gruppendatenbank überwachen
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
# sudo-Konfiguration überwachen
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
# SSH-Konfiguration überwachen
-w /etc/ssh/sshd_config -p wa -k sshd_config
# Privilegierte Befehle protokollieren
-a always,exit -F arch=b64 -S execve -F euid=0 -k privileged
# Netzwerkkonfiguration überwachen
-w /etc/hosts -p wa -k network
-w /etc/network/ -p wa -k network
# Regeln unveränderlich machen (bis zum nächsten Reboot)
-e 2
Nach dem Anlegen der Regeldatei werden die Regeln geladen:
sudo augenrules --load
6.3 Auswertung mit aureport und ausearch
# Zusammenfassenden Bericht erzeugen
sudo aureport
# Nur fehlgeschlagene Ereignisse anzeigen
sudo aureport --failed
# Alle Ereignisse zum Schlüssel "identity" anzeigen
sudo ausearch -k identity --interpret | less
# Logins der letzten 24 Stunden
sudo aureport --login --start today
# Änderungen an /etc/sudoers suchen
sudo ausearch -k sudoers -i
7. Weitere Maßnahmen
Die bisher beschriebenen Maßnahmen bilden eine solide Grundlage. Die folgenden
ergänzenden Mechanismen runden die Härtung ab und schließen weitere
Angriffsvektoren.
7.1 AIDE – File Integrity Monitoring
AIDE (Advanced Intrusion Detection Environment) erstellt eine Datenbank
mit Checksummen und Metadaten kritischer Systemdateien. Bei regelmäßigen
Vergleichen kann erkannt werden, ob Dateien unerwartet verändert wurden – ein
wichtiger Indikator für eine Kompromittierung.
logwatch analysiert täglich die Systemlogs und verschickt eine
übersichtliche Zusammenfassung per E-Mail. Damit werden ungewöhnliche Ereignisse
– wie gehäufte fehlgeschlagene SSH-Logins oder Sudo-Eskalationen – schnell sichtbar,
ohne dass Logs manuell durchsucht werden müssen.
sudo apt install logwatch
# Konfigurationsdatei anpassen
sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
# Relevante Einstellungen in /etc/logwatch/conf/logwatch.conf:
# Output = mail
# MailTo = admin@example.com
# Detail = Med
# Range = yesterday
# Manuell ausführen (zum Testen)
sudo logwatch --output stdout --detail med
7.3 Kernelparameter: ASLR
Address Space Layout Randomization (ASLR) randomisiert die Speicheradressen
von Stack, Heap und Bibliotheken, was die Ausnutzung von Speicherkorrumpierungsfehlern
erheblich erschwert. Auf modernen Linux-Systemen ist ASLR standardmäßig aktiv, sollte
aber explizit auf den maximalen Wert gesetzt werden:
Verzeichnisse wie /tmp und /var/tmp werden häufig von
Angreifern genutzt, um schädliche Skripte hochzuladen und auszuführen. Durch das
Mount-Flag noexec wird die direkte Ausführung von Dateien aus diesen
Verzeichnissen unterbunden. Ergänzend verhindert nosuid die Ausführung
von SUID-Binaries aus diesen Pfaden.
# /etc/fstab – Einträge für gehärtete Mounts
# WARNUNG: Erst prüfen, ob Anwendungen diese Verzeichnisse für ausführbare Dateien nutzen
tmpfs /tmp tmpfs defaults,nosuid,nodev,noexec,size=512M 0 0
tmpfs /var/tmp tmpfs defaults,nosuid,nodev,noexec,size=256M 0 0
tmpfs /dev/shm tmpfs defaults,nosuid,nodev,noexec 0 0
# Mounts neu einlesen ohne Reboot
sudo mount -o remount /tmp
sudo mount -o remount /var/tmp
Vor dem produktiven Einsatz sollte geprüft werden, ob installierte Anwendungen
– insbesondere PHP-Anwendungen, bestimmte Datenbanken oder Build-Systeme –
ausführbare Dateien in /tmp ablegen. In diesem Fall sind Anpassungen
der Anwendungskonfiguration erforderlich, bevor das Flag gesetzt wird.
7.5 Kontinuierliche Überprüfung mit lynis
Linux-Härtung ist kein einmaliger Vorgang, sondern ein kontinuierlicher Prozess.
Neue Schwachstellen werden täglich entdeckt, Konfigurationen driften im Laufe der
Zeit ab, und neue Dienste erweitern die Angriffsfläche. Empfehlenswert ist daher
ein regelmäßiger Audit mit lynis, das eine automatisierte Überprüfung
anhand von Best Practices durchführt:
sudo apt install lynis
# Vollständigen Audit ausführen
sudo lynis audit system
# Ergebnis-Score und Empfehlungen werden am Ende ausgegeben
# Bericht liegt unter /var/log/lynis.log
Die in diesem Artikel beschriebenen Maßnahmen bilden in ihrer Gesamtheit eine
mehrschichtige Verteidigung, die dem CIS Benchmark Level 1 für Ubuntu und Debian
entspricht. Für besonders sicherheitskritische Umgebungen empfiehlt sich
zusätzlich die Lektüre des CIS Benchmark Level 2 sowie spezialisierter
Härteleitfäden für die eingesetzten Anwendungen. Regelmäßige Audits, ein
strukturiertes Patch-Management und die konsequente Anwendung des
Least-Privilege-Prinzips sind die drei wichtigsten Säulen einer dauerhaft
sicheren Linux-Infrastruktur.