Linux Server Härtung: CIS Benchmark, SSH, auditd und AppArmor
Umfassendes Härtungsguide für Linux-Server nach CIS Benchmark Level 2. SSH-Konfiguration, Kernel-Parameter, auditd-Logging, AppArmor/SELinux, Fail2ban, automatische Sicherheitsupdates und Compliance-Check mit lynis.
Inhaltsverzeichnis (9 Abschnitte)
Ein frisch installierter Linux-Server ist kein sicherer Linux-Server. Default-Konfigurationen sind auf Kompatibilität optimiert, nicht auf Sicherheit: SSH-Root-Login aktiv, keine Audit-Logs, keine Mandatory Access Controls, keine automatischen Updates. Dieser Guide bringt Ubuntu 22.04/24.04 LTS und RHEL 8/9 auf CIS Benchmark Level 1 - die Basis für jeden produktiven Server.
Basis-Härtung: Die ersten Schritte
Systemaktualisierung und Paketmanagement
# Ubuntu/Debian: Vollständiges Update
apt update && apt upgrade -y
apt autoremove -y
# RHEL/Rocky/AlmaLinux
dnf update -y
dnf autoremove -y
# Automatische Sicherheitsupdates konfigurieren
# Ubuntu:
apt install unattended-upgrades -y
dpkg-reconfigure --priority=low unattended-upgrades
# /etc/apt/apt.conf.d/50unattended-upgrades
# Nur Sicherheitsupdates automatisch:
cat >> /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Remove-Unused-Packages "true";
Unattended-Upgrade::Automatic-Reboot "false"; // Manueller Reboot nach Kernel-Updates
Unattended-Upgrade::Mail "security@firma.de";
EOF
# RHEL: dnf-automatic
dnf install dnf-automatic -y
sed -i 's/apply_updates = no/apply_updates = yes/' /etc/dnf/automatic.conf
sed -i 's/upgrade_type = default/upgrade_type = security/' /etc/dnf/automatic.conf
systemctl enable --now dnf-automatic.timer
Unnötige Dienste deaktivieren
# Alle laufenden Dienste anzeigen
systemctl list-units --type=service --state=active
# Typische Dienste die auf Produktionsservern nicht nötig sind:
DISABLE_SERVICES=(
"bluetooth"
"cups" # Druckdienst
"avahi-daemon" # mDNS/Bonjour
"rpcbind" # NFS (wenn nicht benötigt)
"postfix" # Mail (wenn kein lokaler MTA nötig)
"snapd" # Ubuntu: Snap (wenn nicht genutzt)
)
for service in "${DISABLE_SERVICES[@]}"; do
if systemctl is-enabled "$service" 2>/dev/null | grep -q "enabled"; then
systemctl disable --now "$service"
echo "Deaktiviert: $service"
fi
done
# Unnötige Pakete entfernen
apt purge --auto-remove telnet ftp rsh-client \
finger talk ntpdate xinetd nis yp-tools -y 2>/dev/null || true
# Sockets/Netzwerkdienste prüfen
ss -tlnp # Welche Dienste lauschen auf welchen Ports?
# Jeder Dienst der hier auftaucht muss begründet sein!
SSH-Härtung
# /etc/ssh/sshd_config - sichere Konfiguration
# Backup anlegen
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
cat > /etc/ssh/sshd_config.d/hardening.conf << 'EOF'
# Protokoll und Port
Port 22 # Empfehlung: abweichenden Port nutzen (Security through obscurity, hilft gegen Script-Kiddies)
Protocol 2 # Nur SSH v2!
# Authentifizierung
PermitRootLogin no # Root-Login VERBOTEN
PasswordAuthentication no # Nur SSH-Keys! (nach Key-Deployment)
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitEmptyPasswords no
ChallengeResponseAuthentication no
UsePAM yes
# Zugriffskontrolle
AllowUsers deploy monitoring # Nur spezifische User
# ODER: AllowGroups sshusers
MaxAuthTries 3 # Brute Force erschweren
MaxSessions 4 # Max. parallele Sessions
LoginGraceTime 30 # 30s für Login-Versuch
# Verbindungsmanagement
ClientAliveInterval 300 # 5 Min. Inaktivitäts-Timeout
ClientAliveCountMax 2 # 2 Wiederholungen → dann trennen
TCPKeepAlive no # OS-Level TCP-Keepalive ausschalten
# Features deaktivieren
X11Forwarding no # X11 Weiterleitung - unnötig
AllowAgentForwarding no # SSH Agent Forwarding
AllowTcpForwarding no # TCP Port Forwarding (wenn nicht gebraucht)
PermitTunnel no
GatewayPorts no
# Banner
Banner /etc/ssh/banner # Rechtlicher Hinweis
# Krypto (CIS Benchmark Level 2)
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
# Logging
SyslogFacility AUTH
LogLevel VERBOSE # Fingerprint loggen bei Key-Auth
EOF
# Banner erstellen
cat > /etc/ssh/banner << 'EOF'
*******************************************************************
* WARNUNG: Dieses System ist nur für autorisierte Benutzer! *
* Alle Aktivitäten werden überwacht und protokolliert. *
* Unbefugter Zugriff wird strafrechtlich verfolgt (§ 202a StGB) *
*******************************************************************
EOF
# SSH-Service neu starten
sshd -t # Konfiguration testen!
systemctl restart sshd
Kernel-Härtung (sysctl)
# /etc/sysctl.d/99-hardening.conf
cat > /etc/sysctl.d/99-hardening.conf << 'EOF'
# ===== Netzwerk-Härtung =====
# IP-Spoofing Schutz
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ICMP Redirects ablehnen (Man-in-the-Middle Prävention)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Source Routing deaktivieren
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# Kein IP-Forwarding (außer auf Routern/Firewalls)
net.ipv4.ip_forward = 0
net.ipv6.conf.all.forwarding = 0
# SYN-Flood Schutz
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 5
net.ipv4.tcp_synack_retries = 2
# ICMP Broadcast (Smurf Attack)
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# IPv6 deaktivieren (wenn nicht genutzt)
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# ===== Kernel-Härtung =====
# ASLR (Address Space Layout Randomization) - maximal
kernel.randomize_va_space = 2
# Kernel-Pointer in /proc ausblenden (Privilege Escalation erschweren)
kernel.kptr_restrict = 2
# dmesg einschränken (kein Kernel-Leak für normale User)
kernel.dmesg_restrict = 1
# /proc/sysrq-trigger deaktivieren
kernel.sysrq = 0
# Core Dumps deaktivieren (keine Passwörter in Core Files)
kernel.core_pattern = |/bin/false
fs.suid_dumpable = 0
# ptrace einschränken (Anti-Debugging)
kernel.yama.ptrace_scope = 1
# ===== Dateisystem =====
# Hardlinks: nur eigene (Symlink-Angriffe verhindern)
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
# FIFO / Regular Files schützen
fs.protected_fifos = 2
fs.protected_regular = 2
EOF
sysctl -p /etc/sysctl.d/99-hardening.conf
Audit-Logging mit auditd
# auditd installieren
apt install auditd audispd-plugins -y # Ubuntu
dnf install audit -y # RHEL
# /etc/audit/rules.d/hardening.rules
cat > /etc/audit/rules.d/99-hardening.rules << 'EOF'
# Audit-Log Buffer (groß genug für Spitzen)
-b 8192
# Löschungen aus dem Audit-Log sollen auffallen
-e 2 # Immutable Mode (Regeln können nur nach Reboot geändert werden)
# ===== Authentifizierung =====
-w /etc/passwd -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d -p wa -k sudoers
# sudo-Nutzung
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid!=unset -k privileged
# SSH-Konfiguration
-w /etc/ssh/sshd_config -p wa -k sshd_config
# ===== Systembefehle =====
# Privilege Escalation
-a always,exit -F path=/usr/bin/sudo -F perm=x -F auid>=1000 -F auid!=unset -k sudo_usage
-a always,exit -F path=/bin/su -F perm=x -F auid>=1000 -F auid!=unset -k su_usage
# Gefährliche Befehle
-a always,exit -F arch=b64 -S execve -F path=/bin/bash -k shell_access
-w /usr/bin/passwd -p x -k passwd_change
-w /usr/sbin/useradd -p x -k user_management
-w /usr/sbin/userdel -p x -k user_management
-w /usr/sbin/groupadd -p x -k group_management
# ===== Netzwerk =====
-a always,exit -F arch=b64 -S socket,connect,accept4 -k network_connection
# ===== Dateiintegrität =====
-w /etc/cron.d -p wa -k cron
-w /etc/crontab -p wa -k cron
-w /var/spool/cron -p wa -k cron
-w /etc/init.d -p wa -k init
-w /etc/systemd/system -p wa -k systemd_service
# Kernel-Module
-a always,exit -F arch=b64 -S init_module,delete_module -k kernel_modules
# Mount-Operationen
-a always,exit -F arch=b64 -S mount,umount2 -k mount
EOF
systemctl enable --now auditd
auditctl -l # Regeln prüfen
# Log-Abfrage Beispiele:
ausearch -k sudo_usage -ts today # Alle sudo-Nutzungen heute
ausearch -k identity -ts today # Änderungen an /etc/passwd etc.
aureport --summary # Zusammenfassung
AppArmor (Ubuntu) / SELinux (RHEL)
# ===== AppArmor (Ubuntu/Debian) =====
# Status prüfen
apparmor_status
# AppArmor aktivieren (falls nicht aktiv)
systemctl enable apparmor
systemctl start apparmor
# Profile auflisten
aa-status # Enforce vs. Complain Mode
# Neues Profil erstellen (Beispiel: Python-Webserver)
apt install apparmor-utils -y
# Complain Mode (Logging ohne Blockierung - für Profil-Entwicklung)
aa-genprof /usr/bin/python3
# Anwendung starten, alle nötigen Aktionen durchführen
# Dann: AppArmor-Profile verfeinern
# Bekannte Dienste in Enforce Mode setzen
aa-enforce /etc/apparmor.d/usr.sbin.nginx
aa-enforce /etc/apparmor.d/usr.lib.snapd.snap-confine.real
# ===== SELinux (RHEL/Rocky/AlmaLinux) =====
# Status prüfen
sestatus
# SELinux-Modus (in /etc/selinux/config):
# SELINUX=enforcing ← Produktion: immer Enforcing!
# SELINUX=permissive ← Nur für Debugging
# SELINUX=disabled ← NIEMALS in Produktion!
# AVC-Denials anzeigen (was wurde blockiert?)
ausearch -m AVC -ts today
audit2why -a # Warum wurde blockiert?
# Neue Regel aus AVC-Log generieren (Notfall-Workaround)
audit2allow -a -M mymodule
semodule -i mymodule.pp
# Nginx SELinux-Anpassungen
setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_connect_ldap on
semanage port -a -t http_port_t -p tcp 8080
Fail2ban - Brute Force Schutz
# Installation
apt install fail2ban -y
# /etc/fail2ban/jail.local
cat > /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime = 3600 # 1 Stunde gesperrt
findtime = 600 # Innerhalb 10 Minuten
maxretry = 3 # 3 Fehlversuche → Ban
banaction = iptables-multiport
# E-Mail bei Ban
destemail = security@firma.de
action = %(action_mwl)s # Ban + E-Mail + Whois + Log
[sshd]
enabled = true
port = 22
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 86400 # 24h für SSH
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 3
EOF
systemctl enable --now fail2ban
fail2ban-client status # Übersicht
fail2ban-client status sshd # SSH-Jail Status
Lynis - Compliance Check
# Lynis: Open-Source Security Auditing Tool
# Prüft System gegen CIS Benchmark, NIST, etc.
# Installation
apt install lynis -y
# ODER aktuellste Version:
git clone https://github.com/CISOfy/lynis
cd lynis
# System-Audit
lynis audit system --quick
# Ausgabe (Auszug):
# [+] System Tools
# [V] Hostname: server01
# [V] Loaded kernel modules: 42
#
# [WARNING] Found malware scanner: none
# [SUGGESTION] Consider running a malware scanner (lynis suggestion ID: MALW-3280)
#
# Hardening Index: 68 / 100
# Tests Performed: 256
# Plugins Enabled: 0
# Score-Interpretation:
# 0-49: Schlecht - kritische Maßnahmen erforderlich
# 50-69: Mittel - deutlicher Verbesserungsbedarf
# 70-84: Gut - kleinere Verbesserungen sinnvoll
# 85-100: Sehr gut - CIS Level 1/2 compliant
# Detailbericht
lynis audit system --report-file /var/log/lynis-report.dat
lynis show details <TEST-ID>
# Regelmäßiger Scan via Cron:
echo "0 3 * * 0 root /usr/bin/lynis audit system --cronjob | mail -s 'Lynis Report' security@firma.de" > /etc/cron.d/lynis
UFW Firewall (Ubuntu)
# UFW - Uncomplicated Firewall (einfach, aber für die meisten Server ausreichend)
ufw default deny incoming # Standard: alles eingehend blockieren
ufw default allow outgoing # Standard: alles ausgehend erlauben
# SSH erlauben (VOR dem Aktivieren!)
ufw allow from 10.0.0.0/8 to any port 22 # Nur aus internem Netz
# ODER:
ufw allow 22/tcp
# Webserver
ufw allow 80/tcp
ufw allow 443/tcp
# Spezifische Dienste
ufw allow from 192.168.1.0/24 to any port 5432 # PostgreSQL nur intern
ufw allow from 10.0.0.5 to any port 3306 # MySQL nur von bestimmtem Server
# UFW aktivieren
ufw enable
ufw status verbose
# Logging aktivieren
ufw logging on
# Logs in /var/log/ufw.log
Checkliste: Härtungs-Abnahme
Basis:
□ Alle Pakete aktuell (apt upgrade / dnf update)
□ Automatische Sicherheitsupdates aktiv
□ Nicht benötigte Dienste deaktiviert
□ Keine veralteten Protokolle (Telnet, FTP, rsh)
SSH:
□ Root-Login deaktiviert (PermitRootLogin no)
□ Passwort-Auth deaktiviert (PasswordAuthentication no)
□ SSH-Key Authentifizierung aktiv
□ Login-Banner konfiguriert
□ Nur erlaubte Benutzer (AllowUsers)
Kernel:
□ ASLR aktiviert (randomize_va_space = 2)
□ IP-Spoofing Schutz (rp_filter = 1)
□ ICMP-Redirects deaktiviert
□ Keine IP-Forwarding (wenn kein Router)
□ Kernel-Pointer versteckt (kptr_restrict = 2)
Logging & Monitoring:
□ auditd läuft, Regeln geladen
□ Audit-Log für Auth, sudo, Dateiänderungen
□ Fail2ban für SSH konfiguriert
□ Log-Rotation konfiguriert
Access Control:
□ AppArmor (Enforce) / SELinux (Enforcing) aktiv
□ sudo nur für berechtigte User (visudo)
□ SUID/SGID-Dateien minimal (find / -perm -4000)
□ World-writable Verzeichnisse überprüft
Lynis-Score:
□ Lynis Hardening Index ≥ 75
□ Kritische Findings behoben
□ Report dokumentiert und abgelegt Fragen zu diesem Thema?
Unsere Experten beraten Sie kostenlos und unverbindlich.
Über den Autor
Geschäftsführender Gesellschafter der AWARE7 GmbH mit langjähriger Expertise in Informationssicherheit, Penetrationstesting und IT-Risikomanagement. Absolvent des Masterstudiengangs Internet-Sicherheit an der Westfälischen Hochschule (if(is), Prof. Norbert Pohlmann). Bestseller-Autor im Wiley-VCH Verlag und Lehrbeauftragter der ASW-Akademie. Einschätzungen zu Cybersecurity und digitaler Souveränität erschienen u.a. in Welt am Sonntag, WDR, Deutschlandfunk und Handelsblatt.
10 Publikationen
- Einsatz von elektronischer Verschlüsselung - Hemmnisse für die Wirtschaft (2018)
- Kompass IT-Verschlüsselung - Orientierungshilfen für KMU (2018)
- IT Security Day 2025 - Live Hacking: KI in der Cybersicherheit (2025)
- Live Hacking - Credential Stuffing: Finanzrisiken jenseits Ransomware (2025)
- Keynote: Live Hacking Show - Ein Blick in die Welt der Cyberkriminalität (2025)
- Analyse von Angriffsflächen bei Shared-Hosting-Anbietern (2024)
- Gänsehaut garantiert: Die schaurigsten Funde aus dem Leben eines Pentesters (2022)
- IT Security Zertifizierungen — CISSP, T.I.S.P. & Co (Live-Webinar) (2023)
- Sicherheitsforum Online-Banking — Live Hacking (2021)
- Nipster im Netz und das Ende der Kreidezeit (2017)