Zum Inhalt springen

Services, Wiki-Artikel, Blog-Beiträge und Glossar-Einträge durchsuchen

↑↓NavigierenEnterÖffnenESCSchließen
Linux Server Härtung: Schritt-für-Schritt Praxis-Guide für Ubuntu/Debian und - Betriebssystem-Sicherheit und Systemhaertung
Netzwerk- & Endpoint Security

Linux Server Härtung: Schritt-für-Schritt Praxis-Guide für Ubuntu/Debian und RHEL

Linux Server nach der Installation systematisch absichern: SSH-Härtung, Firewall-Konfiguration (UFW/firewalld), Fail2ban, unattended-upgrades, AppArmor/SELinux, systemd-Unit-Isolation, rootkit-Erkennung mit rkhunter und auditd für Compliance-Logging. Checklisten für Ubuntu 24.04 und RHEL 9.

Vincent Heinen Vincent Heinen Abteilungsleiter Offensive Services
12 Min. Lesezeit
OSCP+ OSCP OSWP OSWA

TL;DR

Ein frisch installierter Linux-Server weist standardmaessig zahlreiche Sicherheitslücken auf. Die Härtung folgt einem klaren Prozess: System-Updates, SSH-Härtung ohne Passwort-Authentifizierung, UFW- oder firewalld-Firewall, Fail2ban gegen Brute-Force, automatische Updates, auditd für Compliance-Logging, AppArmor oder SELinux als Mandatory Access Control und rkhunter für Rootkit-Erkennung. Der CIS Benchmark bildet die Prufliste für Ubuntu 24.04 und RHEL 9.

Diese Zusammenfassung wurde KI-gestützt erstellt (EU AI Act Art. 50).

Inhaltsverzeichnis (11 Abschnitte)

Ein frisch installierter Linux-Server ist alles andere als sicher: Standard-Passwörter, offene Ports, veraltete Pakete und unnötige Dienste stellen Angriffsflächen dar. Die gute Nachricht: Linux-Server-Härtung folgt einem gut dokumentierten Prozess der in wenigen Stunden automatisiert angewendet werden kann und die Angriffsfläche dramatisch reduziert.

Grundprinzip: Minimale Angriffsfläche

Die Härtungs-Philosophie folgt vier Grundsätzen: Minimalprinzip (nur das installieren was gebraucht wird), Least Privilege (Prozesse mit minimalen Rechten), Defense in Depth (mehrere Sicherheitsschichten) und Monitoring (was man nicht sieht, kann man nicht schützen).

Die empfohlene Reihenfolge:

  1. System-Update
  2. Benutzer und SSH
  3. Firewall
  4. Fail2ban / Brute-Force-Schutz
  5. Automatische Updates
  6. Audit-Logging (auditd)
  7. Mandatory Access Control (AppArmor/SELinux)
  8. Zusätzliche Tools (rkhunter, chkrootkit)
  9. Kernel-Härtung (sysctl)
  10. CIS-Benchmark-Prüfung

Schritt 1: System-Update und Pakete aufräumen

Direkt nach der Installation alle Pakete aktualisieren:

# Ubuntu/Debian:
apt update && apt upgrade -y && apt autoremove -y

# RHEL/Rocky Linux/AlmaLinux:
dnf update -y && dnf autoremove -y

Anschließend unnötige Dienste deaktivieren. Welche Dienste aktiv sind, zeigt systemctl list-unit-files --type=service --state=enabled. Typische Kandidaten, die auf einem Minimal-Server nicht benötigt werden: bluetooth.service, cups.service (Drucker), avahi-daemon.service (mDNS/Zeroconf) und rpcbind.service (NFS, wenn nicht benötigt). Telnet-Dienste immer deaktivieren.

Schritt 2: Benutzer und Sudo

Einen dedizierten Admin-User anlegen, bevor Root-Login deaktiviert wird:

useradd -m -s /bin/bash -G sudo admin-user   # Ubuntu
useradd -m -s /bin/bash -G wheel admin-user  # RHEL
passwd admin-user

Sudo-Konfiguration immer über visudo vornehmen (erzwingt Syntaxcheck). In /etc/sudoers.d/admin-user den Timestamp-Timeout auf 5 Minuten reduzieren (Defaults:admin-user timestamp_timeout=5). In Production kein NOPASSWD für privilegierte User - Ausnahme sind eng definierte CI/CD-Befehle.

Die Passwort-Policy wird über /etc/security/pwquality.conf gesteuert. Empfohlene Mindestwerte: minlen = 14, je ein Pflichtzeichen aus Ziffern, Groß-/Kleinbuchstaben und Sonderzeichen (dcredit, ucredit, lcredit, ocredit jeweils auf -1), maxrepeat = 3. In /etc/login.defs Passwort-Ablauf auf 90 Tage und Warnzeitraum auf 14 Tage setzen.

Schritt 3: SSH-Härtung

Die vollständige gehärtete /etc/ssh/sshd_config:

# ------- AUTHENTICATION -------
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitEmptyPasswords no
MaxAuthTries 3
MaxSessions 2

# ------- PROTOCOL -------
Protocol 2
Port 22222
AddressFamily inet

# ------- CIPHERS (moderne Kryptographie) -------
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com

# ------- FEATURES DEAKTIVIEREN -------
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PrintMotd no
PermitUserEnvironment no

# ------- TIMEOUTS -------
ClientAliveInterval 300
ClientAliveCountMax 2
LoginGraceTime 30

# ------- BANNER -------
Banner /etc/ssh/banner.txt

Nach Änderungen: systemctl restart sshd. Wichtig: Vor dem Schließen der bestehenden SSH-Sitzung eine zweite Verbindung mit den neuen Einstellungen testen.

Schritt 4: Firewall (UFW / firewalld)

# Ubuntu/Debian - UFW:
ufw default deny incoming && ufw default allow outgoing
ufw allow 22222/tcp comment 'SSH'
ufw allow 443/tcp comment 'HTTPS'
ufw allow from 10.0.0.0/8 to any port 22222 proto tcp  # SSH auf Management-Netz
ufw enable

# RHEL/Rocky - firewalld:
firewall-cmd --permanent --add-service=https
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload

Für fortgeschrittene Konfigurationen bietet nftables direkte Kontrolle über Chains und Policies. Eine typische nftables-Konfiguration definiert drei Chains: input mit Default-Policy drop und gezielten Ausnahmen für established Connections, ICMP und die erlaubten Ports, output mit Default accept sowie forward mit Default drop.

Schritt 5: Fail2ban

Fail2ban installieren (apt install fail2ban auf Ubuntu, dnf install fail2ban auf RHEL) und in /etc/fail2ban/jail.local konfigurieren (nie jail.conf direkt editieren):

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
banaction = ufw

[sshd]
enabled = true
port = 22222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3

[nginx-http-auth]
enabled = true
filter = nginx-http-auth
port = http,https
logpath = /var/log/nginx/error.log

Für Umgebungen mit anhaltenden Angriffen empfiehlt sich bantime.increment = true mit bantime.maxtime = 604800 (7 Tage Maximum). Status prüfen mit fail2ban-client status sshd, manuelle Entsperrung mit fail2ban-client set sshd unbanip <IP>.

Schritt 6: Automatische Updates

Ubuntu - unattended-upgrades: Installation mit apt install unattended-upgrades && dpkg-reconfigure --priority=low unattended-upgrades. In /etc/apt/apt.conf.d/50unattended-upgrades nur Security-Updates automatisch einspielen, E-Mail-Benachrichtigung an den Admin aktivieren und automatischen Reboot deaktivieren (Automatic-Reboot "false"). Reboots nach Updates sollten im Wartungsfenster manuell durchgeführt werden.

RHEL - dnf-automatic: Installation mit dnf install dnf-automatic, aktivieren mit systemctl enable --now dnf-automatic-install.timer. In /etc/dnf/automatic.conf upgrade_type = security und apply_updates = yes setzen.

Schritt 7: Audit-Logging (auditd)

Auditd installieren (apt install auditd auf Ubuntu, dnf install audit auf RHEL). Empfohlene Regeln in /etc/audit/rules.d/security.rules:

# Datei-Attribut-Änderungen:
-a always,exit -F arch=b64 -S chmod,chown,fchmod,fchown -k file_perms

# sudo-Nutzung:
-w /usr/bin/sudo -p x -k sudo_exec

# SSH-Keys:
-w /root/.ssh -p rwa -k ssh_root
-w /home -p rwa -k ssh_home

# Crontab-Änderungen:
-w /etc/crontab -p rwa -k cron
-w /var/spool/cron -p rwa -k cron

# Benutzer/Gruppen:
-w /etc/passwd -p rwa -k user_mgmt
-w /etc/shadow -p rwa -k user_mgmt
-w /etc/group -p rwa -k user_mgmt

# Root-Commands durch normale User (sudo etc.):
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -k root_commands

# Netzwerkverbindungen:
-a always,exit -F arch=b64 -S connect -k network_connect

Logs auswerten mit ausearch -k sudo_exec (alle sudo-Ausführungen), aureport -au (Authentication-Report) und aureport --failed (fehlgeschlagene Events).

Schritt 8: Kernel-Härtung (sysctl)

Kernel-Parameter in /etc/sysctl.d/99-hardening.conf:

# IP-Forwarding deaktivieren (außer bei Router/VPN-Server):
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0

# ICMP Redirects ignorieren:
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# Source-Route-Pakete ablehnen:
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# SYN-Flood-Schutz:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_synack_retries = 2

# Spoofing-Schutz (Reverse Path Filtering):
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Log Martians (unroutable Pakete):
net.ipv4.conf.all.log_martians = 1

# ASLR:
kernel.randomize_va_space = 2

# Core Dumps deaktivieren:
fs.suid_dumpable = 0

# Keine Kernel-Adressen in /proc:
kernel.kptr_restrict = 2

# dmesg für nicht-root einschränken:
kernel.dmesg_restrict = 1

# Verhindert Prozess-Debugging durch andere User:
kernel.yama.ptrace_scope = 1

Einstellungen sofort laden mit sysctl -p /etc/sysctl.d/99-hardening.conf.

Schritt 9: AppArmor / SELinux

AppArmor (Ubuntu):

Status prüfen mit aa-status. Profile für laufende Dienste in den Enforce-Modus setzen: aa-enforce /etc/apparmor.d/usr.sbin.nginx. Für eigene Anwendungen zunächst mit aa-genprof ein Profil im Lernmodus erstellen, dann nach ausreichenden Tests mit aa-enforce aktivieren.

SELinux (RHEL):

SELinux-Modus prüfen mit getenforce. Den Status immer auf Enforcing halten - Disabled ist keine Option. AVC-Denials anzeigen mit ausearch -m avc -ts recent und sealert -a /var/log/audit/audit.log. Notwendige Booleans setzen (Beispiel: setsebool -P httpd_can_network_connect 1) und Kontexte mit restorecon -Rv /var/www/html wiederherstellen.

Schritt 10: CIS-Benchmark Prüfung

Automatisierte Compliance-Prüfung:

  • CIS-CAT Lite (kostenlos, https://www.cisecurity.org/cis-cat-lite): Prüft gegen CIS Benchmarks für Ubuntu, RHEL u.a. und erstellt einen HTML-Report mit Compliance-Score.
  • OpenSCAP (Open Source): oscap xccdf eval gegen das passende CIS-Profil aus dem SSG-Paket liefert einen detaillierten HTML-Report.
  • Lynis: lynis audit system gibt einen Score plus Empfehlungen aus. Nicht-gehärtete Server erreichen typischerweise 40-60/100; nach Härtung sind 75-90/100 erreichbar.

Wichtige manuelle CIS-Checks:

  • Partition-Schema: /tmp, /var, /home auf eigenen Partitionen mit noexec,nosuid
  • Sticky Bit auf /tmp: chmod +t /tmp
  • noexec auf /dev/shm: mount -o remount,noexec,nosuid /dev/shm
  • Keine unbekannten SUID/SGID-Dateien: find / -type f \( -perm -4000 -o -perm -2000 \) -exec ls -la {} \;
  • Keine World-Writable Verzeichnisse: find / -type d -perm -o+w -not -path "/proc/*" -exec ls -ld {} \;
  • Keine leeren Passwörter: awk -F: '($2 == "") {print $1}' /etc/shadow

Nächster Schritt

Unsere zertifizierten Sicherheitsexperten beraten Sie zu den Themen aus diesem Artikel — unverbindlich und kostenlos.

Kostenlos · 30 Minuten · Unverbindlich

Artikel teilen

Über den Autor

Vincent Heinen
Vincent Heinen

Abteilungsleiter Offensive Services

E-Mail

M.Sc. IT-Sicherheit mit über 5 Jahren Erfahrung in offensiver Sicherheitsanalyse. Leitet die Durchführung von Penetrationstests mit Spezialisierung auf Web-Applikationen, Netzwerk-Infrastruktur, Reverse Engineering und Hardware-Sicherheit. Verantwortlich für mehrere Responsible Disclosures.

OSCP+ OSCP OSWP OSWA
Zertifiziert ISO 27001ISO 9001AZAV