Zum Inhalt springen

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

↑↓NavigierenEnterÖffnenESCSchließen

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, kein IP-Forwarding (wenn kein Router), Kernel-Pointer versteckt (kptr_restrict = 2).

Logging & Monitoring: auditd läuft mit geladenen Regeln, Audit-Log für Auth, sudo und 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.

Erstberatung

Über den Autor

Chris Wojzechowski
Chris Wojzechowski

Geschäftsführender Gesellschafter

E-Mail

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)
IT-Grundschutz-Praktiker (TÜV) IT Risk Manager (DGI) § 8a BSIG Prüfverfahrenskompetenz Ausbilderprüfung (IHK)
Dieser Artikel wurde zuletzt am 04.03.2026 bearbeitet. Verantwortlich: Chris Wojzechowski, Geschäftsführender Gesellschafter bei AWARE7 GmbH. Lizenz: CC BY 4.0 - freie Nutzung mit Namensnennung: „AWARE7 GmbH, https://a7.de