Die Sicherheit eines Servers, der für Applikationen wie OpenClaw vorgesehen ist, basiert nicht allein auf der Software selbst, sondern maßgeblich auf der Härtung des zugrundeliegenden Betriebssystems. Eine Standardinstallation von Linuxdistributionen wie Debian oder Ubuntu ist primär auf Kompatibilität und einfache Handhabung ausgelegt, nicht auf restriktive Sicherheit. Dies resultiert initial in einer unnötig großen Angriffsfläche.
Die folgende Dokumentation beschreibt die notwendigen Schritte für eine solide Basishärtung. Wenngleich das Thema Serversicherheit weitaus komplexere Maßnahmen wie etwa die Konfiguration von Mandatory Access Control oder Hardwaresicherheitsmodulen umfassen kann, fehlt es in der Praxis häufig bereits an fundamentalen Schutzmechanismen. Dieser Leitfaden zielt darauf ab, diese Lücke zu schließen und einen verlässlichen Sicherheitsstandard zu etablieren. Ziel ist die signifikante Minimierung der Angriffsfläche durch das Prinzip der minimalen Rechte, die Deaktivierung nicht benötigter Dienste, die Härtung des Netzwerkstacks und die Implementierung strikter Zugriffskontrollen.
1. Initiale Verbindung und Systemaktualisierung
Der erste Zugriff auf das System erfolgt in der Regel über den Standard-SSH-Port (22) mit dem Root-Benutzer. Unmittelbar nach der Übernahme des Systems ist eine vollständige Aktualisierung der Paketquellen und der installierten Software notwendig, um bekannte Sicherheitslücken zu schließen und einen konsistenten Systemzustand herzustellen.
Verbindungsaufbau (Client-seitig)
ssh -p 22 root@52.213.101.188
Systemaktualisierung
Der Befehl sudo apt update aktualisiert die lokale Datenbank über verfügbare Softwarepakete und deren Versionen. Dies ist die Voraussetzung, damit das System überhaupt von Sicherheitsflicken erfährt. Das Kommando sudo apt full-upgrade -y führt die eigentliche Aktualisierung aller installierten Pakete auf die neuesten Versionen durch. Im Gegensatz zu einem einfachen Upgrade löst full-upgrade auch komplexe Abhängigkeitsänderungen auf, indem es bei Bedarf neue Pakete installiert oder veraltete entfernt.
Mit sudo apt autoremove –purge werden Pakete gelöscht, die ursprünglich als Abhängigkeit für andere Software installiert wurden, aber nun nicht mehr benötigt werden. Der Zusatz –purge entfernt zusätzlich sämtliche zugehörigen Konfigurationsdateien. Dies minimiert die Angriffsfläche des Systems, da nicht benötigte Software und potenziell unsichere Konfigurationsreste restlos vom Datenträger verschwinden.
sudo apt update && apt full-upgrade -y
sudo apt autoremove --purge
sudo reboot
Konfiguration automatischer Sicherheitsupdates
Durch die Aktivierung von unattended-upgrades wird das System so eingestellt, dass es kritische Sicherheitsflicken im Hintergrund ohne manuelles Eingreifen herunterlädt und installiert. Für die Systemhärtung ist dies unerlässlich, da die Zeitspanne zwischen dem Bekanntwerden einer Sicherheitslücke und deren Schließung auf ein Minimum reduziert wird. Ein System bleibt so auch dann geschützt, wenn der Administrator nicht unmittelbar manuell eingreifen kann.
Zudem stellt das Tool sicher, dass nur Updates aus vertrauenswürdigen Sicherheitsquellen bezogen werden, was die Integrität der installierten Software wahrt. Ohne diese Automatisierung riskierst du, dass dein System aufgrund vergessener Wartungsintervalle über Tage oder Wochen hinweg für bekannte Exploits anfällig bleibt.
dpkg-reconfigure -plow unattended-upgrades
Die Datei /etc/apt/apt.conf.d/20auto-upgrades steuert die Automatisierung von Wartungsaufgaben für die Paketverwaltung und ist ein zentraler Baustein für die Systemhärtung durch zeitnahe Patches.
vi /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
- APT::Periodic::Update-Package-Lists “1”; veranlasst das System dazu, täglich die lokalen Listen der verfügbaren Softwarepakete mit den Repositories abzugleichen. Ohne diese Information kann das System keine neuen Sicherheitsupdates finden oder herunterladen.
- APT::Periodic::Unattended-Upgrade “1”; aktiviert die tägliche automatische Installation von Sicherheitsaktualisierungen ohne Benutzerinteraktion. Dies ist für die Sicherheit essenziell, da die Zeitspanne zwischen dem Bekanntwerden einer Schwachstelle und deren Behebung (Time-to-Patch) drastisch verkürzt wird.
- APT::Periodic::AutocleanInterval “7”; sorgt dafür, dass alle sieben Tage der lokale Cache von veralteten Paketdateien bereinigt wird, die nicht mehr heruntergeladen werden können. Das hält das System schlank und entfernt unnötigen Datenballast von der Festplatte.
Der nächste Befehl beendet die Zeitgeber für die Paketaktualisierung sowie für die Sicherheitsupgrades und startet sie unmittelbar neu damit geänderte Einstellungen ohne Verzögerung wirksam werden. Diese sofortige Übernahme ist für die Systemhärtung entscheidend da sie die lückenlose Automatisierung von Sicherheitsreparaturen sicherstellt und das Zeitfenster für Angriffe minimiert.
sudo systemctl restart apt-daily.timer apt-daily-upgrade.timer
Zusätzlich wird definiert, dass das System bei Bedarf (z. B. nach Kernel-Updates) automatisch neu startet. Um die Verfügbarkeit zu steuern, wird dieser Neustart auf ein Wartungsfenster (04:00 Uhr morgens) gelegt.
Die Datei 50unattended-upgrades regelt automatisierte Sicherheitsupdates. Die Zahl fünfzig bestimmt die Ladereihenfolge im Konfigurationsverzeichnis während der Name die unbeaufsichtigte Funktion beschreibt.
vi /etc/apt/apt.conf.d/50unattended-upgrades
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
2. Benutzerverwaltung und Editor-Konfiguration
Die Deaktivierung des direkten Logins für root ist eine wesentliche Sicherheitsmaßnahme da dieses Konto das Hauptziel für Angriffe darstellt. Vor der Deaktivierung muss zwingend ein neuer Benutzer wie z.B. aaron erstellt werden um den Systemzugriff zu garantieren. Der Befehl adduser legt das Konto an während usermod den Benutzer einer Gruppe mit erweiterten Rechten zuweist. Erst wenn die Anmeldung des neuen Nutzers und die Verwendung von vi erfolgreich geprüft wurden wird der direkte Zugang für root in der SSH Konfiguration gesperrt.
sudo adduser aaron
sudo usermod -aG sudo aaron
# OpenClaw Benutzer ohne root Rechte
sudo adduser openclaw
Nach der Erstellung erfolgt ein Test des Benutzerwechsels, um die Funktionalität zu verifizieren:
su - aaron
sudo -s
su - openclaw
Test der neuen Benutzeranmeldung:
ssh -p 22 aaron@52.213.101.188
sudo -s
Härtung des SSH-Dienstes
Der SSH-Dienst ist der primäre Zugangspunkt für die Verwaltung. In diesem Schritt wird der Dienst vollständig abgesichert: Der Port wird geändert, der Root-Login verboten und Tunneling-Optionen werden deaktiviert.
Anpassung der Konfigurationsdatei
Die Datei /etc/ssh/sshd_config definiert die globalen Sicherheitsregeln für den SSH Daemon und muss mit administrativen Rechten als root bearbeitet werden.
sudo vi /etc/ssh/sshd_config
Folgende Werte werden angepasst oder hinzugefügt:
# Port auf einen High-Port ändern (Security through Obscurity)
# Die Verlegung des Dienstes auf Port 40000 bietet keine echte Sicherheit gegen gezielte Angriffe da automatisierte Werkzeuge den offenen Dienst schnell finden können. Diese Maßnahme dient primär der Reduzierung des Grundrauschens in den Protokolldateien da die meisten einfachen Skripte nur Standardports abfragen. Durch die geringere Anzahl an automatisierten Anmeldeversuchen bleiben die Systemprotokolle deutlich übersichtlicher was die Analyse echter Sicherheitsvorfälle erleichtert.
Port 40000
# Mit PermitRootLogin no wird der direkte Zugang für das root Konto vollständig unterbunden was eine Anmeldung über einen normalen Benutzer z.B. aaron erzwingt.
PermitRootLogin no
# Die Anweisung AllowUsers aaron erstellt eine Whitelist die den Zugriff exklusiv auf diesen einen Namen einschränkt.
AllowUsers aaron
# Brute-Force-Schutz härten
# MaxAuthTries 3 begrenzt die erlaubten Fehlversuche bei der Passworteingabe pro Verbindung während MaxSessions 2 die Anzahl der parallelen Sitzungen limitiert.
MaxAuthTries 3
MaxSessions 2
# ClientAliveCountMax 2 legt die maximale Anzahl an Prüfsignalen fest die der Server ohne Rückmeldung an den fernen Teilnehmer sendet bevor die Verbindung automatisch beendet wird. Dieser Wert arbeitet zusammen mit dem Zeitabstand für solche Abfragen. Wenn auf eine gesendete Abfrage keine Antwort erfolgt wird ein interner Zähler erhöht. Erreicht dieser Zähler den Wert 2 wird die Sitzung sofort getrennt. Das dient dazu das System vor verwaisten Verbindungen zu schützen die keine Aktivität mehr aufweisen aber dennoch Ressourcen verbrauchen oder ein Sicherheitsrisiko darstellen könnten. Durch diese Einstellung wird sichergestellt dass blockierte oder vergessene Sitzungen nicht dauerhaft bestehen bleiben.
ClientAliveCountMax 2
# Diese Parameter deaktivieren Funktionen für Datentunnel oder grafische Oberflächen um die Angriffsfläche des Systems zu minimieren.
TCPKeepAlive no
AllowTcpForwarding no
X11Forwarding no
# Logging erhöhen
LogLevel VERBOSE
Der SSH-Zugang sollte nach der Basiskonfiguration vollständig auf Public-Key-Authentifizierung umgestellt. Hierzu werden folgende Parameter aktiviert. Diese Konfiguration unterbindet jede Form von Passwort-basiertem Login und reduziert die Angriffsfläche auf kryptografisch abgesicherte Schlüssel.
PasswordAuthentication no
ChallengeResponseAuthentication no
Anpassung des Systemd-Sockets
Da wir den SSH-Port manuell auf 40000 umgestellt haben muss auch der Socket Port in der Konfiguration von systemd angepasst werden da dieser als primärer Empfangspunkt für den Netzwerkverkehr dient. Wenn der Socket nicht auf Port 40000 umgestellt wird erkennt das System die eingehenden Anfragen nicht als SSH Verkehr an und blockiert den Zugriff obwohl der Dienst selbst bereits korrekt konfiguriert ist.
sudo EDITOR=vi systemctl edit ssh.socket
# Die leere ListenStream= Direktive ist notwendig, um die Standardkonfiguration zu löschen.
# Die leere Zuweisung ListenStream= fungiert in diesem Kontext als Reset-Befehl. Ohne diese Zeile würde der SSH-Socket weiterhin auf dem Standardport 22 lauschen und den Port 40000 lediglich als zusätzliche Option hinzufügen.
[Socket]
ListenStream=
ListenStream=40000
Neustart der Dienste
Die Konfiguration wird geprüft und die Dienste werden neu gestartet.
# Die Überprüfung der Konfiguration mit dem Testbefehl stellt sicher dass keine Syntaxfehler vorliegen die den Dienst am Starten hindern könnten.
sshd -t
# Danach wird die Systemverwaltung angewiesen die Konfigurationseinheiten neu einzulesen damit die manuellen Änderungen am Socket vom System erkannt werden.
systemctl daemon-reload
# Der Neustart des Sockets aktiviert die Überwachung von Port 40000 für eingehende Anfragen während der Neustart des Dienstes die gesamte Umstellung finalisiert.
systemctl restart ssh.socket
systemctl restart ssh.service
Verifikation
Der Zugriff erfolgt nun über den neuen Port und Benutzer:
ssh -p 40000 aaron@52.213.101.188
zurvor hatten wir:
ssh -p 22 root@52.213.101.188
4. Firewall-Konfiguration (UFW)
Eine Firewall dient als digitaler Schutzwall der sämtliche Datenpakete nach strengen Regeln filtert und unbefugte Zugriffsversuche abwehrt. Durch die Anwendung einer Whitelist Strategie wird sichergestellt dass nur explizit freigegebene Dienste kommunizieren können während alle anderen Ports unsichtbar bleiben. Die Firewall reglementiert den Datenverkehr und wendet das Prinzip Default Deny an. Wichtig ist hierbei den neuen SSH Port 40000 freizugeben bevor die Firewall aktiviert wird da ansonsten der administrative Fernzugriff sofort gesperrt wird. Erst nach der Verifizierung aller Regeln darf der Schutz aktiv geschaltet werden um ein Aussperren aus dem System zu verhindern.
# Standard-Richtlinien setzen
ufw default deny outgoing
ufw default deny incoming
# SSH auf neuem Port erlauben
ufw allow in 40000/tcp
ufw allow out 40000/tcp
# Webserver-Traffic erlauben
ufw allow in 80/tcp
ufw allow out 80/tcp
ufw allow in 443/tcp
ufw allow out 443/tcp
# DNS und NTP ausgehend erlauben
ufw allow out 53/udp
ufw allow out 53/tcp
ufw allow out 123/udp
Aktivierung und Prüfung der Regeln:
# Listet alle Regeln auf die dem System bereits hinzugefügt wurden selbst wenn diese im aktuellen Moment noch nicht aktiv geschaltet sind.
sudo ufw show added
# Filterdienst wird gestartet und der Schutzmechanismus fest im Betriebssystem verankert damit er bei jedem zukünftigen Systemstart automatisch geladen wird.
sudo ufw enable
# Gibt eine Übersicht aller derzeit aktiven Regeln aus und versieht jede einzelne Zeile mit einer fortlaufenden Nummer was die gezielte Bearbeitung oder das Löschen einzelner Einträge erheblich vereinfacht.
sudo ufw status numbered
# Durch ufw reload wird das gesamte Regelwerk neu eingelesen um aktuelle Änderungen sofort wirksam zu machen ohne dabei laufende Netzwerkverbindungen zu unterbrechen.
sudo ufw reload
# Liefert einen umfassenden Bericht über den gesamten Betriebszustand inklusive der grundlegenden Sicherheitsvorgaben für den ein und ausgehenden Datenverkehr sowie der aktuell eingestellten Protokollierungstiefe.
ufw status verbose
5. Intrusion Prevention mit Fail2Ban
Fail2Ban fungiert als ein automatisierter Schutzmechanismus der die Systemprotokolle kontinuierlich nach Anzeichen für Brute Force Angriffe oder andere bösartige Verhaltensmuster scannt. Durch die sofortige Sperrung der IP Adressen von Angreifern wird die Angriffsfläche des Servers drastisch minimiert und die Systemstabilität gegenüber automatisierten Botnetzen gewahrt. Dieser Dienst ist unverzichtbar um unermüdliche Versuche von Passwort Knackern im Keim zu ersticken bevor diese nennenswerten Schaden anrichten oder die Ressourcen des Systems überlasten können. Da der Dienst direkt in die Firewall eingreift stellt er sicher dass erkannte Bedrohungen sofort vom weiteren Zugriff ausgeschlossen werden ohne das System manuell überwachen zu müssen.
Installation
sudo apt install fail2ban -y
Konfiguration
Erstellung einer lokalen Konfigurationsdatei jail.local. Die Datei jail.local ist eine Kopie für eigene Regeln damit die persönlichen Einstellungen bei einem Update nicht gelöscht werden.
sudo vi /etc/fail2ban/jail.local
[DEFAULT]
# Die Zeile bantime 24h legt fest dass eine blockierte IP Adresse für genau eine 24h Stunden keine Verbindung zum Server herstellen darf.
bantime = 24h
# Der Parameter findtime = 100m definiert das Zeitfenster, innerhalb dessen die Fehlversuche gezählt werden. Fail2Ban betrachtet dabei immer ein gleitendes Fenster der letzten 10 Minuten ab dem aktuellsten Ereignis.
findtime = 100m
# Nur wenn die Anzahl der Fehlversuche (maxretry) innerhalb dieses spezifischen Zeitraums erreicht wird, wird die IP-Adresse gesperrt.
maxretry = 3
[sshd]
# Aktiviert den Schutz
enabled = true
# Definiert den Port auf dem der Dienst lauscht (muss mit sshd_config übereinstimmen)
port = 40000
# Verweist auf die Filterdatei mit den Suchmustern für SSH Angriffe
filter = sshd
# Pfad zur Protokolldatei in der Anmeldeversuche aufgezeichnet werden
logpath = /var/log/auth.log
# Nutzt das moderne Systemprotokoll zum effizienten Auslesen der Daten
backend = systemd
Dienst aktivieren und Status prüfen
# Sorgt dafür dass der Dienst bei jedem Bootvorgang automatisch startet damit der Schutz ohne manuelle Eingriffe immer aktiv bleibt.
sudo systemctl enable fail2ban
# Neustart, um alle Änderungen an der Konfiguration wie den neuen Port 40000 oder die Sperrdauer in das laufende System zu übernehmen.
sudo systemctl restart fail2ban
# Zeigt den aktuellen Zustand des Filters sowie eine Liste aller momentan blockierten Teilnehmer und die Anzahl der registrierten Angriffsversuche an.
sudo fail2ban-client status sshd
6. Kernel- und System-Härtung
Der Kernel stellt das Herzstück des Betriebssystems dar und übernimmt die vollständige Kontrolle über die Kommunikation zwischen der Hardware und den laufenden Anwendungen. Er verwaltet den Zugriff auf den Prozessor sowie den Arbeitsspeicher und teilt jedem Prozess die benötigten Ressourcen zu damit das System stabil bleibt. Durch seine Position als Vermittler sorgt er dafür dass Softwarebefehle in physische Aktionen der Hardware umgesetzt werden ohne dass Programme direkt auf die empfindlichen Komponenten zugreifen müssen. Er ist somit für die Sicherheit und die Koordination aller Abläufe innerhalb deiner Maschine verantwortlich.
In diesem Abschnitt werden Kernel-Parameter angepasst, Dateiberechtigungen verschärft und Rootkit-Scanner installiert.
Kernel-Parameter (Sysctl)
Kernel Parameter auch als Sysctl bekannt sind Stellschrauben im laufenden Betriebssystem die das Verhalten des Kernels steuern und direkt beeinflussen können. Über diese Variablen lassen sich tiefgreifende Sicherheitsfunktionen aktivieren oder Netzwerkprotokolle anpassen ohne dass das System neu gestartet werden muss.
Installation notwendiger Tools:
sudo apt update && apt install auditd debsums apt-listchanges libpam-tmpdir -y
- Das Werkzeug auditd übernimmt dabei die Aufgabe alle sicherheitsrelevanten Ereignisse im System lückenlos zu protokollieren und für spätere Analysen festzuhalten.
- Mit debsums wird die Unversehrtheit der installierten Softwarepakete überprüft indem jede einzelne Datei mit ihrem ursprünglichen Fingerabdruck verglichen wird um Manipulationen aufzudecken.
- Die Komponente apt-listchanges zeigt vor einer Aktualisierung eine Liste aller Neuerungen und Fehlerkorrekturen an damit Änderungen am System besser nachvollziehbar bleiben.
- libpam-tmpdir sorgt dafür, dass jeder Benutzer ein eigenes privates Verzeichnis für temporäre Dateien erhält was den unbefugten Zugriff durch andere Konten auf sensible Zwischendaten verhindert.
Erstellung der Härtungs-Konfigurationen
In dieser Datei werden dauerhafte Einstellungen für die Sicherheit des Kernels hinterlegt die bei jedem Systemstart automatisch geladen werden um die Angriffsfläche der Maschine effektiv zu verringern.
sudo vi /etc/sysctl.d/99-hardening.conf
# Keine Speicherabbilder für Dienste: Ein Absturz von SSH hinterlässt kein Passwort im Speicherprotokoll.
fs.suid_dumpable = 0
# Versteckt Kerneladressen: Ein Angreifer sieht nicht wo genau im Speicher eine Funktion liegt die er ausnutzen will.
kernel.kptr_restrict = 2
# Härtet den Programmübersetzer: Schadcode kann nicht über den Netzwerkfilter in den Kernel eingeschleust werden.
net.core.bpf_jit_harden = 2
# Sperrt BPF für normale Nutzer: Ein einfacher Benutzer kann keine fremden Datenpakete auf dem Server mitlesen.
kernel.unprivileged_bpf_disabled = 1
# Protokolliert ungültige Pakete: Ein Paket von einer internen Adresse das von außen kommt wird als Bedrohung gemeldet.
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
# Verbietet Umleitungen: Ein fremder Rechner kann deinen Server nicht anweisen Daten über einen unsicheren Umweg zu schicken.
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Keine Routenvorgabe durch Pakete: Ein Paket kann nicht selbst bestimmen welchen Weg es durch das Netz nimmt um Filter zu umgehen.
net.ipv4.conf.default.accept_source_route = 0
Installation von Lynis
Lynis stellt ein spezialisiertes Werkzeug zur Durchführung von Sicherheitsüberprüfungen auf Unix basierten Systemen dar. Die Installation erfolgt um die Sicherheit des Servers objektiv zu bewerten und durch gezielte Optimierungen einen Härtungswert von etwa 80 zu erreichen. Dieser hohe Wert dient mir als Maßstab für eine professionell abgesicherte Umgebung die gegen eine Vielzahl von digitalen Bedrohungen bestens geschützt ist.
# Installation
sudo apt install lynis
# Audit starten
sudo lynis audit system
Zur weiteren Erhöhung der Systemsicherheit wird im nächsten Schritt eine zusätzliche Konfigurationsdatei für Kernel-Parameter angelegt. Diese Einstellungen basieren auf den Empfehlungen des Lynis-Audits und zielen darauf ab, potenzielle Angriffsflächen auf Kernel-Ebene zu minimieren.
sudo vi /etc/sysctl.d/99-lynis-hardening.conf
# Diese Einstellung sorgt dafür, dass die Prozess-ID (PID) an den Namen der Core-Dumps angehängt wird. Dies erleichtert die Zuordnung von Fehlern und verhindert das einfache Überschreiben älterer Berichte.
kernel.core_uses_pid = 1
# Hiermit wird der „Reverse Path Filter“ aktiviert. Das System prüft dabei, ob eingehende Pakete über die plausible Schnittstelle ankommen, über die auch die Antwort gesendet würde. Dies ist ein wichtiger Schutz gegen IP-Spoofing.
net.ipv4.conf.all.rp_filter = 1
# Diese Zeile wendet die Filterregel für den Rückpfad als Standardwert auf alle Netzwerkschnittstellen des Systems an.
net.ipv4.conf.default.rp_filter = 1
# Diese Option deaktiviert die sogenannten „Magic SysRq“-Tastenkombinationen. Damit wird verhindert, dass Personen mit physischem Zugriff auf den Server kritische Befehle direkt über die Tastatur auslösen können.
kernel.sysrq = 0
Konfigurationsdateien werden eingelesen und die darin definierten Parameter ohne einen Systemneustart sofort als aktive Regeln in den laufenden Kernel übernommen.
sudo sysctl -p /etc/sysctl.d/99-hardening.conf
sudo sysctl -p /etc/sysctl.d/99-lynis-hardening.conf
Dateiberechtigungen und Dienst-Bereinigung
Die Gefahr bei automatisierten Zeitplänen besteht in der möglichen Einschleusung von Befehlen die dann mit weitreichenden Befugnissen im Hintergrund laufen. Mit den nächsten Schritten werden sensible Verzeichnisse sowie die Konfiguration des Fernzugriffs so abgeschirmt dass ausschließlich ein privilegierter Nutzer Zugriff erhält.
Die Vergabe der Berechtigung 600 an der zentralen Datei für die Aufgabenplanung stellt sicher dass ausschließlich der Systemverwalter (root) die Inhalte lesen sowie bearbeiten kann während der einfache Benutzer (z.B. aaron) vollständig vom Zugriff ausgeschlossen bleibt. Der Wert 700 für die entsprechenden Verzeichnisse legt zudem fest dass nur die administrative Ebene neue Einträge hinterlegen oder Skripte ausführen darf. Diese strikte Trennung sorgt dafür dass einfache Nutzerkonten ohne ausdrückliche Erlaubnis keine Hintergrunddienste starten oder systemweite Abläufe manipulieren können.
# Cron und Systemdateien schützen
sudo chmod 600 /etc/crontab
sudo chmod 700 /etc/cron.d
sudo chmod 700 /etc/cron.daily
sudo chmod 700 /etc/cron.hourly
sudo chmod 700 /etc/cron.weekly
sudo chmod 700 /etc/cron.monthly
sudo chmod 600 /etc/at.deny
sudo chmod 600 /etc/ssh/sshd_config
# Die Einschränkung von Werkzeugen zur Programmerstellung wie Compilern erschwert es Angreifern erheblich eigene Schadsoftware direkt auf dem Zielsystem zu bauen und auszuführen.
sudo chmod 700 /usr/bin/gcc
sudo chmod 700 /usr/bin/make
# Das restlose Entfernen veralteter Dienste wie Telnet beseitigt zudem bekannte Sicherheitslücken die durch eine unverschlüsselte Übertragung von Daten entstehen würden.
sudo apt purge rsh-client rsh-redone-client telnet -y
Systembanner und rechtliche Absicherung
Individuelle Systembanner minimieren das Risiko der Informationspreisgabe über interne Systemeigenschaften und entziehen potenziellen Angreifern somit wertvolle Anhaltspunkte für gezielte Attacken. Diese expliziten Warnhinweise bilden zudem das rechtliche Fundament für eine spätere Strafverfolgung da sie unmissverständlich klarstellen dass der Zugriff nur befugten Personen gestattet ist. Durch den Verweis auf eine aktive Überwachung aller Aktivitäten wird eine abschreckende Wirkung erzielt die unautorisierte Nutzer bereits beim Verbindungsaufbau vor den Konsequenzen ihres Handelns warnt.
# Zeigt den Warntext bei einer lokalen Anmeldung direkt an der Konsole an
sudo vi /etc/issue
# Stellt den Rechtstext für Anmeldeversuche über das Netzwerk bereit
sudo vi /etc/issue.net
Durch das Entfernen der standardmäßigen Begrüßungstexte wird verhindert dass Informationen wie der Name der Distribution oder die aktuelle Version des Kernels nach außen dringen.
*****************************************************************************
AUTHORIZED USERS ONLY.
This system is restricted to authorized users for business purposes only.
All activities on this system are logged and monitored. Unauthorized
access or use is strictly prohibited and may be subject to criminal
and/or civil penalties. By continuing, you consent to these terms.
*****************************************************************************
Postfix Härtung
Viele gängige Distributionen wie Debian oder Ubuntu installieren oft bereits während der Grundkonfiguration einen sogenannten Mail Transfer Agent. Dies geschieht vor allem deshalb damit das System in der Lage ist interne Statusmeldungen oder Warnungen von Hintergrunddiensten an die lokale Verwaltung zu schicken.
Falls Postfix installiert ist, werden Informationen verschleiert.
sudo postconf -e "smtpd_banner = \$myhostname ESMTP"
sudo postconf -e "disable_vrfy_command = yes"
sudo systemctl restart postfix
7. Rootkit Hunter (rkhunter) verwenden
Rootkit Hunter stellt ein spezialisiertes Diagnosewerkzeug dar das die gesamte Softwareumgebung auf versteckte Schadprogramme sowie Hintertüren hin überprüft. Durch den Vergleich der digitalen Fingerabdrücke von Systemdateien mit einer sicheren Referenzdatenbank lassen sich verdächtige Änderungen an der Integrität des Betriebssystems sofort aufspüren. Die regelmäßige Durchführung dieser Überprüfungen bildet eine wesentliche Säule bei der Erkennung von fortgeschrittenen Angriffsmethoden die sich tiefer im System einnisten könnten.
Installation
sudo apt install rkhunter -y
Konfiguration
# Diese Einstellung sorgt für die tägliche und selbstständige Durchführung einer vollständigen Systemüberprüfung im Hintergrund. Damit wird sichergestellt dass potenzielle Manipulationen an Dateien zeitnah erkannt werden ohne dass ein manueller Start durch einen privilegierten Nutzer erforderlich ist.
CRON_DAILY_RUN="true"
# Mit dieser Option wird die regelmäßige Aktualisierung der internen Datenbank für Dateieigenschaften und Signaturen aktiviert. Dies ist entscheidend um die Erkennungsrate gegen neue Bedrohungen hoch zu halten da veraltete Informationen die Schutzwirkung des Programms erheblich mindern würden.
CRON_DB_UPDATE="true"
# Diese Zeile bewirkt die automatische Erneuerung der Dateireferenzen sobald Software über die Paketverwaltung des Systems installiert oder aktualisiert wird. Durch diesen Abgleich werden Fehlalarme vermieden die sonst entstehen würden wenn rechtmäßige Programmänderungen als unbefugte Eingriffe missverstanden werden.
APT_AUTOGEN="true"
Systemcheck manuell durchführen:
# Dieser Befehl dient der Aktualisierung der internen Datenbanken des Programms. Er lädt die neuesten Signaturen und Informationen über bekannte Rootkits, Backdoors und andere bösartige Software von den offiziellen Servern herunter, um die Erkennungsrate des Systems auf dem aktuellen Stand zu halten.
sudo rkhunter --update
# Mit dieser Anweisung wird ein sogenanntes „Property Update“ durchgeführt. Das Programm analysiert die aktuellen Dateieigenschaften (wie etwa Dateigröße oder Hash-Werte) der wichtigen Systemdateien und speichert diese als vertrauenswürdige Basislinie in einer Datenbank. Dies ist notwendig, damit das Tool bei künftigen Prüfungen feststellen kann, ob Dateien unbefugt verändert wurden. Dieser Schritt sollte immer nach einer gewollten Systemaktualisierung oder Softwareinstallation ausgeführt werden, um Fehlalarme zu vermeiden.
sudo rkhunter --propupd
# Dies ist der eigentliche Prüfbefehl, der den Scanvorgang startet. Das Werkzeug vergleicht die laufenden Prozesse und Dateien des Systems mit der zuvor erstellten Datenbank sowie den aktuellen Signaturen. Dabei wird nach verdächtigen Verzeichnissen, versteckten Dateien und bekannten Anzeichen für eine Kompromittierung des Kernels oder der Systemanwendungen gesucht.
sudo rkhunter --check
8. Audit Framework
Das Linux Audit Framework ist ein leistungsstarkes Werkzeug zur Systemüberwachung das ursprünglich von Red Hat entwickelt wurde und heute als fester Bestandteil des Kernels in fast allen Distributionen enthalten ist. Die Nutzung ist deshalb so wichtig weil es eine lückenlose und revisionssichere Protokollierung aller sicherheitsrelevanten Vorgänge ermöglicht die weit über normale Protokolldateien hinausgeht. Es dient der Einhaltung von strengen Richtlinien zur Datensicherheit und erlaubt im Falle eines Vorfalls eine präzise forensische Analyse jeder einzelnen Aktion auf dem System. Durch die tiefe Verankerung direkt im Betriebssystemkern können selbst Prozesse mit hohen Rechten lückenlos überwacht werden was die Transparenz und Sicherheit der gesamten Umgebung massiv erhöht.
Installation
sudo apt install auditd audispd-plugins
Diese Datei fungiert als zentrale Instanz für die Definition von Überwachungsregeln innerhalb des Audit Frameworks. Darin wird präzise festgelegt welche Systemereignisse Dateizugriffe oder administrativen Tätigkeiten vom Kernel erfasst und dauerhaft protokolliert werden sollen.
sudo vi /etc/audit/rules.d/audit.rules
# Zeichnet auf wenn Benutzergruppen erstellt oder in ihren Berechtigungen verändert werden.
-w /etc/group -p wa -k identity
# Überwacht die zentrale Datei für Nutzerinformationen um Manipulationen an Konten zu erkenne
-w /etc/passwd -p wa -k identity
# Protokolliert Zugriffe auf die verschlüsselten Passwörter was für die Erkennung von Diebstahlsversuchen kritisch ist.
-w /etc/shadow -p wa -k identity
# Jede Änderung an den Befugnissen für die Ausführung von Befehlen mit erweiterten Rechten wird festgehalten.
-w /etc/sudoers -p wa -k identity
# Verhindert dass die Identität des Systems im Netzwerk unbemerkt modifiziert wird.
-w /etc/hostname -p wa -k system-locale
# Stellt sicher dass Änderungen an Schnittstellen oder Routingtabellen nachvollziehbar bleiben.
-w /etc/network -p wa -k system-locale
# Überwacht die Datei welche die Informationen über die jeweils letzten Anmeldungen der Nutzer speichert.
-w /var/log/lastlog -p wa -k logins
# Registriert Ereignisse die mit fehlgeschlagenen Anmeldeversuchen und daraus resultierenden Sperrungen zusammenhängen.
-w /var/run/faillock -p wa -k logins
# Diese Anweisung bewirkt dass auf Systemen mit einer Architektur von 64 Bit jeder einzelne Start eines Programms lückenlos aufgezeichnet wird. Der Systemaufruf namens execve ist für das Ausführen von Anwendungen zuständig und wird hierbei bei jedem Beenden des Vorgangs protokolliert. Dies ermöglicht es der administrativen Ebene genau zu rekonstruieren welcher Nutzer zu welchem Zeitpunkt welchen Befehl auf der Konsole gestartet hat. Selbst wenn ein Nutzer wie z.B. aaron versucht Spuren zu verwischen bleiben diese Aktionen im Audit Protokoll dauerhaft gespeichert.
-a always,exit -F arch=b64 -S execve -k command-execution
Regeln laden
# Dieser Befehl wird verwendet, um die Audit-Regeln aus den Konfigurationsdateien (normalerweise unter /etc/audit/rules.d/) zu kompilieren und direkt in den laufenden Kernel zu laden. Dadurch werden Änderungen am Regelwerk sofort wirksam, ohne dass ein Neustart des Dienstes oder des Systems erforderlich ist.
sudo augenrules --load
# Listet alle aktuell im Kernel geladenen Audit-Regeln auf. Dies ermöglicht eine direkte Kontrolle darüber, ob die gewünschten Überwachungsregeln erfolgreich aktiviert wurden und welche Systemereignisse momentan vom Kernel protokolliert werden.
sudo auditctl -l
