Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
How-To-Secure-A-Linux-Server — Schritt-für-Schritt-Anleitung zum Härten eines Linux-Servers, die SSH-Sicherheit, Firewalls, Erkennung von Eindringlingen, Überwachung und Systemkonfiguration abdeckt, um die Angriffsfläche zu verringern und die Verteidigung zu verbessern. | Kitploit
Tools/GitHubGitHub/imthenachoman/how-to-secure-a-linux-server
SchwachstellenscannerKonfigurationsprüfungNetzwerksicherheitMalware-AnalyseAuthentifizierungEinbruchserkennungLernen & BildungIncident ResponseKuratierte Ressourcen

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Log-Analyse
GitHubimthenachoman/how-to-secure-a-linux-server

How-To-Secure-A-Linux-Server

Schritt-für-Schritt-Anleitung zum Härten eines Linux-Servers, die SSH-Sicherheit, Firewalls, Erkennung von Eindringlingen, Überwachung und Systemkonfiguration abdeckt, um die Angriffsfläche zu verringern und die Verteidigung zu verbessern.

Repository anzeigen
30.3k2.0k2vor 1 MonatVon Kitploit geprüft

How To Secure A Linux Server

Eine fortlaufende Anleitung zum Sichern eines Linux-Servers, die hoffentlich auch ein wenig über Sicherheit lehrt und warum sie wichtig ist.

CC-BY-SA

Inhaltsverzeichnis

  • Einleitung
    • Ziel der Anleitung
    • Warum Ihren Server sichern
    • Warum schon wieder eine Anleitung
    • Andere Anleitungen
    • Zu erledigen / Hinzuzufügen
  • Überblick über die Anleitung
    • Über diese Anleitung
    • Mein Anwendungsfall
    • Konfigurationsdateien bearbeiten – Für die Faulen
    • Mitwirken
  • Bevor Sie beginnen
    • Identifizieren Sie Ihre Prinzipien
    • Eine Linux-Distribution auswählen
    • Linux installieren
    • Anforderungen vor/nach der Installation
    • Weitere wichtige Hinweise
    • Ansible-Playbooks zur Absicherung Ihres Linux-Servers verwenden
  • Der SSH-Server
    • Wichtiger Hinweis vor SSH-Änderungen
    • SSH-öffentliche/private Schlüssel
    • SSH-Gruppe für AllowGroups erstellen
    • /etc/ssh/sshd_config sichern
    • Kurze Diffie-Hellman-Schlüssel entfernen
    • 2FA/MFA für SSH
  • Die Grundlagen
    • Einschränken, wer sudo verwenden kann
    • Einschränken, wer su verwenden kann
    • Anwendungen in einer Sandbox mit FireJail ausführen
    • NTP-Client
    • /proc sichern
    • Konten zur Verwendung sicherer Passwörter zwingen
    • Automatische Sicherheitsupdates und -warnungen
    • Sicherer Zufallsentropie-Pool (in Arbeit)
    • Panik-/Sekundär-/Fake-Passwort-Anmeldesicherheitssystem hinzufügen
  • Das Netzwerk
    • Firewall mit UFW (Uncomplicated Firewall)
    • iptables-Erkennung und -Prävention mit PSAD
    • Anwendungserkennung und -prävention mit Fail2Ban
    • Anwendungserkennung und -prävention mit CrowdSec
  • Die Überwachung
    • Datei-/Ordnerintegritätsüberwachung mit AIDE (in Arbeit)
    • Antiviren-Scan mit ClamAV (in Arbeit)
    • Rootkit-Erkennung mit Rkhunter (in Arbeit)
    • Rootkit-Erkennung mit chkrootkit (in Arbeit)
    • logwatch – Systemprotokoll-Analysator und -Berichterstatter
    • ss – Anzeigen, auf welchen Ports Ihr Server lauscht
    • Lynis – Linux-Sicherheitsaudit
    • OSSEC – Host-Erkennung
  • Die Gefahrenzone
  • Das Sonstige
    • MSMTP (Einfaches Sendmail) mit Google
    • Gmail und Exim4 als MTA mit implizitem TLS
    • Separate iptables-Protokolldatei
  • Übrig gebliebenes
    • Kontakt
    • Hilfreiche Links
    • Danksagungen
    • Lizenz und Urheberrecht

(Inhaltsverzeichnis erstellt mit nGitHubTOC)

Einleitung

Ziel der Anleitung

Der Zweck dieser Anleitung ist es, Ihnen beizubringen, wie Sie einen Linux-Server sichern.

Es gibt viele Dinge, die Sie tun können, um einen Linux-Server zu sichern, und diese Anleitung wird versuchen, so viele wie möglich abzudecken. Weitere Themen/Materialien werden hinzugefügt, wenn ich lerne oder wenn Personen mitwirken.

Ansible-Playbooks dieser Anleitung sind verfügbar unter How To Secure A Linux Server With Ansible von moltenbit.

(Inhaltsverzeichnis)

Warum Ihren Server sichern

Ich gehe davon aus, dass Sie diese Anleitung verwenden, weil Sie hoffentlich bereits verstehen, warum gute Sicherheit wichtig ist. Das ist ein großes Thema für sich, und es aufzuschlüsseln ist außerhalb des Rahmens dieser Anleitung. Wenn Sie die Antwort auf diese Frage nicht kennen, empfehle ich Ihnen, sich zunächst darüber zu informieren.

Auf hoher Ebene wird ein Gerät, wie ein Server, in dem Moment, in dem es sich im öffentlichen Raum befindet – d.h. für die Außenwelt sichtbar ist – zu einem Ziel für böswillige Akteure. Ein ungesichertes Gerät ist ein Spielplatz für böswillige Akteure, die auf Ihre Daten zugreifen oder Ihren Server als weiteren Knoten für ihre groß angelegten DDOS-Angriffe nutzen möchten.

Was noch schlimmer ist: Ohne gute Sicherheit werden Sie möglicherweise nie erfahren, ob Ihr Server kompromittiert wurde. Ein böswilliger Akteur könnte unbefugten Zugriff auf Ihren Server erlangt und Ihre Daten kopiert haben, ohne etwas zu ändern, sodass Sie es nie erfahren würden. Oder Ihr Server könnte Teil eines DDOS-Angriffs gewesen sein, und Sie wüssten es nicht. Schauen Sie sich viele der großen Datenlecks in den Nachrichten an – die Unternehmen entdeckten das Datenleck oder den Einbruch oft erst lange nachdem die böswilligen Akteure verschwunden waren.

Entgegen der landläufigen Meinung wollen böswillige Akteure nicht immer etwas ändern oder Sie gegen Geld aus Ihren Daten aussperren. Manchmal wollen sie nur die Daten auf Ihrem Server für ihre Datenlager (in Big Data steckt viel Geld) oder um Ihren Server heimlich für ihre üblen Zwecke zu nutzen.

(Inhaltsverzeichnis)

Warum schon wieder eine Anleitung

Diese Anleitung mag überflüssig/unötig erscheinen, da es unzählige Artikel im Internet gibt, die Ihnen sagen, wie man Linux sichert, aber die Informationen sind auf verschiedene Artikel verteilt, die verschiedene Dinge und auf unterschiedliche Weise abdecken. Wer hat schon Zeit, hunderte Artikel zu durchforsten?

Während ich für meinen Debian-Build recherchierte, machte ich mir Notizen. Am Ende stellte ich fest, dass ich zusammen mit dem, was ich bereits wusste, und dem, was ich lernte, die Grundlagen einer Anleitung hatte. Ich dachte, ich stelle sie online, um hoffentlich anderen zu helfen, zu lernen und Zeit zu sparen.

Ich habe noch nie eine Anleitung gefunden, die alles abdeckt – diese Anleitung ist mein Versuch.

Viele der in dieser Anleitung behandelten Dinge mögen recht einfach/trivial sein, aber die meisten von uns installieren Linux nicht jeden Tag, und es ist leicht, diese grundlegenden Dinge zu vergessen.

(Inhaltsverzeichnis)

Andere Anleitungen

Es gibt viele Anleitungen von Experten, Branchenführern und den Distributionen selbst. Es ist nicht praktikabel und manchmal urheberrechtlich nicht erlaubt, alles aus diesen Anleitungen zu übernehmen. Ich empfehle Ihnen, sie sich anzusehen, bevor Sie mit dieser Anleitung beginnen.

  • Das Center for Internet Security (CIS) bietet Benchmarks, die erschöpfend, branchenweit vertrauenswürdig und Schritt-für-Schritt-Anleitungen zur Absicherung vieler Linux-Varianten sind. Lesen Sie die Seite Über uns für Details. Meine Empfehlung ist, zuerst diese Anleitung (die, die Sie hier lesen) und DANN die CIS-Anleitung durchzugehen. So werden deren Empfehlungen alles in dieser Anleitung überschreiben.
  • Für distributionsspezifische Härtungs-/Sicherheitsanleitungen lesen Sie die Dokumentation Ihrer Distribution.
  • https://security.utexas.edu/os-hardening-checklist/linux-7 - Red Hat Enterprise Linux 7 Härtungs-Checkliste
  • https://cloudpro.zone/index.php/2018/01/18/debian-9-3-server-setup-guide-part-1/ - Debian 9.3 Server-Setup-Anleitung
  • https://blog.vigilcode.com/2011/04/ubuntu-server-initial-security-quick-secure-setup-part-i/ - Ubuntu Server Initial Security guide
  • https://www.tldp.org/LDP/sag/html/index.html
  • https://seifried.org/lasg/
  • https://news.ycombinator.com/item?id=19178964
  • https://wiki.archlinux.org/index.php/Security – viele Leute haben auch diese empfohlen
  • https://securecompliance.co/linux-server-hardening-checklist/

(Inhaltsverzeichnis)

Zu erledigen / Hinzuzufügen

  • Benutzerdefinierte Jails für Fail2ban
  • MAC (Mandatory Access Control) und Linux Security Modules (LSMs)
    • https://wiki.archlinux.org/index.php/security#Mandatory_access_control
    • Security-Enhanced Linux / SELinux
      • https://en.wikipedia.org/wiki/Security-Enhanced_Linux
      • https://linuxtechlab.com/beginners-guide-to-selinux/
      • https://linuxtechlab.com/replicate-selinux-policies-among-linux-machines/
      • https://teamignition.us/how-to-stop-being-a-scrub-and-learn-to-use-selinux.html
    • AppArmor
      • https://wiki.archlinux.org/index.php/AppArmor
      • https://security.stackexchange.com/questions/29378/comparison-between-apparmor-and-selinux
      • http://www.insanitybit.com/2012/06/01/why-i-like-apparmor-more-than-selinux-5/
  • Festplattenverschlüsselung
  • Rkhunter und chkrootkit
    • http://www.chkrootkit.org/
    • http://rkhunter.sourceforge.net/
    • https://www.cyberciti.biz/faq/howto-check-linux-rootkist-with-detectors-software/

(Inhaltsverzeichnis)

Überblick über die Anleitung

Über diese Anleitung

Diese Anleitung...

  • ...ist eine laufende Arbeit.
  • ...konzentriert sich auf Heim-Linux-Server. Alle hier genannten Konzepte/Empfehlungen gelten auch für größere/professionelle Umgebungen, aber diese Anwendungsfälle erfordern fortgeschrittenere und spezialisiertere Konfigurationen, die außerhalb des Rahmens dieser Anleitung liegen.
  • ...lehrt Sie weder etwas über Linux, noch wie Sie Linux installieren oder es verwenden. Besuchen Sie https://linuxjourney.com/, wenn Sie neu bei Linux sind.
  • ...soll Linux-Distributions-unabhängig sein.
  • ...vermittelt Ihnen nicht alles, was Sie über Sicherheit wissen müssen, und geht auch nicht auf alle Aspekte der System-/Serversicherheit ein. Physische Sicherheit liegt beispielsweise außerhalb des Rahmens dieser Anleitung.
  • ...erklärt nicht, wie Programme/Werkzeuge funktionieren, und geht auch nicht auf alle ihre Details ein. Die meisten Programme/Werkzeuge, auf die diese Anleitung verweist, sind sehr leistungsfähig und hochgradig konfigurierbar. Das Ziel ist es, das Nötigste abzudecken – genug, um Ihren Appetit anzuregen und Sie hungrig genug zu machen, um mehr zu lernen.
  • ...möchte es einfach machen, indem sie Code bereitstellt, den Sie kopieren und einfügen können. Möglicherweise müssen Sie die Befehle vor dem Einfügen anpassen, also halten Sie Ihren bevorzugten Texteditor bereit.
  • ...ist in einer Reihenfolge organisiert, die für mich logisch sinnvoll ist – z.B. SSH sichern vor dem Installieren einer Firewall. Daher ist diese Anleitung dazu gedacht, in der dargestellten Reihenfolge befolgt zu werden, aber es ist nicht zwingend erforderlich. Seien Sie einfach vorsichtig, wenn Sie die Dinge in einer anderen Reihenfolge tun – einige Abschnitte setzen vorherige Abschnitte voraus.

(Inhaltsverzeichnis)

Mein Anwendungsfall

Es gibt viele Arten von Servern und verschiedene Anwendungsfälle. Obwohl ich möchte, dass diese Anleitung so generisch wie möglich ist, wird es einige Dinge geben, die möglicherweise nicht auf alle/anderen Anwendungsfälle zutreffen. Treffen Sie bei der Durchsicht dieser Anleitung Ihr bestes Urteilsvermögen.

Um den Kontext für viele der in dieser Anleitung behandelten Themen zu verdeutlichen, ist mein Anwendungsfall/meine Konfiguration:

  • Ein Desktop-ähnlicher Computer...
  • Mit einer einzigen NIC...
  • Angeschlossen an einen Router der Verbraucherklasse...
  • Mit einer dynamischen WAN-IP, die vom ISP bereitgestellt wird...
  • Mit WAN+LAN auf IPV4...
  • Und LAN mittels NAT...
  • Auf den ich per SSH von unbekannten Computern und unbekannten Standorten aus fernzugreifen haben möchte (z.B. von einem Freund zu Hause).

(Inhaltsverzeichnis)

Konfigurationsdateien bearbeiten – Für die Faulen

Ich bin sehr faul und mag es nicht, Dateien von Hand zu bearbeiten, wenn es nicht nötig ist. Ich gehe auch davon aus, dass alle anderen genauso sind wie ich. :)

Wenn und wo möglich, habe ich Code-Schnipsel bereitgestellt, um schnell zu erledigen, was nötig ist, z.B. das Hinzufügen oder Ändern einer Zeile in einer Konfigurationsdatei.

Die Code-Schnipsel verwenden grundlegende Befehle wie echo, cat, sed, awk und grep. Wie die Code-Schnipsel funktionieren, also was jeder Befehl/Teil tut, liegt außerhalb des Rahmens dieser Anleitung – die man-Seiten sind Ihr Freund.

Hinweis: Die Code-Schnipsel validieren/überprüfen nicht, ob die Änderung durchgeführt wurde – d.h. ob die Zeile tatsächlich hinzugefügt oder geändert wurde. Das Überprüfen überlasse ich Ihren fähigen Händen. Die Schritte in dieser Anleitung beinhalten, Sicherungskopien aller zu ändernden Dateien zu erstellen.

Nicht alle Änderungen können mit Code-Schnipseln automatisiert werden. Diese Änderungen erfordern gute, altmodische, manuelle Bearbeitung. Sie können beispielsweise nicht einfach eine Zeile an eine INI-Datei anhängen. Verwenden Sie Ihren bevorzugten Linux-Texteditor.

(Inhaltsverzeichnis)

Mitwirken

Ich wollte diese Anleitung auf GitHub veröffentlichen, um die Zusammenarbeit zu erleichtern. Je mehr Leute mitwirken, desto besser und vollständiger wird diese Anleitung.

Um mitzuwirken, können Sie forken und einen Pull-Request einreichen oder ein neues Issue eröffnen.

(Inhaltsverzeichnis)

Bevor Sie beginnen

Identifizieren Sie Ihre Prinzipien

Bevor Sie beginnen, sollten Sie Ihre Prinzipien identifizieren. Was ist Ihr Bedrohungsmodell? Einige Dinge, über die Sie nachdenken sollten:

  • Warum möchten Sie Ihren Server sichern?
  • Wie viel Sicherheit wünschen Sie oder nicht?
  • Wie viel Bequemlichkeit sind Sie bereit, für Sicherheit zu opfern und umgekehrt?
  • Welche Bedrohungen möchten Sie abwehren? Was sind die Besonderheiten Ihrer Situation? Zum Beispiel:
    • Ist physischer Zugang zu Ihrem Server/Netzwerk ein möglicher Angriffsvektor?
    • Werden Sie Ports auf Ihrem Router öffnen, um von außerhalb Ihres Zuhauses auf Ihren Server zugreifen zu können?
    • Werden Sie eine Dateifreigabe auf Ihrem Server hosten, die auf einem Desktop-ähnlichen Rechner eingebunden wird? Wie hoch ist die Wahrscheinlichkeit, dass der Desktop-Computer infiziert wird und wiederum den Server infiziert?
  • Haben Sie eine Möglichkeit der Wiederherstellung, wenn Ihre Sicherheitsimplementierung Sie von Ihrem eigenen Server aussperrt? Zum Beispiel, wenn Sie Root-Login deaktiviert oder GRUB mit einem Passwort geschützt haben.

Dies sind nur einige wenige Dinge, über die Sie nachdenken sollten. Bevor Sie Ihren Server sichern, sollten Sie verstehen, wogegen Sie sich schützen wollen und warum, damit Sie wissen, was Sie tun müssen.

(Inhaltsverzeichnis)

Eine Linux-Distribution auswählen

Diese Anleitung soll distributionsunabhängig sein, damit Benutzer jede Distribution verwenden können, die sie möchten. Dabei gibt es jedoch einige Dinge zu beachten:

Sie möchten eine Distribution, die...

  • ...stabil ist. Es sei denn, Sie mögen es, um 2 Uhr morgens Probleme zu debuggen, dann wollen Sie nicht, dass ein unbeaufsichtigtes Upgrade oder ein manuelles Paket-/Systemupdate Ihren Server unbrauchbar macht. Aber das bedeutet auch, dass Sie damit einverstanden sind, nicht die neueste, beste, hochmoderne Software zu verwenden.
  • ...mit Sicherheitspatches auf dem neuesten Stand bleibt. Sie können alles auf Ihrem Server sichern, aber wenn das Kernbetriebssystem oder die ausgeführten Anwendungen bekannte Schwachstellen aufweisen, werden Sie nie sicher sein.
  • ...mit der Sie vertraut sind. Wenn Sie Linux nicht kennen, rate ich Ihnen, sich damit vertraut zu machen, bevor Sie es sichern. Sie sollten sich damit wohlfühlen und sich auskennen, z.B. wie man Software installiert, wo Konfigurationsdateien liegen usw.
  • ...gut unterstützt wird. Selbst der erfahrenste Administrator braucht ab und zu Hilfe. Ein Ort, an den Sie sich wenden können, wird Ihre Nerven schonen.

(Inhaltsverzeichnis)

Linux installieren

Die Installation von Linux liegt außerhalb des Rahmens dieser Anleitung, da jede Distribution es anders macht und die Installationsanweisungen normalerweise gut dokumentiert sind. Wenn Sie Hilfe benötigen, beginnen Sie mit der Dokumentation Ihrer Distribution. Unabhängig von der Distribution läuft der übergeordnete Prozess normalerweise wie folgt ab:

  1. ISO herunterladen
  2. Auf Ihr Installationsmedium (z.B. eine CD oder einen USB-Stick) brennen/kopieren/übertragen
  3. Server von Ihrem Installationsmedium booten
  4. Den Anweisungen zur Installation folgen

Wo zutreffend, verwenden Sie die Experten-Installationsoption, um eine strengere Kontrolle darüber zu haben, was auf Ihrem Server läuft. Installieren Sie nur, was Sie unbedingt benötigen. Ich persönlich installiere nichts anderes als SSH. Aktivieren Sie auch die Festplattenverschlüsselungsoption.

(Inhaltsverzeichnis)

Anforderungen vor/nach der Installation

  • Wenn Sie Ports auf Ihrem Router öffnen, um von außen auf Ihren Server zugreifen zu können, deaktivieren Sie die Portweiterleitung, bis Ihr System eingerichtet und gesichert ist.
  • Sofern Sie nicht alles physisch mit Ihrem Server verbunden erledigen, benötigen Sie Fernzugriff, daher stellen Sie sicher, dass SSH funktioniert.
  • Halten Sie Ihr System auf dem neuesten Stand (z.B. sudo apt update && sudo apt upgrade auf Debian-basierten Systemen).
  • Stellen Sie sicher, dass Sie alle für Ihre Einrichtung spezifischen Aufgaben ausführen, wie:
    • Netzwerkkonfiguration
    • Konfiguration von Mountpunkten in /etc/fstab
    • Erstellen der ersten Benutzerkonten
    • Installieren der benötigten Kernsoftware wie man
    • usw.
  • Ihr Server muss in der Lage sein, E-Mails zu senden, damit Sie wichtige Sicherheitswarnungen erhalten. Wenn Sie keinen Mailserver einrichten, lesen Sie Gmail und Exim4 als MTA mit implizitem TLS.
  • Ich empfehle Ihnen auch, die CIS-Benchmarks zu lesen, bevor Sie mit dieser Anleitung beginnen, um zu erfassen/zu verstehen, was sie zu sagen haben. Meine Empfehlung ist, zuerst diese Anleitung (die, die Sie hier lesen) und DANN die CIS-Anleitung durchzugehen. So werden deren Empfehlungen alles in dieser Anleitung überschreiben.

(Inhaltsverzeichnis)

Weitere wichtige Hinweise

  • Diese Anleitung wird auf Debian geschrieben und getestet. Die meisten unten aufgeführten Dinge sollten auf anderen Distributionen funktionieren. Wenn Sie etwas finden, das nicht funktioniert, kontaktieren Sie mich bitte Kontakt. Der Hauptunterschied zwischen den Distributionen wird ihr Paketverwaltungssystem sein. Da ich Debian verwende, werde ich die entsprechenden apt-Befehle bereitstellen, die auf allen Debian-basierten Distributionen funktionieren sollten. Wenn jemand bereit ist, die entsprechenden Befehle für andere Distributionen bereitzustellen, werde ich sie hinzufügen.
  • Dateipfade und Einstellungen können ebenfalls leicht abweichen – lesen Sie bei Problemen in der Dokumentation Ihrer Distribution nach.
  • Lesen Sie die gesamte Anleitung, bevor Sie beginnen. Ihr Anwendungsfall und/oder Ihre Prinzipien können erfordern, dass Sie etwas nicht tun oder die Reihenfolge ändern.
  • Kopieren und fügen Sie nicht blind ein, ohne zu verstehen, was Sie einfügen. Einige Befehle müssen für Ihre Bedürfnisse angepasst werden, bevor sie funktionieren – z.B. Benutzernamen.

(Inhaltsverzeichnis)

Ansible-Playbooks zur Absicherung Ihres Linux-Servers verwenden

Ansible-Playbooks dieser Anleitung sind verfügbar unter How To Secure A Linux Server With Ansible.Stellen Sie sicher, dass Sie die Variablen nach Ihren Bedürfnissen bearbeiten und alle Aufgaben vorher lesen, um zu bestätigen, dass Ihr System nicht beeinträchtigt wird. Nach dem Ausführen der Playbooks stellen Sie sicher, dass alle Einstellungen Ihren Bedürfnissen entsprechen!

  1. Installieren Sie Ansible
  2. git clone How To Secure A Linux Server With Ansible
  3. Create SSH-Public/Private-Keys ``` ssh-keygen -t ed25519
root@kitploit:~
5. Ändern Sie alle Variablen in *group_vars/variables.yml* entsprechend Ihren Anforderungen.
6. Aktivieren Sie SSH-Root-Zugriff vor dem Ausführen der Playbooks:  ```
nano /etc/ssh/sshd_config
[...]
PermitRootLogin yes
[...]
  1. Empfohlen: Konfigurieren Sie eine statische IP-Adresse auf Ihrem System.
  2. Fügen Sie die IP-Adresse Ihres Systems in die hosts.yml ein.

 

Führen Sie das Requirements-Playbook mit dem Root-Passwort aus, das Sie bei der Installation des Servers angegeben haben:

root@kitploit:~
ansible-playbook --inventory hosts.yml --ask-pass requirements-playbook.yml

 

Führen Sie das Haupt-Playbook mit dem Passwort des neuen Benutzers aus, das Sie in der Datei variables.yml angegeben haben:

root@kitploit:~
ansible-playbook --inventory hosts.yml --ask-pass main-playbook.yml

 

Wenn Sie die Playbooks mehrmals ausführen müssen, denken Sie daran, den SSH-Schlüssel und den neuen SSH-Port zu verwenden:

root@kitploit:~
ansible-playbook --inventory hosts.yml -e ansible_ssh_port=SSH_PORT --key-file /PFAD/ZUM/SSH-SCHLÜSSEL main-playbook.yml

(Inhaltsverzeichnis)

Der SSH-Server

Wichtiger Hinweis, bevor Sie SSH-Änderungen vornehmen

Es wird dringend empfohlen, ein zweites Terminal zu Ihrem Server offen zu halten, bevor Sie SSH-Konfigurationsänderungen vornehmen und anwenden. So haben Sie, falls Sie sich von Ihrer ersten Terminalsitzung aussperren, noch eine Sitzung verbunden, um es zu beheben.

Danke an Sonnenbrand für diese Idee.

SSH Public/Private Keys

Warum

Die Verwendung von SSH-Public/Private-Keys ist sicherer als die Verwendung eines Passworts. Es macht es auch einfacher und schneller, eine Verbindung zu unserem Server herzustellen, da Sie kein Passwort eingeben müssen.

Funktionsweise

Lesen Sie die Referenzen unten für weitere Details, aber auf hoher Ebene funktionieren Public/Private-Keys, indem ein Paar von Schlüsseln zur Identitätsüberprüfung verwendet wird.

  1. Ein Schlüssel, der öffentliche Schlüssel, kann nur Daten verschlüsseln, nicht entschlüsseln
  2. Der andere Schlüssel, der private Schlüssel, kann die Daten entschlüsseln

Für SSH wird auf dem Client ein öffentlicher und ein privater Schlüssel erstellt. Sie sollten beide Schlüssel sicher aufbewahren, insbesondere den privaten Schlüssel. Obwohl der öffentliche Schlüssel dazu gedacht ist, öffentlich zu sein, ist es weise, sicherzustellen, dass keiner der Schlüssel in die falschen Hände gerät.

Wenn Sie eine Verbindung zu einem SSH-Server herstellen, sucht SSH nach einem öffentlichen Schlüssel, der zum Client passt, von dem Sie sich verbinden, in der Datei ~/.ssh/authorized_keys auf dem Server, mit dem Sie sich verbinden. Beachten Sie, dass sich die Datei im Home-Ordner der ID befindet, mit der Sie sich verbinden möchten. Nachdem Sie den öffentlichen Schlüssel erstellt haben, müssen Sie ihn an ~/.ssh/authorized_keys anhängen. Ein Ansatz besteht darin, ihn auf einen USB-Stick zu kopieren und physisch zum Server zu übertragen. Ein anderer Ansatz ist die Verwendung von ssh-copy-id, um den öffentlichen Schlüssel zu übertragen und anzuhängen.

Nachdem die Schlüssel erstellt und der öffentliche Schlüssel an ~/.ssh/authorized_keys auf dem Host angehängt wurde, verwendet SSH die öffentlichen und privaten Schlüssel, um die Identität zu überprüfen und dann eine sichere Verbindung herzustellen. Wie die Identität überprüft wird, ist ein komplizierter Prozess, aber Digital Ocean hat eine sehr gute Beschreibung, wie es funktioniert. Auf hoher Ebene wird die Identität überprüft, indem der Server eine Challenge-Nachricht mit dem öffentlichen Schlüssel verschlüsselt und dann an den Client sendet. Wenn der Client die Challenge-Nachricht nicht mit dem privaten Schlüssel entschlüsseln kann, kann die Identität nicht überprüft werden und es wird keine Verbindung hergestellt.

Sie gelten als sicherer, weil Sie den privaten Schlüssel benötigen, um eine SSH-Verbindung herzustellen. Wenn Sie PasswordAuthentication no in /etc/ssh/sshd_config setzen, lässt SSH Sie ohne den privaten Schlüssel keine Verbindung herstellen.

Sie können auch eine Passphrase für die Schlüssel festlegen, die bei der Verbindung mit Public/Private-Keys die Eingabe der Schlüssel-Passphrase erfordert. Beachten Sie, dass Sie dadurch den Schlüssel nicht für Automatisierung verwenden können, da Sie keine Möglichkeit haben, die Passphrase in Ihren Skripten zu senden. ssh-agent ist ein Programm, das in vielen Linux-Distributionen enthalten ist (und normalerweise bereits läuft) und es Ihnen ermöglicht, Ihren unverschlüsselten privaten Schlüssel für eine konfigurierbare Dauer im Speicher zu halten. Führen Sie einfach ssh-add aus, und es wird Sie nach Ihrer Passphrase fragen. Sie werden erst wieder nach Ihrer Passphrase gefragt, wenn die konfigurierbare Dauer abgelaufen ist.

Wir werden Ed25519-Schlüssel verwenden, die laut https://linux-audit.com/:

Es verwendet ein elliptisches Kurvensignaturschema, das eine bessere Sicherheit als ECDSA und DSA bietet. Gleichzeitig hat es auch eine gute Leistung.

Ziele

  • Ed25519 Public/Private SSH-Schlüssel:
    • privater Schlüssel auf Ihrem Client
    • öffentlicher Schlüssel auf Ihrem Server

Hinweise

  • Sie müssen diesen Schritt für jeden Computer und jedes Konto durchführen, von/als dem/als dem Sie eine Verbindung zu Ihrem Server herstellen werden.

Referenzen

  • https://www.ssh.com/ssh/public-key-authentication
  • https://help.ubuntu.com/community/SSH/OpenSSH/Keys
  • https://linux-audit.com/using-ed25519-openssh-keys-instead-of-dsa-rsa-ecdsa/
  • https://www.digitalocean.com/community/tutorials/understanding-the-ssh-encryption-and-connection-process
  • https://wiki.archlinux.org/index.php/SSH_Keys
  • https://www.ssh.com/ssh/copy-id
  • man ssh-keygen
  • man ssh-copy-id
  • man ssh-add

Schritte

  1. Erstellen Sie auf dem Computer, den Sie zum Verbinden mit Ihrem Server verwenden werden — dem Client, nicht dem Server selbst — einen Ed25519-Schlüssel mit ssh-keygen:

    root@kitploit:~
    ssh-keygen -t ed25519
    
    root@kitploit:~
    Generating public/private ed25519 key pair.
    Enter file in which to save the key (/home/user/.ssh/id_ed25519):
    Created directory '/home/user/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/user/.ssh/id_ed25519.
    Your public key has been saved in /home/user/.ssh/id_ed25519.pub.
    The key fingerprint is:
    SHA256:F44D4dr2zoHqgj0i2iVIHQ32uk/Lx4P+raayEAQjlcs user@client
    The key's randomart image is:
    +--[ED25519 256]--+
    |xxxx  x          |
    |o.o +. .         |
    | o o oo   .      |
    |. E oo . o .     |
    | o o. o S o      |
    |... .. o o       |
    |.+....+ o        |
    |+.=++o.B..       |
    |+..=**=o=.       |
    +----[SHA256]-----+
    

    Hinweis: Wenn Sie eine Passphrase festlegen, müssen Sie sie jedes Mal eingeben, wenn Sie sich mit diesem Schlüssel mit Ihrem Server verbinden, es sei denn, Sie verwenden ssh-agent.

  2. Jetzt müssen Sie den öffentlichen Schlüssel ~/.ssh/id_ed25519.pub von Ihrem Client an die Datei auf Ihrem Server . Da wir vermutlich noch zu Hause im LAN sind, sind wir wahrscheinlich sicher vor -Angriffen. Daher verwenden wir , um den öffentlichen Schlüssel zu übertragen und anzuhängen:

Jetzt wäre ein guter Zeitpunkt, um alle für Ihre Einrichtung spezifischen Aufgaben durchzuführen.

(Inhaltsverzeichnis)

SSH-Gruppe für AllowGroups erstellen

Warum

Um die Kontrolle darüber zu erleichtern, wer SSH auf den Server durchführen kann. Durch die Verwendung einer Gruppe können wir schnell Konten zur Gruppe hinzufügen/entfernen, um den SSH-Zugriff auf den Server schnell zu ermöglichen oder zu verweigern.

Funktionsweise

Wir werden die Option AllowGroups in der SSH-Konfigurationsdatei /etc/ssh/sshd_config verwenden, um dem SSH-Server mitzuteilen, dass er nur Benutzern SSH-Zugriff erlauben soll, die Mitglied einer bestimmten UNIX-Gruppe sind. Jeder, der nicht in der Gruppe ist, kann sich nicht per SSH anmelden.

Ziele

  • eine UNIX-Gruppe, die wir in Secure /etc/ssh/sshd_config verwenden, um einzuschränken, wer SSH auf den Server durchführen kann

Hinweise

  • Dies ist ein erforderlicher Schritt, um die Einstellung AllowGroup zu unterstützen, die in Secure /etc/ssh/sshd_config gesetzt wird.

Referenzen

  • man groupadd
  • man usermod

Schritte

  1. Erstellen Sie eine Gruppe:

    root@kitploit:~
    sudo groupadd sshusers
    
  2. Fügen Sie Konto(s) zur Gruppe hinzu:

    root@kitploit:~
    sudo usermod -a -G sshusers user1
    sudo usermod -a -G sshusers user2
    sudo usermod -a -G sshusers ...
    

    Sie müssen dies für jedes Konto auf Ihrem Server tun, das SSH-Zugriff benötigt.

(Inhaltsverzeichnis)

Secure /etc/ssh/sshd_config

Warum

SSH ist eine Tür zu Ihrem Server. Dies gilt insbesondere, wenn Sie Ports auf Ihrem Router öffnen, damit Sie von außerhalb Ihres Heimnetzwerks per SSH auf Ihren Server zugreifen können. Wenn es nicht richtig gesichert ist, könnte ein böswilliger Akteur es nutzen, um unbefugten Zugriff auf Ihr System zu erlangen.

Funktionsweise

/etc/ssh/sshd_config ist die Standard-Konfigurationsdatei, die der SSH-Server verwendet. Wir werden diese Datei verwenden, um dem SSH-Server mitzuteilen, welche Optionen er verwenden soll.

Ziele

  • eine sichere SSH-Konfiguration

Hinweise

  • Stellen Sie sicher, dass Sie zuerst SSH-Gruppe für AllowGroups erstellen abgeschlossen haben.

Referenzen

  • Mozillas OpenSSH-Richtlinien für OpenSSH 6.7+ unter https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67
  • https://linux-audit.com/audit-and-harden-your-ssh-configuration/
  • https://www.ssh.com/ssh/sshd_config/
  • https://www.techbrown.com/harden-ssh-secure-linux-vps-server/ (defekt; versuchen Sie http://web.archive.org/web/20200413100933/https://www.techbrown.com/harden-ssh-secure-linux-vps-server/)
  • https://serverfault.com/questions/660160/openssh-difference-between-internal-sftp-and-sftp-server/660325
  • man sshd_config
  • Danke an than0s für wie man doppelte Einstellungen findet.

Schritte

  1. Erstellen Sie eine Sicherungskopie der OpenSSH-Server-Konfigurationsdatei /etc/ssh/sshd_config und entfernen Sie Kommentare, um das Lesen zu erleichtern:

    root@kitploit:~
    sudo cp --archive /etc/ssh/sshd_config /etc/ssh/sshd_config-COPY-$(date +"%Y%m%d%H%M%S")
    sudo sed -i -r -e '/^#|^$/ d' /etc/ssh/sshd_config
    
  2. Bearbeiten Sie /etc/ssh/sshd_config und suchen Sie dann diese Einstellungen, die unabhängig von Ihrer Konfiguration/Einrichtung angewendet werden sollten, und bearbeiten oder fügen Sie sie hinzu:

    Hinweis: SSH mag keine doppelten widersprüchlichen Einstellungen. Wenn Sie z.B. ChallengeResponseAuthentication no und dann ChallengeResponseAuthentication yes haben, respektiert SSH die erste und ignoriert die zweite. Ihre Datei /etc/ssh/sshd_config enthält möglicherweise bereits einige der folgenden Einstellungen/Zeilen. Um Probleme zu vermeiden, müssen Sie manuell durch Ihre Datei /etc/ssh/sshd_config gehen und doppelte widersprüchliche Einstellungen beheben.

    Hinweis: Wenn Sie OpenSSH 9.1 oder neuer verwenden, kommentieren Sie die Zeile RequiredRSASize 3072 in der folgenden Konfiguration aus. Dies erzwingt eine minimale RSA-Schlüsselgröße von 3072 Bit und lehnt kleinere RSA-Schlüssel während der Authentifizierung ab. Dies betrifft nur RSA-Schlüssel. Wenn Sie ED25519- oder ECDSA-Schlüssel verwenden, sind Sie nicht betroffen. Sie können Ihren Schlüsseltyp und Ihre Schlüsselgröße mit überprüfen. Bei älteren OpenSSH-Versionen lassen Sie die Zeile auskommentiert, da sie sonst den Start von sshd verhindert.

(Inhaltsverzeichnis)

Kurze Diffie-Hellman-Schlüssel entfernen

Warum

Laut Mozillas OpenSSH-Richtlinien für OpenSSH 6.7+ "sollten alle verwendeten Diffie-Hellman-Moduli mindestens 3072 Bit lang sein".

Der Diffie-Hellman-Algorithmus wird von SSH verwendet, um eine sichere Verbindung herzustellen. Je größer die Moduli (Schlüsselgröße), desto stärker die Verschlüsselung.

Ziele

  • alle Diffie-Hellman-Schlüssel entfernen, die kürzer als 3072 Bit sind

Referenzen

  • Mozillas OpenSSH-Richtlinien für OpenSSH 6.7+ unter https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67
  • https://infosec.mozilla.org/guidelines/key_management
  • man moduli

Schritte

  1. Erstellen Sie eine Sicherungskopie der SSH-Moduli-Datei /etc/ssh/moduli:

    root@kitploit:~
    sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
    
  2. Entfernen Sie kurze Moduli:

    root@kitploit:~
    sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
    sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
    

(Inhaltsverzeichnis)

2FA/MFA für SSH

Warum

Obwohl SSH ein ziemlich guter Sicherheitsdienst für Ihre Türen und Fenster ist, ist es immer noch eine sichtbare Tür, die böswillige Akteure sehen und versuchen können, durch Brute-Force zu knacken. Fail2ban wird diese Brute-Force-Versuche überwachen, aber es gibt keinen zu viel Sicherheit. Die Anforderung von zwei Faktoren fügt eine zusätzliche Sicherheitsebene hinzu.

Die Verwendung von Zwei-Faktor-Authentifizierung (2FA) / Multi-Faktor-Authentifizierung (MFA) erfordert von jedem, der eintritt, zwei Schlüssel zum Eintreten, was es für böswillige Akteure schwieriger macht. Die beiden Schlüssel sind:

  1. Ihr Passwort
  2. Ein 6-stelliger Token, der alle 30 Sekunden wechselt

Ohne beide Schlüssel können sie nicht hineinkommen.

Warum nicht

Viele Leute empfinden die Erfahrung möglicherweise als umständlich oder nervig. Außerdem hängt der Zugriff auf Ihr System von der begleitenden Authentifizierungs-App ab, die den Code generiert.

Funktionsweise

Unter Linux ist PAM für die Authentifizierung verantwortlich. Es gibt vier Aufgaben von PAM, die Sie unter https://en.wikipedia.org/wiki/Linux_PAM nachlesen können. Dieser Abschnitt behandelt die Authentifizierungsaufgabe.

Wenn Sie sich auf einem Server anmelden, sei es direkt von der Konsole oder über SSH, sendet die Tür, durch die Sie gekommen sind, die Anfrage an die Authentifizierungsaufgabe von PAM, und PAM fordert Ihr Passwort an und überprüft es. Sie können die Regeln anpassen, die jede Tür verwendet. Zum Beispiel könnten Sie ein Regelwerk für die direkte Anmeldung von der Konsole und ein anderes Regelwerk für die Anmeldung über SSH haben.

Dieser Abschnitt wird die Authentifizierungsregeln für die Anmeldung über SSH ändern, um sowohl ein Passwort als auch einen 6-stelligen Code zu erfordern.Wir werden Googles libpam-google-authenticator PAM-Modul verwenden, um einen TOTP-Schlüssel zu erstellen und zu verifizieren. https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/ und https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/ enthalten sehr gute Erläuterungen zur Funktionsweise von TOTP.

Was wir tun werden, ist der SSH-PAM-Konfiguration des Servers mitzuteilen, dass sie den Benutzer nach seinem Passwort und dann nach seinem numerischen Token fragen soll. PAM überprüft dann das Passwort des Benutzers und, falls es korrekt ist, leitet es die Authentifizierungsanforderung an libpam-google-authenticator weiter, welches nach Ihrem 6-stelligen Token fragt und diesen verifiziert. Nur wenn alles in Ordnung ist, wird die Authentifizierung erfolgreich sein und der Benutzer darf sich anmelden.

Ziele

  • 2FA/MFA für alle SSH-Verbindungen aktiviert

Hinweise

  • Bevor Sie dies tun, sollten Sie eine Vorstellung davon haben, wie 2FA/MFA funktioniert, und Sie benötigen eine Authentifikator-App auf Ihrem Telefon, um fortzufahren.
  • Wir werden google-authenticator-libpam verwenden.
  • Mit der folgenden Konfiguration muss ein Benutzer seinen 2FA/MFA-Code nur dann eingeben, wenn er sich mit seinem Passwort anmeldet, nicht jedoch, wenn er SSH-Public/Private-Keys verwendet. Lesen Sie die Dokumentation, um zu erfahren, wie Sie dieses Verhalten an Ihre Anforderungen anpassen können.

Referenzen

  • https://github.com/google/google-authenticator-libpam
  • https://en.wikipedia.org/wiki/Linux_PAM
  • https://en.wikipedia.org/wiki/Time-based_One-time_Password_algorithm
  • https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/
  • https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/

Schritte

  1. Installieren Sie libpam-google-authenticator.

    Auf Debian-basierten Systemen:

    root@kitploit:~
    sudo apt install libpam-google-authenticator
    
  2. Stellen Sie sicher, dass Sie als die ID angemeldet sind, für die Sie 2FA/MFA aktivieren möchten und führen Sie google-authenticator aus, um die erforderlichen Tokendaten zu erstellen:

    root@kitploit:~
    google-authenticator
    
    root@kitploit:~
    Do you want authentication tokens to be time-based (y/n) y
    https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DR4ZWX34FQKZROVX7AGLJ64684Y%26issuer%3Dhost
    
    ...
    
    Your new secret key is: R3NVX3FFQKZROVX7AGLJUGGESY
    Your verification code is 751419
    Your emergency scratch codes are:
      12345678
      90123456
      78901234
      56789012
      34567890
    
    Do you want me to update your "/home/user/.google_authenticator" file (y/n) y
    
    Do you want to disallow multiple uses of the same authentication
    token? This restricts you to one login about every 30s, but it increases
    your chances to notice or even prevent man-in-the-middle attacks (y/n) Do you want to disallow multiple uses of the same authentication
    token? This restricts you to one login about every 30s, but it increases
    your chances to notice or even prevent man-in-the-middle attacks (y/n) y
    
    By default, tokens are good for 30 seconds. In order to compensate for
    possible time-skew between the client and the server, we allow an extra
    token before and after the current time. If you experience problems with
    poor time synchronization, you can increase the window from its default
    size of +-1min (window size of 3) to about +-4min (window size of
    17 acceptable tokens).
    Do you want to do so? (y/n) y
    
    If the computer that you are logging into isn't hardened against brute-force
    login attempts, you can enable rate-limiting for the authentication module.
    By default, this limits attackers to no more than 3 login attempts every 30s.
    Do you want to enable rate-limiting (y/n) y
    

(Table of Contents)

Die Grundlagen

Begrenzung, wer sudo verwenden darf

Warum

sudo ermöglicht es Benutzerkonten, Befehle als andere Benutzer auszuführen, einschließlich root. Wir möchten sicherstellen, dass nur die von uns gewünschten Konten sudo verwenden können.

Ziele

  • sudo-Berechtigungen auf diejenigen beschränkt, die sich in einer von uns festgelegten Gruppe befinden

Hinweise

  • Ihre Installation hat dies möglicherweise bereits getan oder hat möglicherweise bereits eine spezielle Gruppe für diesen Zweck; überprüfen Sie daher zuerst.
    • Debian erstellt die sudo-Gruppe. Um Benutzer anzuzeigen, die Teil dieser Gruppe sind (und somit sudo-Berechtigungen haben):

      root@kitploit:~
      cat /etc/group | grep "sudo"
      
    • RedHat erstellt die wheel-Gruppe

  • Siehe https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/39 für einen Hinweis zu einigen Distributionen, bei denen sudo kein Passwort erfordert. Danke an sbrl für den Hinweis.

Schritte

  1. Erstellen Sie eine Gruppe:

    root@kitploit:~
    sudo groupadd sudousers
    
  2. Fügen Sie das/die Konto(en) zur Gruppe hinzu:

    root@kitploit:~
    sudo usermod -a -G sudousers user1
    sudo usermod -a -G sudousers user2
    sudo usermod -a -G sudousers  ...
    

    Sie müssen dies für jedes Konto auf Ihrem Server tun, das sudo-Berechtigungen benötigt.

  3. Erstellen Sie ein Backup der sudo-Konfigurationsdatei /etc/sudoers:

    root@kitploit:~
    sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
    
  4. Bearbeiten Sie die sudo-Konfigurationsdatei /etc/sudoers:

    root@kitploit:~
    sudo visudo
    
  5. Teilen Sie sudo mit, nur Benutzern in der sudousers-Gruppe die Verwendung von sudo zu erlauben, indem Sie diese Zeile hinzufügen, falls sie nicht bereits vorhanden ist:

    root@kitploit:~
    %sudousers   ALL=(ALL:ALL) ALL
    

(Table of Contents)

Begrenzung, wer su verwenden darf

Warum

su ermöglicht es Benutzerkonten ebenfalls, Befehle als andere Benutzer auszuführen, einschließlich root. Wir möchten sicherstellen, dass nur die von uns gewünschten Konten su verwenden können.

Ziele

  • su-Berechtigungen auf diejenigen beschränkt, die sich in einer von uns festgelegten Gruppe befinden

Referenzen

  • Danke an olavim für die Idee dieser Idee

Schritte

  1. Erstellen Sie eine Gruppe:

    root@kitploit:~
    sudo groupadd suusers
    
  2. Fügen Sie das/die Konto(en) zur Gruppe hinzu:

    root@kitploit:~
    sudo usermod -a -G suusers user1
    sudo usermod -a -G suusers user2
    sudo usermod -a -G suusers  ...
    

    Sie müssen dies für jedes Konto auf Ihrem Server tun, das su-Berechtigungen benötigt.

  3. Stellen Sie sicher, dass nur Benutzer dieser Gruppe /bin/su ausführen können:

    root@kitploit:~
    sudo dpkg-statoverride --update --add root suusers 4750 /bin/su
    

(Table of Contents)

Anwendungen in einer Sandbox mit FireJail ausführen

Warum

Es ist für viele Anwendungen absolut besser, in einer Sandbox ausgeführt zu werden.

Browser (insbesondere die Closed-Source-Browser) und E-Mail-Clients werden dringend empfohlen.

Ziele

  • Anwendungen in einem Jail (wenige sichere Verzeichnisse) einschließen und den Zugriff auf den Rest des Systems blockieren

Referenzen

  • Danke an FireJail

Schritte

  1. Installieren Sie die Software:

    root@kitploit:~
    sudo apt install firejail firejail-profiles
    

    Hinweis: Für Debian 10 Stable wird das offizielle Backport empfohlen:

    root@kitploit:~
    sudo apt install -t buster-backports firejail firejail-profiles
    
  2. Erlauben Sie einer Anwendung (installiert in /usr/bin oder /bin), nur in einer Sandbox zu laufen (siehe einige Beispiele unten):

    root@kitploit:~
    sudo ln -s /usr/bin/firejail /usr/local/bin/google-chrome-stable
    sudo ln -s /usr/bin/firejail /usr/local/bin/firefox
    sudo ln -s /usr/bin/firejail /usr/local/bin/chromium
    sudo ln -s /usr/bin/firejail /usr/local/bin/evolution
    sudo ln -s /usr/bin/firejail /usr/local/bin/thunderbird
    
  3. Führen Sie die Anwendung wie gewohnt aus (über Terminal oder Launcher) und überprüfen Sie, ob sie in einem Jail läuft:

    root@kitploit:~
    firejail --list
    
  4. Erlauben Sie einer gesandboxten App, wieder wie zuvor zu laufen (Beispiel: Firefox)

    root@kitploit:~
    sudo rm /usr/local/bin/firefox
    

(Table of Contents)

NTP-Client

Warum

Viele Sicherheitsprotokolle nutzen die Zeit. Wenn Ihre Systemzeit falsch ist, kann dies negative Auswirkungen auf Ihren Server haben. Ein NTP-Client kann dieses Problem lösen, indem er Ihre Systemzeit mit globalen NTP-Servern synchron hält.

Funktionsweise

NTP steht für Network Time Protocol. Im Kontext dieser Anleitung wird ein NTP-Client auf dem Server verwendet, um die Serverzeit mit der offiziellen Zeit von offiziellen Servern zu aktualisieren. Überprüfen Sie https://www.pool.ntp.org/en/ für alle öffentlichen NTP-Server.

Hinweis: Ab Debian 13 (Trixie) wurde das klassische ntp-Paket entfernt. Die Ausführung von sudo apt install ntp schlägt fehl mit "Package ntp has no installation candidate". Da diese Anleitung NTP nur als Client verwendet (zur Synchronisation der Serveruhr), ist der empfohlene Ansatz für Debian 13+ die Verwendung von systemd-timesyncd, das bereits vorinstalliert ist und keine zusätzlichen Pakete erfordert. Siehe die Debian 13+ Schritte unten.

Ziele

  • NTP-Client installiert und Serverzeit synchron gehalten

Referenzen

  • https://cloudpro.zone/index.php/2018/01/27/debian-9-3-server-setup-guide-part-4/
  • https://en.wikipedia.org/wiki/Network_Time_Protocol
  • https://www.pool.ntp.org/en/
  • https://serverfault.com/questions/957302/securing-hardening-ntp-client-on-linux-servers-config-file/957450#957450
  • https://tf.nist.gov/tf-cgi/servers.cgi

Schritte

Debian 13 (Trixie) und später: systemd-timesyncd

systemd-timesyncd ist ein leichtgewichtiger SNTP-Client, der bereits in Debian enthalten ist. Anders als der vollständige ntpd-Daemon lauscht er auf keinem Port, was die Angriffsfläche verringert. Für die Zwecke dieser Anleitung – die Synchronisation der Serveruhr – ist dies völlig ausreichend.

  1. Aktivieren Sie die NTP-Synchronisation:

    root@kitploit:~
    sudo timedatectl set-ntp true
    
  2. Überprüfen Sie, ob es funktioniert:

    root@kitploit:~
    timedatectl status
    

    Sie sollten NTP service: active und System clock synchronized: yes in der Ausgabe sehen.

  3. Konfigurieren Sie vertrauenswürdige NTP-Server. Erstellen Sie ein Backup der Konfigurationsdatei und bearbeiten Sie sie dann:

    root@kitploit:~
    sudo cp --archive /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf-COPY-$(date +"%Y%m%d%H%M%S")
    

    Bearbeiten Sie /etc/systemd/timesyncd.conf und heben Sie die Auskommentierung im Abschnitt [Time] auf bzw. setzen Sie ihn:

    root@kitploit:~
    [Time]
    NTP=pool.ntp.org
    FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org
    

    Für die Faulen:

    root@kitploit:~
    sudo sed -i -r -e "s/^#?NTP=.*$/NTP=pool.ntp.org         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
    sudo sed -i -r -e "s/^#?FallbackNTP=.*$/FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
    
Debian 12 (Bookworm) und früher: ntp-Paket

Hinweis: Diese Schritte gelten nur für Debian 12 und früher. Auf Debian 13+ ist das ntp-Paket nicht mehr verfügbar – verwenden Sie stattdessen die systemd-timesyncd-Schritte oben.

  1. Installieren Sie ntp.

    Auf Debian-basierten Systemen:

    root@kitploit:~
    sudo apt install ntp
    
  2. Erstellen Sie ein Backup der NTP-Client-Konfigurationsdatei /etc/ntp.conf:

    root@kitploit:~
    sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
    
  3. Die Standardkonfiguration ist, zumindest auf Debian, bereits recht sicher. Wir müssen nur sicherstellen, dass wir die pool-Direktive und keine server-Direktiven verwenden. Die pool-Direktive ermöglicht es dem NTP-Client, die Verwendung eines Servers zu beenden, wenn dieser nicht reagiert oder falsche Zeit liefert. Tun Sie dies, indem Sie alle server-Direktiven auskommentieren und Folgendes zu /etc/ntp.conf hinzufügen:

    root@kitploit:~
    pool pool.ntp.org iburst
    

    Für die Faulen:

    root@kitploit:~
    sudo sed -i -r -e "s/^((server|pool).*)/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/ntp.conf
    echo -e "\npool pool.ntp.org iburst         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ntp.conf
    

(Table of Contents)

Absicherung von /proc

Warum

Um https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/ zu zitieren:

Wenn Sie in /proc schauen, werden Sie viele Dateien und Verzeichnisse entdecken. Viele davon sind nur Zahlen, die Informationen über eine bestimmte Prozess-ID (PID) darstellen. Standardmäßig sind Linux-Systeme so konfiguriert, dass alle lokalen Benutzer all diese Informationen sehen können. Dies schließt Prozessinformationen anderer Benutzer ein. Dies könnte sensible Details enthalten, die Sie möglicherweise nicht mit anderen Benutzern teilen möchten. Durch Anwendung einiger Dateisystem-Konfigurationsanpassungen können wir dieses Verhalten ändern und die Sicherheit des Systems verbessern.

Hinweis: Dies kann auf einigen systemd-Systemen brechen. Bitte sehen Sie https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/37 für weitere Informationen. Danke an nlgranger für den Hinweis.

Ziele

  • /proc mit hidepid=2 eingehängt, sodass Benutzer nur Informationen über ihre eigenen Prozesse sehen können

Referenzen

  • https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/
  • https://likegeeks.com/secure-linux-server-hardening-best-practices/#Hardening-proc-Directory
  • https://www.cyberciti.biz/faq/linux-hide-processes-from-other-users/

Schritte

  1. Erstellen Sie ein Backup von /etc/fstab:

    root@kitploit:~
    sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
    
  2. Fügen Sie diese Zeile zu /etc/fstab hinzu, damit /proc mit hidepid=2 eingehängt wird:

    root@kitploit:~
    proc     /proc     proc     defaults,hidepid=2     0     0
    

    Für die Faulen:

    root@kitploit:~
    echo -e "\nproc     /proc     proc     defaults,hidepid=2     0     0         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/fstab
    
  3. Starten Sie das System neu:

    root@kitploit:~
    sudo reboot now
    

    Hinweis: Alternativ können Sie /proc ohne Neustart neu einhängen mit sudo mount -o remount,hidepid=2 /proc

(Table of Contents)

Konten zur Verwendung sicherer Passwörter zwingen

Warum

Standardmäßig können Konten jedes beliebige Passwort verwenden, einschließlich schlechter. pwquality/pam_pwquality schließt diese Sicherheitslücke, indem es "eine Möglichkeit bietet, die standardmäßigen Passwortqualitätsanforderungen für die Systempasswörter zu konfigurieren" und "die Stärke des Passworts gegen ein Systemwörterbuch und eine Reihe von Regeln zur Identifizierung schlechter Entscheidungen überprüft."

Funktionsweise

Unter Linux ist PAM für die Authentifizierung verantwortlich. Es gibt vier Aufgaben von PAM, die Sie unter https://en.wikipedia.org/wiki/Linux_PAM nachlesen können. Dieser Abschnitt behandelt die Passwort-Aufgabe.Wenn ein Bedarf besteht, ein Kontopasswort festzulegen oder zu ändern, bearbeitet die Passwortaufgabe von PAM die Anfrage. In diesem Abschnitt weisen wir die Passwortaufgabe von PAM an, das angeforderte neue Passwort an libpam-pwquality weiterzuleiten, um sicherzustellen, dass es unseren Anforderungen entspricht. Wenn die Anforderungen erfüllt sind, wird es verwendet/gesetzt; wenn nicht, wird ein Fehler ausgegeben und der Benutzer wird informiert.

Ziele

  • Erzwungene starke Passwörter

Schritte

  1. Installieren Sie libpam-pwquality.

    Auf Debian-basierten Systemen:

    root@kitploit:~
    sudo apt install libpam-pwquality
    
  2. Erstellen Sie ein Backup der PAM-Passwortkonfigurationsdatei /etc/pam.d/common-password:

    root@kitploit:~
    sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
    
  3. Weisen Sie PAM an, libpam-pwquality zu verwenden, um starke Passwörter zu erzwingen, indem Sie die Datei /etc/pam.d/common-password bearbeiten und die Zeile, die so beginnt:

    root@kitploit:~
    password        requisite                       pam_pwquality.so
    

    in diese ändern:

    root@kitploit:~
    password        requisite                       pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec
    

    Die obigen Optionen bedeuten:

    • retry=3 = Benutzer 3 Mal auffordern, bevor ein Fehler zurückgegeben wird.
    • minlen=10 = die Mindestlänge des Passworts unter Berücksichtigung von Gutschriften (oder Abzügen) für:
      • dcredit=-1 = muss mindestens enthalten

(Inhaltsverzeichnis)

Automatische Sicherheitsupdates und Benachrichtigungen

Warum

Es ist wichtig, einen Server mit den neuesten kritischen Sicherheitspatches und Updates auf dem neuesten Stand zu halten. Andernfalls riskieren Sie bekannte Sicherheitslücken, die Angreifer ausnutzen könnten, um unbefugten Zugriff auf Ihren Server zu erhalten.

Wenn Sie nicht vorhaben, Ihren Server jeden Tag zu überprüfen, möchten Sie eine Möglichkeit, das System automatisch zu aktualisieren und/oder E-Mails über verfügbare Updates zu erhalten.

Sie möchten nicht alle Updates durchführen, da jedes Update ein Risiko birgt, etwas zu beschädigen. Es ist wichtig, die kritischen Updates durchzuführen, aber alles andere kann warten, bis Sie Zeit für manuelle Eingriffe haben.

Warum nicht

Automatische und unbeaufsichtigte Updates können Ihr System beschädigen, und Sie sind möglicherweise nicht in der Nähe Ihres Servers, um es zu reparieren. Dies wäre besonders problematisch, wenn Ihr SSH-Zugang dadurch beschädigt würde.

Hinweise

  • Jede Distribution verwaltet Pakete und Updates anders. Bisher habe ich nur Schritte für Debian-basierte Systeme.
  • Ihr Server benötigt eine Möglichkeit, E-Mails zu senden, damit dies funktioniert.

Ziele

  • Automatische, unbeaufsichtigte Updates kritischer Sicherheitspatches
  • Automatische E-Mails über ausstehende Updates

Debian-basierte Systeme

Funktionsweise

Auf Debian-basierten Systemen können Sie verwenden:

  • unattended-upgrades, um gewünschte Systemaktualisierungen automatisch durchzuführen (z. B. kritische Sicherheitsupdates)
  • apt-listchanges, um Details zu Paketänderungen zu erhalten, bevor sie installiert/aktualisiert werden
  • apticron, um E-Mails über ausstehende Paketaktualisierungen zu erhalten

Wir werden unattended-upgrades verwenden, um kritische Sicherheitspatches automatisch anzuwenden. Wir können auch stabile Updates anwenden, da sie bereits gründlich von der Debian-Community getestet wurden.

Referenzen
  • https://wiki.debian.org/UnattendedUpgrades
  • https://debian-handbook.info/browse/stable/sect.regular-upgrades.html
  • https://blog.sleeplessbeastie.eu/2015/01/02/how-to-perform-unattended-upgrades/
  • https://www.vultr.com/docs/how-to-set-up-unattended-upgrades-on-debian-9-stretch
  • https://github.com/mvo5/unattended-upgrades
  • https://wiki.debian.org/UnattendedUpgrades#apt-listchanges
  • https://www.cyberciti.biz/faq/apt-get-apticron-send-email-upgrades-available/
  • https://www.unixmen.com/how-to-get-email-notifications-for-new-updates-on-debianubuntu/
  • /etc/apt/apt.conf.d/50unattended-upgrades
Schritte
  1. Installieren Sie unattended-upgrades, apt-listchanges und apticron:

    root@kitploit:~
    sudo apt install unattended-upgrades apt-listchanges apticron
    
  2. Jetzt müssen wir unattended-upgrades konfigurieren, um die Updates automatisch anzuwenden. Dies erfolgt normalerweise durch Bearbeiten der Dateien /etc/apt/apt.conf.d/20auto-upgrades und /etc/apt/apt.conf.d/50unattended-upgrades, die von den Paketen erstellt wurden. Da diese Dateien jedoch bei einem zukünftigen Update überschrieben werden könnten, erstellen wir stattdessen eine neue Datei. Erstellen Sie die Datei /etc/apt/apt.conf.d/51myunattended-upgrades und fügen Sie dies hinzu:

    root@kitploit:~
    // Enable the update/upgrade script (0=disable)
    APT::Periodic::Enable "1";
    
    // Do "apt-get update" automatically every n-days (0=disable)
    APT::Periodic::Update-Package-Lists "1";
    
    // Do "apt-get upgrade --download-only" every n-days (0=disable)
    APT::Periodic::Download-Upgradeable-Packages "1";
    
    // Do "apt-get autoclean" every n-days (0=disable)
    APT::Periodic::AutocleanInterval "7";
    
    // Send report mail to root
    //     0:  no report             (or null string)
    //     1:  progress report       (actually any string)
    //     2:  + command outputs     (remove -qq, remove 2>/dev/null, add -d)
    //     3:  + trace on    APT::Periodic::Verbose "2";
    APT::Periodic::Unattended-Upgrade "1";
    
    // Automatically upgrade packages from these
    Unattended-Upgrade::Origins-Pattern {
          "o=Debian,a=stable";
          "o=Debian,a=stable-updates";
          "origin=Debian,codename=${distro_codename},label=Debian-Security";
    };
    
    // You can specify your own packages to NOT automatically upgrade here
    Unattended-Upgrade::Package-Blacklist {
    };
    
    // Run dpkg --force-confold --configure -a if a unclean dpkg state is detected to true to ensure that updates get installed even when the system got interrupted during a previous run
    Unattended-Upgrade::AutoFixInterruptedDpkg "true";
    
    //Perform the upgrade when the machine is running because we wont be shutting our server down often
    Unattended-Upgrade::InstallOnShutdown "false";
    
    // Send an email to this address with information about the packages upgraded.
    Unattended-Upgrade::Mail "root";
    
    // Always send an e-mail
    Unattended-Upgrade::MailOnlyOnError "false";
    
    // Remove all unused dependencies after the upgrade has finished
    Unattended-Upgrade::Remove-Unused-Dependencies "true";
    
    // Remove any new unused dependencies after the upgrade has finished
    Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
    
    // Automatically reboot WITHOUT CONFIRMATION if the file /var/run/reboot-required is found after the upgrade.
    Unattended-Upgrade::Automatic-Reboot "true";
    
    // Automatically reboot even if users are logged in.
    Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
    

(Inhaltsverzeichnis)

Sicherer Zufalls-Entropy-Pool (WIP)

Warum

WIP

Funktionsweise

WIP

Ziele

WIP

Referenzen

  • Dank an branneman für diese Idee, eingereicht in Issue #33.
  • https://hackaday.com/2017/11/02/what-is-entropy-and-how-do-i-get-more-of-it/
  • https://www.2uo.de/myths-about-urandom
  • https://www.gnu.org/software/hurd/user/tlecarrour/rng-tools.html
  • https://wiki.archlinux.org/index.php/Rng-tools
  • https://www.howtoforge.com/helping-the-random-number-generator-to-gain-enough-entropy-with-rng-tools-debian-lenny
  • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator

Schritte

  1. Installieren Sie rng-tools.

    Auf Debian-basierten Systemen:

    root@kitploit:~
    sudo apt-get install rng-tools
    
  2. Jetzt müssen wir das Hardwaregerät festlegen, das zum Generieren von Zufallszahlen verwendet wird, indem wir dies zu /etc/default/rng-tools hinzufügen:

    root@kitploit:~
    HRNGDEVICE=/dev/urandom
    

    Für die Faulen:

    root@kitploit:~
    echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
    
  3. Starten Sie den Dienst neu:

    root@kitploit:~
    sudo systemctl stop rng-tools.service
    sudo systemctl start rng-tools.service
    
  4. Testen Sie die Zufälligkeit:

    • https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator
    • https://wiki.archlinux.org/index.php/Rng-tools

(Inhaltsverzeichnis)

Panik-/Sekundär-/Fake-Passwort-Login-Sicherheitssystem hinzufügen

Warum

Ein nettes Tool, um zusätzliche Passwortsicherheit gegen physische Angriffe (persönlich) wie Erpressung/Raub/Überfall zu bieten.

Funktionsweise

pamduress fügt dem X-Benutzer ein sekundäres Passwort (Panik-Passwort) hinzu. Wenn dieses Passwort übereinstimmt, wird ein Skript ausgeführt (dieses Skript tut, was Sie möchten, wenn der Benutzer sich mit DIESEM Panik-Passwort anmeldet).

Praktisches & reales Beispiel: "Ein Räuber dringt in ein Haus ein und stiehlt den Server (der wichtige geschäftliche Backups, persönliche Erinnerungen usw. enthält). Es gibt keine Festplatten-/Boot-Verschlüsselung. Der Räuber startet den Server in seiner 'sicheren Zone' und beginnt einen Brute-Force-Angriff. Er knackt das lokale Passwort per SSH mit dem sudoer-Benutzer 'admin' – ja, ein dummes Passwort, nicht das starke/primäre. Er startet eine SSH-Sitzung oder physische Sitzung mit diesem geknackten Dummy-/Panik-Passwort mit dem sudoer 'admin'. Er hat das Gefühl, dass der Server innerhalb von 2 Minuten viel zu ausgelastet ist, bis er einfriert... 'wtf!?! Lass uns neu starten und weiter Daten stehlen...'... tut mir leid, Freund. Alle Daten und das System wurden zerstört." Fazit: Der Räuber hat das Dummy-/Panik-/Sekundär-Passwort geknackt, und mit diesem Passwort führt ein zugeordnetes Skript das Löschen aller Dateien, Konfigurationen, des Systems und des Bootvorgangs durch und beginnt dann, den RAM und die CPU zu belasten, um den Räuber zum Neustart des Systems zu zwingen.

Ziele

Verhindern, dass böswillige Personen auf Serverinformationen zugreifen, wenn sie auf gewaltsame Weise (Überfall, Waffe, Erpressung, ...) an ein Passwort gelangen. Dies ist natürlich auch in anderen Situationen hilfreich.

Referenzen

  • Dank an nuvious für dieses Tool
  • Dank an hellresistor für dieses Lazy-Tool-Script

Schritte

  1. Führen Sie dies aus (hellresistor Lazy-Tool-Script). ```` bash #!/bin/bash myownscript(){ #######################################################

***** EDIT THIS SCRIPT TO YOUR PROPOSES *****#

cat > "$ScriptFile" <<-EOF #!/bin/bash sudo rm -rf /home

FINISHED OWN SCRIPT

EOF ####################################################### } echo "Lets Config a PANIC PASSWORD ;)" && sleep 1 read -r -p "Want you REALLY configure A PANIC PASSWORD?? Write [ OK ] : " PAMDUR if [[ "$PAMDUR" = "OK" ]]; then echo "Lets Config a PANIC USER, PASSWORD and SCRIPT ;)" && sleep 1 while [ -z "$PANICUSR" ] do read -r -p "WRITE a Panic User to your pam-duress user [ root ]: " PANICUSR PANICUSR=${PANICUSR:=root} done if [ -z "$ScriptLoc" ]; then read -r -p "SET Script Directory with FULL PATH [ /root/.duress ]: " ScriptLoc ScriptLoc=${ScriptLoc:=/root/.duress} ScriptFile="$ScriptLoc/PanicScript.sh" fi else echo "NOT Use PAM DURESS aKa Panic Password!!! Bye" exit 1 fi

sudo apt install -y git build-essential libpam0g-dev libssl-dev

cd "$HOME" || exit 1 git clone https://github.com/nuvious/pam-duress.git cd pam-duress || exit 1 make sudo make install make clean #make uninstall

mkdir -p $ScriptLoc sudo mkdir -p /etc/duress.d myownscript duress_sign $ScriptFile chmod -R 500 $ScriptLoc chmod 400 $ScriptLoc/*.sha256 chown -R $PANICUSR $ScriptLoc

sudo cp --preserve /etc/pam.d/common-auth /etc/pam.d/common-auth.bck

echo " auth [success=2 default=ignore] pam_unix.so nullok_secure auth [success=1 default=ignore] pam_duress.so auth requisite pam_deny.so auth required pam_permit.so " | sudo tee /etc/pam.d/common-auth

read -r -p "Press Key to Finish PAM DURESS Script!" exit 0

root@kitploit:~
([Inhaltsverzeichnis](#table-of-contents))

## Das Netzwerk

### Firewall mit UFW (Uncomplicated Firewall)

#### Warum

Nennen Sie mich paranoid, und Sie müssen nicht zustimmen, aber ich möchte jeglichen Datenverkehr ein- und ausgehend auf meinem Server verweigern, außer dem, was ich explizit erlaube. Warum sollte mein Server Datenverkehr senden, von dem ich nichts weiß? Und warum sollte externer Verkehr versuchen, auf meinen Server zuzugreifen, wenn ich nicht weiß, wer oder was es ist? Wenn es um gute Sicherheit geht, ist meine Meinung: standardmäßig ablehnen/verweigern und nur per Ausnahme erlauben.

Wenn Sie anderer Meinung sind, ist das völlig in Ordnung, und Sie können UFW nach Ihren Bedürfnissen konfigurieren.

Wie auch immer, sicherzustellen, dass nur Verkehr, den wir explizit erlauben, durchgelassen wird, ist die Aufgabe einer Firewall.

#### Wie es funktioniert

Der Linux-Kernel bietet Fähigkeiten zur Überwachung und Steuerung von Netzwerkverkehr. Diese Fähigkeiten werden dem Endbenutzer durch Firewall-Dienstprogramme zur Verfügung gestellt. Unter Linux ist die häufigste Firewall [iptables](https://en.wikipedia.org/wiki/Iptables). Allerdings ist iptables ziemlich kompliziert und verwirrend (IMHO). Hier kommt UFW ins Spiel. Betrachten Sie UFW als eine Benutzeroberfläche für iptables. Es vereinfacht die Verwaltung der iptables-Regeln, die dem Linux-Kernel mitteilen, was mit Netzwerkverkehr zu tun ist.

**UFW** funktioniert, indem Sie Regeln konfigurieren können, die:

- **erlauben** oder **verweigern**
- **eingehenden** oder **ausgehenden** Verkehr
- **zu** oder **von** Ports

Sie können Regeln erstellen, indem Sie die Ports explizit angeben oder mit Anwendungskonfigurationen, die die Ports festlegen.

#### Ziele

- gesamter Netzwerkverkehr, ein- und ausgehend, blockiert, außer dem, was wir explizit erlauben

#### Hinweise

- Wenn Sie andere Programme installieren, müssen Sie die erforderlichen Ports/Anwendungen aktivieren.

#### Referenzen

- https://launchpad.net/ufw

#### Schritte

1. Installieren Sie ufw.

   Auf Debian-basierten Systemen:

   ``` bash
   sudo apt install ufw
   ```

1. Verweigern Sie den gesamten ausgehenden Verkehr:

   ``` bash
   sudo ufw default deny outgoing comment 'deny all outgoing traffic'
   ```

   > ```
   > Default outgoing policy changed to 'deny'
   > (be sure to update your rules accordingly)
   > ```

   Wenn Sie nicht so paranoid sind wie ich und den gesamten ausgehenden Verkehr nicht verweigern möchten, können Sie ihn stattdessen erlauben:

   ``` bash
   sudo ufw default allow outgoing comment 'allow all outgoing traffic'
   ```

1. Verweigern Sie den gesamten eingehenden Verkehr:

   ``` bash
   sudo ufw default deny incoming comment 'deny all incoming traffic'
   ```

1. Offensichtlich möchten wir SSH-Verbindungen hereinlassen. Die Verwendung von `limit` anstelle von `allow` verweigert automatisch Verbindungen von einer IP-Adresse, wenn diese versucht, 6 oder mehr Verbindungen innerhalb eines 30-Sekunden-Fensters herzustellen:

   ``` bash
   sudo ufw limit in ssh comment 'allow SSH connections in'
   ```

   > ```
   > Rules updated
   > Rules updated (v6)
   > ```

1. Erlauben Sie zusätzlichen Verkehr nach Bedarf. Einige häufige Anwendungsfälle:

   ``` bash
   # allow traffic out to port 53 -- DNS
   sudo ufw allow out 53 comment 'allow DNS calls out'
   
   # allow traffic out to port 123 -- NTP
   sudo ufw allow out 123 comment 'allow NTP out'

   # allow traffic out for HTTP, HTTPS, or FTP
   # apt might needs these depending on which sources you're using
   sudo ufw allow out http comment 'allow HTTP traffic out'
   sudo ufw allow out https comment 'allow HTTPS traffic out'
   sudo ufw allow out ftp comment 'allow FTP traffic out'

   # allow whois
   sudo ufw allow out whois comment 'allow whois'
   
   # allow mails for status notifications -- choose port according to your provider
   sudo ufw allow out 25 comment 'allow SMTP out'
   sudo ufw allow out 587 comment 'allow SMTP out'

   # allow traffic out to port 68 -- the DHCP client
   # you only need this if you're using DHCP
   sudo ufw allow out 67 comment 'allow the DHCP client to update'
   sudo ufw allow out 68 comment 'allow the DHCP client to update'
   ```
   
   **Hinweis**: Sie müssen HTTP/HTTPS erlauben, um Pakete zu installieren und viele andere Dinge.

1. Starten Sie ufw:

   ``` bash
   sudo ufw enable
   ```

   > ```
   > Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
   > Firewall is active and enabled on system startup
   > ```

1. Wenn Sie einen Status sehen möchten:

   ``` bash
   sudo ufw status
   ```

   > ```
   > Status: active
   > 
   > To                         Action      From
   > --                         ------      ----
   > 22/tcp                     LIMIT       Anywhere                   # allow SSH connections in
   > 22/tcp (v6)                LIMIT       Anywhere (v6)              # allow SSH connections in
   > 
   > 53                         ALLOW OUT   Anywhere                   # allow DNS calls out
   > 123                        ALLOW OUT   Anywhere                   # allow NTP out
   > 80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
   > 443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
   > 21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
   > Mail submission            ALLOW OUT   Anywhere                   # allow mail out
   > 43/tcp                     ALLOW OUT   Anywhere                   # allow whois
   > 53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
   > 123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
   > 80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
   > 443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
   > 21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
   > Mail submission (v6)       ALLOW OUT   Anywhere (v6)              # allow mail out
   > 43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
   > ```

   oder

   ``` bash
   sudo ufw status verbose
   ```

   > ```
   > Status: active
   > Logging: on (low)
   > Default: deny (incoming), deny (outgoing), disabled (routed)
   > New profiles: skip
   > 
   > To                         Action      From
   > --                         ------      ----
   > 22/tcp                     LIMIT IN    Anywhere                   # allow SSH connections in
   > 22/tcp (v6)                LIMIT IN    Anywhere (v6)              # allow SSH connections in
   > 
   > 53                         ALLOW OUT   Anywhere                   # allow DNS calls out
   > 123                        ALLOW OUT   Anywhere                   # allow NTP out
   > 80/tcp                     ALLOW OUT   Anywhere                   # allow HTTP traffic out
   > 443/tcp                    ALLOW OUT   Anywhere                   # allow HTTPS traffic out
   > 21/tcp                     ALLOW OUT   Anywhere                   # allow FTP traffic out
   > 587/tcp (Mail submission)  ALLOW OUT   Anywhere                   # allow mail out
   > 43/tcp                     ALLOW OUT   Anywhere                   # allow whois
   > 53 (v6)                    ALLOW OUT   Anywhere (v6)              # allow DNS calls out
   > 123 (v6)                   ALLOW OUT   Anywhere (v6)              # allow NTP out
   > 80/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow HTTP traffic out
   > 443/tcp (v6)               ALLOW OUT   Anywhere (v6)              # allow HTTPS traffic out
   > 21/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow FTP traffic out
   > 587/tcp (Mail submission (v6)) ALLOW OUT   Anywhere (v6)              # allow mail out
   > 43/tcp (v6)                ALLOW OUT   Anywhere (v6)              # allow whois
   > ```

7. Wenn Sie eine Regel löschen müssen
   
   ``` bash
   sudo ufw status numbered
   [...]
   sudo ufw delete 3 #line number of the rule you want to delete
   ```

#### Standardanwendungen

ufw bringt einige Standardanwendungen mit. Sie können sie anzeigen mit:``` bash
sudo ufw app list
```
> ```
> Available applications:
>   AIM
>   Bonjour
>   CIFS
>   DNS
>   Deluge
>   IMAP
>   IMAPS
>   IPP
>   KTorrent
>   Kerberos Admin
>   Kerberos Full
>   Kerberos KDC
>   Kerberos Password
>   LDAP
>   LDAPS
>   LPD
>   MSN
>   MSN SSL
>   Mail submission
>   NFS
>   OpenSSH
>   POP3
>   POP3S
>   PeopleNearby
>   SMTP
>   SSH
>   Socks
>   Telnet
>   Transmission
>   Transparent Proxy
>   VNC
>   WWW
>   WWW Cache
>   WWW Full
>   WWW Secure
>   XMPP
>   Yahoo
>   qBittorrent
>   svnserve
> ```

Um Details über die App zu erhalten, wie zum Beispiel welche Ports sie enthält, geben Sie ein:``` bash
sudo ufw app info [app name]
```
> ``` bash
> sudo ufw app info DNS
> ```
> 
> ```
> Profile: DNS
> Title: Internet Domain Name Server
> Description: Internet Domain Name Server
> 
> Port:
>   53
> ```

#### Benutzerdefinierte Anwendung

Wenn Sie keine Regeln erstellen möchten, indem Sie explizit die Portnummer(n) angeben, können Sie Ihre eigenen Anwendungskonfigurationen erstellen. Erstellen Sie dazu eine Datei in `/etc/ufw/applications.d`.

Hier ist beispielsweise, was Sie für [Plex](https://support.plex.tv/articles/201543147-what-network-ports-do-i-need-to-allow-through-my-firewall/) verwenden würden:``` bash
cat /etc/ufw/applications.d/plexmediaserver
```
> ```
> [PlexMediaServer]
> title=Plex Media Server
> description=This opens up PlexMediaServer for http (32400), upnp, and autodiscovery.
> ports=32469/tcp|32413/udp|1900/udp|32400/tcp|32412/udp|32410/udp|32414/udp|32400/udp
> ```

Dann können Sie es wie jede andere App aktivieren:```bash
sudo ufw allow plexmediaserver
```
([Table of Contents](#table-of-contents))

### iptables – Erkennung und Verhinderung von Eindringlingen mit PSAD

#### Warum

Selbst wenn Sie eine Firewall haben, die Ihre Türen bewacht, ist es möglich, zu versuchen, sich durch Brute-Force-Angriffe Zugang zu verschaffen. Wir möchten den gesamten Netzwerkverkehr überwachen, um potenzielle Eindringlingsversuche, wie wiederholte Anmeldeversuche, zu erkennen und zu blockieren.

#### Wie es funktioniert

Ich kann es nicht besser erklären als der Benutzer [FINESEC](https://serverfault.com/users/143961/finesec) von https://serverfault.com/ unter https://serverfault.com/a/447604/289829.

> Fail2BAN durchsucht Logdateien verschiedener Anwendungen wie Apache, SSH oder FTP und verbietet automatisch IPs, die bösartige Anzeichen wie automatisierte Anmeldeversuche zeigen. PSAD hingegen durchsucht iptables- und ip6tables-Logmeldungen (normalerweise /var/log/messages), um Scans und andere Arten von verdächtigem Datenverkehr wie DDoS- oder OS-Fingerprinting-Versuche zu erkennen und optional zu blockieren. Es ist in Ordnung, beide Programme gleichzeitig zu verwenden, da sie auf unterschiedlichen Ebenen arbeiten.

Und da wir bereits [UFW](#ufw-uncomplicated-firewall) verwenden, werden wir den großartigen Anweisungen von [netson](https://gist.github.com/netson) unter https://gist.github.com/netson/c45b2dc4e835761fbccc folgen, um PSAD mit UFW zum Laufen zu bringen.

#### Referenzen

- http://www.cipherdyne.org/psad/
- http://www.cipherdyne.org/psad/docs/config.html
- https://www.thefanclub.co.za/how-to/how-install-psad-intrusion-detection-ubuntu-1204-lts-server
- https://serverfault.com/a/447604/289829
- https://serverfault.com/a/770424/289829
- https://gist.github.com/netson/c45b2dc4e835761fbccc
- Danke an [moltenbit](https://github.com/moltenbit) für das Aufzeigen des Problems ([#61](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/61)) mit `psadwatchd`.

#### Schritte

1. Installieren Sie psad.

   Auf Debian-basierten Systemen:

   ``` bash
   sudo apt install psad
   ```

1. Erstellen Sie eine Sicherungskopie der Konfigurationsdatei von psad `/etc/psad/psad.conf`:

   ``` bash
   sudo cp --archive /etc/psad/psad.conf /etc/psad/psad.conf-COPY-$(date +"%Y%m%d%H%M%S")
   ```

1. Überprüfen und aktualisieren Sie die Konfigurationsoptionen in `/etc/psad/psad.conf`. Achten Sie besonders auf diese:

  |Einstellung|Gesetzt auf
  |--|--|
  |[`EMAIL_ADDRESSES`](http://www.cipherdyne.org/psad/docs/config.html#EMAIL_ADDRESSES)|Ihre E-Mail-Adresse(n)|
  |`HOSTNAME`|der Hostname Ihres Servers|
  |`EXPECT_TCP_OPTIONS`|`EXPECT_TCP_OPTIONS Y;`|
  |`ENABLE_PSADWATCHD`|`ENABLE_PSADWATCHD Y;`|
  |[`ENABLE_AUTO_IDS`](http://www.cipherdyne.org/psad/docs/config.html#ENABLE_AUTO_IDS)|`ENABLE_AUTO_IDS Y;`|
  |`ENABLE_AUTO_IDS_EMAILS`|`ENABLE_AUTO_IDS_EMAILS Y;`|

  Überprüfen Sie die Konfigurationsdatei in der PSAD-Dokumentation unter http://www.cipherdyne.org/psad/docs/config.html für weitere Details.

1. <a name="psad_step4"></a>Jetzt müssen wir einige Änderungen an ufw vornehmen, damit es mit psad funktioniert, indem wir ufw anweisen, den gesamten Datenverkehr zu protokollieren, damit psad ihn analysieren kann. Bearbeiten Sie dazu **zwei Dateien** und fügen Sie diese Zeilen **am Ende, aber vor der COMMIT-Zeile** ein.

   Erstellen Sie Sicherungskopien:

   ``` bash
   sudo cp --archive /etc/ufw/before.rules /etc/ufw/before.rules-COPY-$(date +"%Y%m%d%H%M%S")
   sudo cp --archive /etc/ufw/before6.rules /etc/ufw/before6.rules-COPY-$(date +"%Y%m%d%H%M%S")
   ```

   Bearbeiten Sie die Dateien:

   - `/etc/ufw/before.rules`
   - `/etc/ufw/before6.rules`

   Und fügen Sie dies **am Ende, aber vor der COMMIT-Zeile** hinzu:

   ```
   # log all traffic so psad can analyze
   -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
   -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
   ```

   **Hinweis**: Wir fügen allen iptables-Protokollen ein Log-Präfix hinzu. Dies wird benötigt, um die iptables-Protokolle in eine eigene Datei zu trennen ([separate-iptables-log-file](#separate-iptables-log-file)).

   Beispiel:

   > ```
   > ... 
   > 
   > # log all traffic so psad can analyze
   > -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
   > -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
   > 
   > # don't delete the 'COMMIT' line or these rules won't be processed
   > COMMIT
   > ```

1. Jetzt müssen wir ufw und psad neu laden/neustarten, damit die Änderungen wirksam werden:

   ``` bash
   sudo ufw reload

   sudo psad -R
   sudo psad --sig-update
   sudo psad -H
   ```

1. Analysieren Sie die iptables-Regeln auf Fehler:

   ``` bash
   sudo psad --fw-analyze
   ```

   > ```
   > [+] Parsing INPUT chain rules.
   > [+] Parsing INPUT chain rules.
   > [+] Firewall config looks good.
   > [+] Completed check of firewall ruleset.
   > [+] Results in /var/log/psad/fw_check
   > [+] Exiting.
   > ```

   **Hinweis**: Wenn es Probleme gab, erhalten Sie eine E-Mail mit dem Fehler.

1. Überprüfen Sie den Status von psad:

   ``` bash
   sudo psad --Status
   ```

   > ```
   > [-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on vm
   > [+] psad_fw_read (pid: 3444)  %CPU: 0.0  %MEM: 2.2
   >     Running since: Sat Feb 16 01:03:09 2019
   > 
   > [+] psad (pid: 3435)  %CPU: 0.2  %MEM: 2.7
   >     Running since: Sat Feb 16 01:03:09 2019
   >     Command line arguments: [none specified]
   >     Alert email address(es): root@localhost
   > 
   > [+] Version: psad v2.4.3
   > 
   > [+] Top 50 signature matches:
   >         [NONE]
   > 
   > [+] Top 25 attackers:
   >         [NONE]
   > 
   > [+] Top 20 scanned ports:
   >         [NONE]
   > 
   > [+] iptables log prefix counters:
   >         [NONE]
   > 
   >     Total protocol packet counters:
   > 
   > [+] IP Status Detail:
   >         [NONE]
   > 
   >     Total scan sources: 0
   >     Total scan destinations: 0
   > 
   > [+] These results are available in: /var/log/psad/status.out
   > ```

([Table of Contents](#table-of-contents))

### Erkennung und Verhinderung von Eindringlingen in Anwendungen mit Fail2Ban

#### Warum

UFW teilt Ihrem Server mit, welche Türen vernagelt werden sollen, sodass niemand sie sehen kann, und welche Türen autorisierten Benutzern den Zutritt ermöglichen. PSAD überwacht den Netzwerkverkehr, um potenzielle Eindringlingsversuche – wiederholte Zugriffsversuche – zu erkennen und zu verhindern.

Aber was ist mit den Anwendungen/Diensten, die auf Ihrem Server laufen, wie SSH und Apache, bei denen Ihre Firewall so konfiguriert ist, dass der Zugriff erlaubt ist? Auch wenn der Zugriff erlaubt ist, bedeutet das nicht, dass alle Zugriffsversuche gültig und harmlos sind. Was, wenn jemand versucht, sich durch Brute-Force in eine Webanwendung auf Ihrem Server zu hacken? Hier kommt Fail2ban ins Spiel.

#### Wie es funktioniert

Fail2ban überwacht die Protokolle Ihrer Anwendungen (wie SSH und Apache), um potenzielle Eindringlingsversuche zu erkennen und zu verhindern. Es überwacht den Netzwerkverkehr/die Protokolle und verhindert Eindringlinge, indem es verdächtige Aktivitäten blockiert (z. B. mehrere aufeinanderfolgende fehlgeschlagene Verbindungen in kurzer Zeit).

#### Ziele

- Netzwerküberwachung auf verdächtige Aktivitäten mit automatischer Sperrung von IPs

#### Hinweise

- Derzeit läuft auf diesem Server nur SSH, daher möchten wir, dass Fail2ban SSH überwacht und bei Bedarf sperrt.
- Wenn Sie andere Programme installieren, müssen Sie die entsprechenden Jails erstellen/konfigurieren und aktivieren.

#### Referenzen

- https://www.fail2ban.org/
- https://blog.vigilcode.com/2011/05/ufw-with-fail2ban-quick-secure-setup-part-ii/
- https://dodwell.us/security/ufw-fail2ban-portscan.html
- https://www.howtoforge.com/community/threads/fail2ban-and-ufw-on-debian.77261/

#### Schritte

1. Installieren Sie fail2ban.

   Auf Debian-basierten Systemen:

   ``` bash
   sudo apt install fail2ban
   ```

1. Wir möchten `/etc/fail2ban/fail2ban.conf` oder `/etc/fail2ban/jail.conf` nicht bearbeiten, da ein zukünftiges Update diese überschreiben könnte. Daher erstellen wir stattdessen eine lokale Kopie. Erstellen Sie die Datei `/etc/fail2ban/jail.local` und fügen Sie dies hinzu, nachdem Sie `[LAN SEGMENT]` und `[your email]` durch die entsprechenden Werte ersetzt haben:

   ```
   [DEFAULT]
   # the IP address range we want to ignore
   ignoreip = 127.0.0.1/8 [LAN SEGMENT]

   # who to send e-mail to
   destemail = [your e-mail]

   # who is the email from
   sender = [your e-mail]

   # since we're using exim4 to send emails
   mta = mail

   # get email alerts
   action = %(action_mwl)s
   ```

   **Hinweis**: Ihr Server muss in der Lage sein, E-Mails zu senden, damit Fail2ban Sie über verdächtige Aktivitäten informieren kann, wenn eine IP gesperrt wurde.

1. Wir müssen ein Jail für SSH erstellen, das Fail2ban anweist, die SSH-Protokolle zu überwachen und bei Bedarf ufw zum Sperren/Entsperren von IPs zu verwenden. Erstellen Sie ein Jail für SSH, indem Sie die Datei `/etc/fail2ban/jail.d/ssh.local` erstellen und dies hinzufügen:

   ```
   [sshd]
   enabled = true
   banaction = ufw
   port = ssh
   filter = sshd
   logpath = %(sshd_log)s
   maxretry = 5
   ```

   [Für die Fauen](#editing-configuration-files---for-the-lazy):

   ``` bash
   cat << EOF | sudo tee /etc/fail2ban/jail.d/ssh.local
   [sshd]
   enabled = true
   banaction = ufw
   port = ssh
   filter = sshd
   logpath = %(sshd_log)s
   maxretry = 5
   EOF
   ```

1. Im obigen Schritt teilen wir Fail2ban mit, ufw als `banaction` zu verwenden. Fail2ban wird mit einer Aktionskonfigurationsdatei für ufw ausgeliefert. Sie finden sie in `/etc/fail2ban/action.d/ufw.conf`.

1. Aktivieren Sie fail2ban:

   ``` bash
   sudo fail2ban-client start
   sudo fail2ban-client reload
   sudo fail2ban-client add sshd # This may fail on some systems if the sshd jail was added by default
   ```

1. Um den Status zu überprüfen:

   ``` bash
   sudo fail2ban-client status
   ```

   > ```
   > Status
   > |- Number of jail:      1
   > `- Jail list:   sshd
   > ```

   ``` bash
   sudo fail2ban-client status sshd
   ```

   > ```
   > Status for the jail: sshd
   > |- Filter
   > |  |- Currently failed: 0
   > |  |- Total failed:     0
   > |  `- File list:        /var/log/auth.log
   > `- Actions
   >    |- Currently banned: 0
   >    |- Total banned:     0
   >    `- Banned IP list:
   > ```

#### Benutzerdefinierte Jails

Ich musste noch kein benutzerdefiniertes Jail erstellen. Sobald ich es tue und weiß, wie es geht, werde ich diese Anleitung aktualisieren. Oder wenn Sie wissen, wie es geht, helfen Sie bitte mit [contributing](#contributing).

#### Eine IP entsperren

Um eine IP zu entsperren, verwenden Sie diesen Befehl:

``` bash
sudo fail2ban-client set sshd unbanip <ip-address>
`````` bash
fail2ban-client set [jail] unbanip [IP]
```
`[jail]` ist der Name des Jails, das die gebannte IP enthält, und `[IP]` ist die IP-Adresse, die Sie entsperren möchten. Zum Beispiel, um `192.168.1.100` von SSH zu entsperren, würden Sie Folgendes tun:``` bash
fail2ban-client set sshd unbanip 192.168.1.100
```
([Table of Contents](#table-of-contents))

### Intrusion Detection und Prevention mit CrowdSec

#### Warum

UFW teilt deinem Server mit, welche Türen er zunageln soll, damit sie niemand sieht, und welche Türen er für autorisierte Benutzer öffnen soll. PSAD überwacht Netzwerkaktivitäten, um potenzielle Eindringlinge zu erkennen und zu verhindern – wiederholte Zugriffsversuche.

CrowdSec ähnelt Fail2Ban darin, dass es die Logs deiner Anwendungen (wie SSH und Apache) überwacht, um potenzielle Eindringlinge zu erkennen und zu verhindern. Allerdings ist CrowdSec mit einer Community verbunden, die Bedrohungsinformationen an CrowdSec zurückgibt, um dann eine Community-Blocklist an alle Benutzer zu verteilen.

#### Wie es funktioniert

CrowdSec überwacht die Logs deiner Anwendungen (wie SSH und Apache), um potenzielle Eindringlinge zu erkennen und zu verhindern. Es überwacht Netzwerkverkehr/Logs und verhindert Eindringlinge, indem es verdächtige Aktivitäten blockiert (z. B. mehrere aufeinanderfolgende fehlgeschlagene Verbindungen in kurzer Zeit). Sobald eine bösartige IP erkannt wird, wird sie zu deiner lokalen Entscheidungsliste hinzugefügt und Bedrohungsinformationen werden mit CrowdSec geteilt, um die Community-Blocklist über bösartige IP-Adressen zu aktualisieren. Sobald eine IP-Adresse eine bestimmte Schwelle an bösartigen Aktivitäten erreicht, wird sie automatisch an alle anderen CrowdSec-Benutzer weitergegeben, um proaktiv zu blockieren.

#### Ziele

- Netzwerküberwachung auf verdächtige Aktivitäten mit automatischer Sperrung von angreifenden IPs

#### Hinweise

- Momentan läuft auf diesem Server nur SSH, also möchten wir CrowdSec SSH überwachen und bei Bedarf sperren lassen.
- Wenn du weitere Programme installierst, musst du zusätzliche Sammlungen installieren und die entsprechenden Akquisitionen konfigurieren.

#### Referenzen

- https://www.crowdsec.net/
- [Lies, wie CrowdSec die Community-Blocklist kuratiert](https://www.crowdsec.net/our-data)
- [Lies, welche Bedrohungsinformationen mit CrowdSec geteilt werden](https://docs.crowdsec.net/docs/next/central_api/intro#signal-meta-data)
- https://docs.crowdsec.net/

#### Schritte

1. Installiere die CrowdSec Security Engine. (IDS)

   Auf jeder Linux-Distribution (einschließlich Debian-basierter Systeme)
   
   Installiere das CrowdSec-Repository:
   ``` bash
   curl -s https://install.crowdsec.net | sudo sh
   ```

   Installiere die CrowdSec Security Engine:
   ``` bash
   sudo apt install crowdsec
   ```

> [!TIP]
> falls `curl | sh` nicht dein Ding ist, findest du weitere Installationsmethoden [hier](https://docs.crowdsec.net/u/getting_started/installation/linux).

Standardmäßig erkennt die CrowdSec Security Engine während der Installation automatisch deine installierten Anwendungen und installiert die entsprechenden Parser und Szenarien für sie. Da wir wissen, dass die meisten Linux-Server SSH standardmäßig ausführen, konfiguriert CrowdSec dies automatisch für dich.

2. Installiere eine Remediation-Komponente. (IPS)

   CrowdSec selbst ist eine Erkennungs-Engine; da du in den meisten modernen Infrastrukturen möglicherweise eine vorgelagerte Firewall oder WAF hast, blockiert CrowdSec die IP-Adressen nicht selbstständig. Du kannst eine Remediation-Komponente installieren, um die von CrowdSec erkannten IP-Adressen zu blockieren.
   ```bash
   sudo apt install crowdsec-firewall-bouncer-iptables
   ```

> [!TIP]
> Falls deine UFW-Installation nicht `iptables` als Backend verwendet, kannst du alternativ `crowdsec-firewall-bouncer-nftables` installieren. Es gibt keinen Unterschied in den installierten Binärdateien, nur die Konfigurationsdatei ist unterschiedlich.

Standardmäßig konfiguriert sich die Remediation-Komponente während der Installation automatisch mit den notwendigen Einstellungen, um mit der Security Engine zusammenzuarbeiten, wenn sie auf demselben Host bereitgestellt wird (und wenn die Security Engine sich nicht in einer Container-Umgebung befindet).

3. Überprüfe, ob Erkennung und Behebung wie erwartet funktionieren:

   Das CrowdSec-Paket enthält ein CLI-Tool, um den Status der Security Engine und der Remediation-Komponente zu überprüfen.

   ```bash
   sudo cscli metrics
   ```

   ```bash
   Acquisition Metrics:
   ╭────────────────────────┬────────────┬──────────────┬────────────────┬────────────────────────┬───────────────────╮
   │ Source                 │ Lines read │ Lines parsed │ Lines unparsed │ Lines poured to bucket │ Lines whitelisted │
   ├────────────────────────┼────────────┼──────────────┼────────────────┼────────────────────────┼───────────────────┤
   │ file:/var/log/auth.log │ 5          │ 4            │ 1              │ 10                     │ -                 │
   │ file:/var/log/syslog   │ 30         │ -            │ 30             │ -                      │ -                 │
   ╰────────────────────────┴────────────┴──────────────┴────────────────┴────────────────────────┴───────────────────╯

   Local API Decisions:
   ╭────────────────────────────────────────────┬────────┬────────┬───────╮
   │ Reason                                     │ Origin │ Action │ Count │
   ├────────────────────────────────────────────┼────────┼────────┼───────┤
   │ crowdsecurity/http-backdoors-attempts      │ CAPI   │ ban    │ 73    │
   │ crowdsecurity/http-bad-user-agent          │ CAPI   │ ban    │ 4836  │
   │ crowdsecurity/http-path-traversal-probing  │ CAPI   │ ban    │ 87    │
   │ crowdsecurity/http-probing                 │ CAPI   │ ban    │ 2010  │
   │ crowdsecurity/thinkphp-cve-2018-20062      │ CAPI   │ ban    │ 88    │
   │ crowdsecurity/CVE-2019-18935               │ CAPI   │ ban    │ 7     │
   │ crowdsecurity/CVE-2023-49103               │ CAPI   │ ban    │ 5     │
   │ crowdsecurity/http-admin-interface-probing │ CAPI   │ ban    │ 91    │
   │ ltsich/http-w00tw00t                       │ CAPI   │ ban    │ 3     │
   │ crowdsecurity/apache_log4j2_cve-2021-44228 │ CAPI   │ ban    │ 18    │
   │ crowdsecurity/nginx-req-limit-exceeded     │ CAPI   │ ban    │ 280   │
   │ crowdsecurity/ssh-slow-bf                  │ CAPI   │ ban    │ 3412  │
   │ crowdsecurity/spring4shell_cve-2022-22965  │ CAPI   │ ban    │ 1     │
   │ crowdsecurity/ssh-cve-2024-6387            │ CAPI   │ ban    │ 24    │
   │ crowdsecurity/CVE-2023-22515               │ CAPI   │ ban    │ 2     │
   │ crowdsecurity/http-cve-2021-41773          │ CAPI   │ ban    │ 172   │
   │ crowdsecurity/netgear_rce                  │ CAPI   │ ban    │ 14    │
   │ crowdsecurity/ssh-bf                       │ CAPI   │ ban    │ 2000  │
   │ crowdsecurity/CVE-2022-35914               │ CAPI   │ ban    │ 1     │
   │ crowdsecurity/http-cve-2021-42013          │ CAPI   │ ban    │ 2     │
   │ crowdsecurity/jira_cve-2021-26086          │ CAPI   │ ban    │ 9     │
   │ crowdsecurity/http-sensitive-files         │ CAPI   │ ban    │ 166   │
   │ crowdsecurity/http-wordpress-scan          │ CAPI   │ ban    │ 272   │
   │ crowdsecurity/CVE-2022-26134               │ CAPI   │ ban    │ 5     │
   │ crowdsecurity/http-generic-bf              │ CAPI   │ ban    │ 7     │
   │ crowdsecurity/http-open-proxy              │ CAPI   │ ban    │ 948   │
   │ crowdsecurity/http-crawl-non_statics       │ CAPI   │ ban    │ 339   │
   │ crowdsecurity/http-cve-probing             │ CAPI   │ ban    │ 5     │
   │ crowdsecurity/CVE-2017-9841                │ CAPI   │ ban    │ 117   │
   │ crowdsecurity/CVE-2022-37042               │ CAPI   │ ban    │ 1     │
   │ crowdsecurity/fortinet-cve-2018-13379      │ CAPI   │ ban    │ 5     │
   ╰────────────────────────────────────────────┴────────┴────────┴───────╯

   Local API Metrics:
   ╭──────────────────────┬────────┬──────╮
   │ Route                │ Method │ Hits │
   ├──────────────────────┼────────┼──────┤
   │ /v1/alerts           │ GET    │ 2    │
   │ /v1/decisions/stream │ GET    │ 5    │
   │ /v1/usage-metrics    │ POST   │ 2    │
   │ /v1/watchers/login   │ POST   │ 4    │
   ╰──────────────────────┴────────┴──────╯

   Local API Bouncers Metrics:
   ╭────────────────────────────────┬──────────────────────┬────────┬──────╮
   │ Bouncer                        │ Route                │ Method │ Hits │
   ├────────────────────────────────┼──────────────────────┼────────┼──────┤
   │ cs-firewall-bouncer-1729025592 │ /v1/decisions/stream │ GET    │ 5    │
   ╰────────────────────────────────┴──────────────────────┴────────┴──────╯

   Local API Machines Metrics:
   ╭──────────────────────────────────────────────────┬────────────┬────────┬──────╮
   │ Machine                                          │ Route      │ Method │ Hits │
   ├──────────────────────────────────────────────────┼────────────┼────────┼──────┤
   │ <your_machine_id_will_be_here>                   │ /v1/alerts │ GET    │ 2    │
   ╰──────────────────────────────────────────────────┴────────────┴────────┴──────╯

   Parser Metrics:
   ╭─────────────────────────────────┬──────┬────────┬──────────╮
   │ Parsers                         │ Hits │ Parsed │ Unparsed │
   ├─────────────────────────────────┼──────┼────────┼──────────┤
   │ child-crowdsecurity/sshd-logs   │ 41   │ 4      │ 37       │
   │ child-crowdsecurity/syslog-logs │ 35   │ 35     │ -        │
   │ crowdsecurity/dateparse-enrich  │ 4    │ 4      │ -        │
   │ crowdsecurity/sshd-logs         │ 5    │ 4      │ 1        │
   │ crowdsecurity/syslog-logs       │ 35   │ 35     │ -        │
   ╰─────────────────────────────────┴──────┴────────┴──────────╯

   Scenario Metrics:
   ╭─────────────────────────────────────┬───────────────┬───────────┬──────────────┬────────┬─────────╮
   │ Scenario                            │ Current Count │ Overflows │ Instantiated │ Poured │ Expired │
   ├─────────────────────────────────────┼───────────────┼───────────┼──────────────┼────────┼─────────┤
   │ crowdsecurity/ssh-bf                │ 1             │ -         │ 1            │ 4      │ -       │
   │ crowdsecurity/ssh-bf_user-enum      │ 1             │ -         │ 1            │ 1      │ -       │
   │ crowdsecurity/ssh-slow-bf           │ 1             │ -         │ 1            │ 4      │ -       │
   │ crowdsecurity/ssh-slow-bf_user-enum │ 1             │ -         │ 1            │ 1      │ -       │
   ╰─────────────────────────────────────┴───────────────┴───────────┴──────────────┴────────┴─────────╯
   ```

Die obige Ausgabe kann einschüchternd wirken, aber sie ist eine gute Möglichkeit zu überprüfen, ob die Security Engine Logs liest und die Remediation-Komponente IP-Adressen blockiert. Hier eine kurze Aufschlüsselung der einzelnen Abschnitte:

- **Acquisition Metrics**: Dieser Abschnitt zeigt die Logs, die die Security Engine liest und parst. Wenn du Logs in der Spalte `Lines unparsed` siehst, bedeutet das, dass die Security Engine die Logs nicht parsen kann. Dies kann an einer Fehlkonfiguration liegen oder daran, dass die Logs nicht im erwarteten Format vorliegen.
- **Local API Decisions**: Dieser Abschnitt zeigt die Entscheidungen, die die Security Engine in der Datenbank hat. Wenn du Logs in der Spalte `Count` siehst, bedeutet das, dass die Security Engine bösartige Aktivitäten erkannt und die IP-Adresse blockiert hat.
   - Herkunft: Woher die Entscheidung stammt. In diesem Fall von der Central API (CAPI).
- **Local API Metrics**: Dieser Abschnitt zeigt die Anzahl der Zugriffe auf die Local API. Dies ist die API, die die Security Engine verwendet, um mit der Remediation-Komponente zu kommunizieren.
- **Local API Bouncers Metrics**: Dieser Abschnitt zeigt die Anzahl der Zugriffe auf die Local API durch die Remediation-Komponente.
- **Local API Machines Metrics**: Dieser Abschnitt zeigt die Anzahl der Zugriffe auf die Local API durch die Security Engine (wenn mehrere Security Engines in einer zentralen Einrichtung ausgeführt werden, kannst du hier mehrere IDs sehen).
- **Parser Metrics**: Dieser Abschnitt zeigt die Parser, die von der Security Engine verwendet werden. Wenn du Logs in der Spalte `Unparsed` siehst, bedeutet das, dass die Security Engine die Logs nicht parsen kann. Dies kann an einer Fehlkonfiguration liegen oder daran, dass die Logs nicht im erwarteten Format vorliegen.
- **Scenario Metrics**: Dieser Abschnitt zeigt die Szenarien, die von der Security Engine verwendet werden. Wenn du Logs in der Spalte `Current Count` siehst, bedeutet das, dass die Security Engine bösartige Aktivitäten erkannt hat und die IP-Adresse verfolgt.

#### IP entsperren

Um eine IP zu entsperren, verwende diesen Befehl:``` bash
cscli decisions delete --ip [IP]
```
`[IP]` ist die IP-Adresse, die du entsperren möchtest. Zum Beispiel, um `192.168.1.100` von SSH zu entsperren, würdest du Folgendes tun:``` bash
cscli decisions delete --ip 192.168.1.100
```
## Das Auditing

### Datei-/Ordnerintegritätsüberwachung mit AIDE (WIP)

#### Warum

WIP

#### Wie es funktioniert

WIP

#### Ziele

WIP

#### Referenzen

- https://aide.github.io/
- https://www.hiroom2.com/2017/06/09/debian-8-file-integrity-check-with-aide/
- https://blog.rapid7.com/2017/06/30/how-to-install-and-configure-aide-on-ubuntu-linux/
- https://www.stephenrlang.com/2016/03/using-aide-for-file-integrity-monitoring-fim-on-ubuntu/
- https://www.howtoforge.com/how-to-configure-the-aide-advanced-intrusion-detection-environment-file-integrity-scanner-for-your-website
- https://www.tecmint.com/check-integrity-of-file-and-directory-using-aide-in-linux/
- https://www.cyberciti.biz/faq/debian-ubuntu-linux-software-integrity-checking-with-aide/
- https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/83

#### Schritte

1. AIDE installieren.

   Auf Debian-basierten Systemen:
   
   ``` bash
   sudo apt install aide aide-common
   ```
   
1. Erstellen Sie ein Backup der Standardkonfigurationsdatei von AIDE:

   ``` bash
   sudo cp -p /etc/default/aide /etc/default/aide-COPY-$(date +"%Y%m%d%H%M%S")
   ```

1. Gehen Sie die `/etc/default/aide` durch und setzen Sie die Standardeinstellungen von AIDE nach Ihren Anforderungen. Wenn AIDE täglich laufen und Ihnen eine E-Mail senden soll, setzen Sie `CRON_DAILY_RUN` unbedingt auf `yes`.

1. Erstellen Sie ein Backup der AIDE-Konfigurationsdateien:

   ``` bash
   sudo cp -pr /etc/aide /etc/aide-COPY-$(date +"%Y%m%d%H%M%S")
   ```

1. Auf Debian-basierten Systemen:

   - Die Konfigurationsdateien von AIDE befinden sich in `/etc/aide/aide.conf.d/`.
   - Sie sollten die AIDE-Dokumentation und die Konfigurationsdateien durchgehen, um sie nach Ihren Anforderungen einzustellen.
   - Wenn Sie neue Einstellungen vornehmen möchten, z. B. um einen neuen Ordner zu überwachen, fügen Sie diese in `/etc/aide/aide.conf` oder `/etc/aide/aide.conf.d/` hinzu.
   - Erstellen Sie ein Backup der Standardkonfigurationsdateien: `sudo cp -pr /etc/aide /etc/aide-COPY-$(date +"%Y%m%d%H%M%S")`.

1. Erstellen Sie eine neue Datenbank und installieren Sie sie.
  
   Auf Debian-basierten Systemen:

   ``` bash
   sudo aideinit
   ```
   
   > ```
   > Running aide --init...
   > Start timestamp: 2019-04-01 21:23:37 -0400 (AIDE 0.16)
   > AIDE initialized database at /var/lib/aide/aide.db.new
   > Verbose level: 6
   > 
   > Number of entries:      25973
   > 
   > ---------------------------------------------------
   > The attributes of the (uncompressed) database(s):
   > ---------------------------------------------------
   > 
   > /var/lib/aide/aide.db.new
   >   RMD160   : moyQ1YskQQbidX+Lusv3g2wf1gQ=
   >   TIGER    : 7WoOgCrXzSpDrlO6I3PyXPj1gRiaMSeo
   >   SHA256   : gVx8Fp7r3800WF2aeXl+/KHCzfGsNi7O
   >              g16VTPpIfYQ=
   >   SHA512   : GYfa0DJwWgMLl4Goo5VFVOhu4BphXCo3
   >              rZnk49PYztwu50XjaAvsVuTjJY5uIYrG
   >              tV+jt3ELvwFzGefq4ZBNMg==
   >   CRC32    : /cusZw==
   >   HAVAL    : E/i5ceF3YTjwenBfyxHEsy9Kzu35VTf7
   >              CPGQSW4tl14=
   >   GOST     : n5Ityzxey9/1jIs7LMc08SULF1sLBFUc
   >              aMv7Oby604A=
   > 
   > 
   > End timestamp: 2019-04-01 21:24:45 -0400 (run time: 1m 8s)
   > ```

1. Testen Sie, ob alles ohne Änderungen funktioniert.

   Auf Debian-basierten Systemen:

   ``` bash
   sudo aide.wrapper --check
   ```
   
   > ```
   > Start timestamp: 2019-04-01 21:24:45 -0400 (AIDE 0.16)
   > AIDE found NO differences between database and filesystem. Looks okay!!
   > Verbose level: 6
   > 
   > Number of entries:      25973
   > 
   > ---------------------------------------------------
   > The attributes of the (uncompressed) database(s):
   > ---------------------------------------------------
   > 
   > /var/lib/aide/aide.db
   >   RMD160   : moyQ1YskQQbidX+Lusv3g2wf1gQ=
   >   TIGER    : 7WoOgCrXzSpDrlO6I3PyXPj1gRiaMSeo
   >   SHA256   : gVx8Fp7r3800WF2aeXl+/KHCzfGsNi7O
   >              g16VTPpIfYQ=
   >   SHA512   : GYfa0DJwWgMLl4Goo5VFVOhu4BphXCo3
   >              rZnk49PYztwu50XjaAvsVuTjJY5uIYrG
   >              tV+jt3ELvwFzGefq4ZBNMg==
   >   CRC32    : /cusZw==
   >   HAVAL    : E/i5ceF3YTjwenBfyxHEsy9Kzu35VTf7
   >              CPGQSW4tl14=
   >   GOST     : n5Ityzxey9/1jIs7LMc08SULF1sLBFUc
   >              aMv7Oby604A=
   > 
   > 
   > End timestamp: 2019-04-01 21:26:03 -0400 (run time: 1m 18s)
   > ```

1. Testen Sie, ob alles nach einigen Änderungen funktioniert.

   Auf Debian-basierten Systemen:

   ``` bash
   sudo touch /etc/test.sh
   sudo touch /root/test.sh
   
   sudo aide.wrapper --check
   
   sudo rm /etc/test.sh
   sudo rm /root/test.sh
   
   sudo aideinit -y -f
   ```
   
   > ```
   > Start timestamp: 2019-04-01 21:37:37 -0400 (AIDE 0.16)
   > AIDE found differences between database and filesystem!!
   > Verbose level: 6
   > 
   > Summary:
   >   Total number of entries:      25972
   >   Added entries:                2
   >   Removed entries:              0
   >   Changed entries:              1
   > 
   > ---------------------------------------------------
   > Added entries:
   > ---------------------------------------------------
   > 
   > f++++++++++++++++: /etc/test.sh
   > f++++++++++++++++: /root/test.sh
   > 
   > ---------------------------------------------------
   > Changed entries:
   > ---------------------------------------------------
   > 
   > d =.... mc.. .. .: /root
   > 
   > ---------------------------------------------------
   > Detailed information about changes:
   > ---------------------------------------------------
   > 
   > Directory: /root
   >   Mtime    : 2019-04-01 21:35:07 -0400        | 2019-04-01 21:37:36 -0400
   >   Ctime    : 2019-04-01 21:35:07 -0400        | 2019-04-01 21:37:36 -0400
   > 
   > 
   > ---------------------------------------------------
   > The attributes of the (uncompressed) database(s):
   > ---------------------------------------------------
   > 
   > /var/lib/aide/aide.db
   >   RMD160   : qF9WmKaf2PptjKnhcr9z4ueCPTY=
   >   TIGER    : zMo7MvvYJcq1hzvTQLPMW7ALeFiyEqv+
   >   SHA256   : LSLLVjjV6r8vlSxlbAbbEsPcQUB48SgP
   >              pdVqEn6ZNbQ=
   >   SHA512   : Qc4U7+ZAWCcitapGhJ1IrXCLGCf1IKZl
   >              02KYL1gaZ0Fm4dc7xLqjiquWDMSEbwzW
   >              oz49NCquqGz5jpMIUy7UxA==
   >   CRC32    : z8ChEA==
   >   HAVAL    : YapzS+/cdDwLj3kHJEq8fufLp3DPKZDg
   >              U12KCSkrO7Y=
   >   GOST     : 74sLV4HkTig+GJhokvxZQm7CJD/NR0mG
   >              6jV7zdt5AXQ=
   > 
   > 
   > End timestamp: 2019-04-01 21:38:50 -0400 (run time: 1m 13s)
   > ```
   
1. Das war's. Wenn Sie `CRON_DAILY_RUN` auf `yes` in `/etc/default/aide` setzen, wird cron jeden Tag `/etc/cron.daily/aide` ausführen und Ihnen die Ausgabe per E-Mail senden.

#### Aktualisieren der Datenbank

Jedes Mal, wenn Sie Änderungen an Dateien/Ordnern vornehmen, die AIDE überwacht, müssen Sie die Datenbank aktualisieren, um diese Änderungen zu erfassen. Um dies auf Debian-basierten Systemen zu tun:``` bash
sudo aideinit -y -f
```
([Inhaltsverzeichnis](#inhaltsverzeichnis))

### Virenscan mit ClamAV (WIP)

#### Warum

WIP

#### Funktionsweise

- ClamAV ist ein Virenscanner
- ClamAV-Freshclam ist ein Dienst, der die Virendefinitionen aktuell hält
- ClamAV-Daemon hält den `clamd`-Prozess am Laufen, um das Scannen zu beschleunigen

#### Ziele

WIP

#### Hinweise

- Diese Anleitung erklärt **nicht**, wie der ClamAV-Daemon-Dienst aktiviert wird, um sicherzustellen, dass `clamd` ständig läuft. `clamd` ist nur dann erforderlich, wenn du einen Mailserver betreibst, und bietet keine Echtzeit-Überwachung von Dateien. Stattdessen solltest du Dateien manuell oder nach einem Zeitplan scannen.

#### Referenzen

- https://www.clamav.net/documents/installation-on-debian-and-ubuntu-linux-distributions
- https://wiki.debian.org/ClamAV
- https://www.osradar.com/install-clamav-debian-9-ubuntu-18/
- https://www.lisenet.com/2014/automate-clamav-to-perform-daily-system-scan-and-send-email-notifications-on-linux/
- https://www.howtoforge.com/tutorial/configure-clamav-to-scan-and-notify-virus-and-malware/
- https://serverfault.com/questions/741299/is-there-a-way-to-keep-clamav-updated-on-debian-8
- https://askubuntu.com/questions/250290/how-do-i-scan-for-viruses-with-clamav
- https://ngothang.com/how-to-install-clamav-and-configure-daily-scanning-on-centos/

#### Schritte

1. Installiere ClamAV.

   Auf Debian-basierten Systemen:

   ``` bash
   sudo apt install clamav clamav-freshclam clamav-daemon
   ```

1. Erstelle ein Backup der Konfigurationsdatei von `clamav-freshclam` `/etc/clamav/freshclam.conf`:

   ``` bash
   sudo cp --archive /etc/clamav/freshclam.conf /etc/clamav/freshclam.conf-COPY-$(date +"%Y%m%d%H%M%S")
   ```
   
1. Die Standardeinstellungen von `clamav-freshclam` sind wahrscheinlich gut genug, aber wenn du sie ändern möchtest, kannst du entweder die Datei `/etc/clamav/freshclam.conf` bearbeiten oder `dpkg-reconfigure` verwenden:

   ``` bash
   sudo dpkg-reconfigure clamav-freshclam
   ```
   
   **Hinweis**: Die Standardeinstellungen aktualisieren die Definitionen 24 Mal am Tag. Um das Intervall zu ändern, überprüfe die Einstellung `Checks` in `/etc/clamav/freshclam.conf` oder verwende `dpkg-reconfigure`.

1. Starte den `clamav-freshclam`-Dienst:

   ``` bash
   sudo service clamav-freshclam start
   ```
   
1. Du kannst überprüfen, ob `clamav-freshclam` läuft:

   ``` bash
   sudo service clamav-freshclam status
   ```
   
   > ```
   > ● clamav-freshclam.service - ClamAV virus database updater
   >    Loaded: loaded (/lib/systemd/system/clamav-freshclam.service; enabled; vendor preset: enabled)   Active: active (running) since Sat 2019-03-16 22:57:07 EDT; 2min 13s ago
   >      Docs: man:freshclam(1)
   >            man:freshclam.conf(5)
```

---

[Read more](https://github.com/imthenachoman/how-to-secure-a-linux-server)
Tool herunterladen
  • https://www.tecmint.com/install-rootkit-hunter-scan-for-rootkits-backdoors-in-linux/
  • Versenden/Sichern von Protokollen - https://news.ycombinator.com/item?id=19178681
  • CIS-CAT - https://learn.cisecurity.org/cis-cat-landing-page
  • debsums - https://blog.sleeplessbeastie.eu/2015/03/02/how-to-verify-installed-packages/
  • ~/.ssh/authorized_keys
    anhängen
    MIM
    ssh-copy-id
    root@kitploit:~
    ssh-copy-id user@server
    
    root@kitploit:~
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub"
    The authenticity of host 'host (192.168.1.96)' can't be established.
    ECDSA key fingerprint is SHA256:QaDQb/X0XyVlogh87sDXE7MR8YIK7ko4wS5hXjRySJE.
    Are you sure you want to continue connecting (yes/no)? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    user@host's password:
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'user@host'"
    and check to make sure that only the key(s) you wanted were added.
    
    ssh-keygen -l -f ~/.ssh/id_rsa
    root@kitploit:~
    ########################################################################################################
    # start settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
    ########################################################################################################
    
    # Supported HostKey algorithms by order of preference.
    HostKey /etc/ssh/ssh_host_ed25519_key
    HostKey /etc/ssh/ssh_host_rsa_key
    HostKey /etc/ssh/ssh_host_ecdsa_key
    
    KexAlgorithms [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
    
    Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
    
    MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
    
    # LogLevel VERBOSE logs user's key fingerprint on login. Needed to have a clear audit track of which key was using to log in.
    LogLevel VERBOSE
    
    # Use kernel sandbox mechanisms where possible in unprivileged processes
    # Systrace on OpenBSD, Seccomp on Linux, seatbelt on MacOSX/Darwin, rlimit elsewhere.
    # Note: This setting is deprecated in OpenSSH 7.5 (https://www.openssh.com/txt/release-7.5)
    # UsePrivilegeSeparation sandbox
    
    ########################################################################################################
    # end settings from https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 as of 2019-01-01
    ########################################################################################################
    
    # don't let users set environment variables
    PermitUserEnvironment no
    
    # Log sftp level file access (read/write/etc.) that would not be easily logged otherwise.
    Subsystem sftp  internal-sftp -f AUTHPRIV -l INFO
    
    # disable X11 forwarding as X11 is very insecure
    # you really shouldn't be running X on a server anyway
    X11Forwarding no
    
    # disable port forwarding
    AllowTcpForwarding no
    AllowStreamLocalForwarding no
    GatewayPorts no
    PermitTunnel no
    
    # don't allow login if the account has an empty password
    PermitEmptyPasswords no
    
    # ignore .rhosts and .shosts
    IgnoreRhosts yes
    
    # verify hostname matches IP
    UseDNS yes
    
    Compression no
    
    # TCP keepalive is spoofable (runs outside the encrypted channel)
    # Use ClientAlive instead (runs inside the encrypted channel)
    TCPKeepAlive no
    
    AllowAgentForwarding no
    PermitRootLogin no
    
    # don't allow .rhosts or /etc/hosts.equiv
    HostbasedAuthentication no
    
    # OpenSSH 9.1 and later
    # Enforce a minimum RSA key size of 3072 bits
    # https://www.keylength.com/en/compare/
    # RequiredRSASize 3072
    
    # https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/115
    HashKnownHosts yes
    
  • Suchen Sie dann diese Einstellungen, bearbeiten oder fügen Sie sie hinzu und setzen Sie Werte entsprechend Ihren Anforderungen:

    EinstellungGültige WerteBeispielBeschreibungHinweise
    AllowGroupslokaler UNIX-GruppennameAllowGroups sshusersGruppe, für die SSH-Zugriff erlaubt ist
    ClientAliveCountMaxAnzahlClientAliveCountMax 3maximale Anzahl von Client-Alive-Nachrichten, die ohne Antwort gesendet werden
    ClientAliveIntervalAnzahl SekundenClientAliveInterval 15Timeout in Sekunden vor einer Antwortanforderung
    ListenAddressdurch Leerzeichen getrennte Liste lokaler Adressen
    • ListenAddress 0.0.0.0
    • ListenAddress 192.168.1.100
    Lokale Adressen, auf denen sshd hören sollSiehe Issue #1 für wichtige Details.
    LoginGraceTimeAnzahl SekundenLoginGraceTime 30Zeit in Sekunden, bevor die Anmeldung abbricht
    MaxAuthTriesAnzahlMaxAuthTries 2Maximal zulässige Anzahl von Anmeldeversuchen
    MaxSessionsAnzahlMaxSessions 2Maximale Anzahl offener Sitzungen
    MaxStartupsAnzahlMaxStartups 2Maximale Anzahl von Anmeldesitzungen
    PasswordAuthenticationyes oder noPasswordAuthentication noOb die Anmeldung mit einem Passwort erlaubt ist
    Portjeder offene/verfügbare PortnummerPort 22Port, auf dem sshd hören soll

    Überprüfen Sie man sshd_config für weitere Details zur Bedeutung dieser Einstellungen.

  • Stellen Sie sicher, dass keine doppelten Einstellungen vorhanden sind, die sich widersprechen. Der folgende Befehl sollte keine Ausgabe liefern.

    root@kitploit:~
    awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
    
  • Starten Sie ssh neu:

    root@kitploit:~
    sudo service sshd restart
    
  • Sie können mit sshd -T überprüfen, ob die Konfigurationen funktioniert haben, und die Ausgabe überprüfen:

    root@kitploit:~
    sudo sshd -T
    
    root@kitploit:~
    port 22
    addressfamily any
    listenaddress [::]:22
    listenaddress 0.0.0.0:22
    usepam yes
    logingracetime 30
    x11displayoffset 10
    maxauthtries 2
    maxsessions 2
    clientaliveinterval 15
    clientalivecountmax 3
    streamlocalbindmask 0177
    permitrootlogin no
    ignorerhosts yes
    ignoreuserknownhosts no
    hostbasedauthentication no
    ...
    subsystem sftp internal-sftp -f AUTHPRIV -l INFO
    maxstartups 2:30:2
    permittunnel no
    ipqos lowdelay throughput
    rekeylimit 0 0
    permitopen any
    
  • Beachten Sie, dass dies nicht als root ausgeführt wird.

    Wählen Sie die Standardoption (in den meisten Fällen y) für alle gestellten Fragen und vergessen Sie nicht, die Notfall-Wiederherstellungscodes (emergency scratch codes) zu speichern.

  • Erstellen Sie ein Backup der PAM-SSH-Konfigurationsdatei /etc/pam.d/sshd:

    root@kitploit:~
    sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")
    
  • Jetzt müssen wir sie als Authentifizierungsmethode für SSH aktivieren, indem wir diese Zeile zu /etc/pam.d/sshd hinzufügen:

    root@kitploit:~
    auth       required     pam_google_authenticator.so nullok
    

    Hinweis: Überprüfen Sie hier, was nullok bedeutet.

    Für die Faulen:

    root@kitploit:~
    echo -e "\nauth       required     pam_google_authenticator.so nullok         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/pam.d/sshd
    
  • Teilen Sie SSH mit, dies zu nutzen, indem Sie diese Zeile in /etc/ssh/sshd_config hinzufügen oder bearbeiten:

    root@kitploit:~
    ChallengeResponseAuthentication yes
    

    Für die Faulen:

    root@kitploit:~
    sudo sed -i -r -e "s/^(challengeresponseauthentication .*)$/# \1         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/I" /etc/ssh/sshd_config
    echo -e "\nChallengeResponseAuthentication yes         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ssh/sshd_config
    
  • Starten Sie SSH neu:

    root@kitploit:~
    sudo service sshd restart
    
  • Starten Sie den Dienst neu, um die Änderungen zu übernehmen:

    root@kitploit:~
    sudo systemctl restart systemd-timesyncd
    
  • Überprüfen Sie den Synchronisationsstatus:

    root@kitploit:~
    timedatectl timesync-status
    
    root@kitploit:~
           Server: 108.61.56.35 (pool.ntp.org)
    Poll interval: 32s (min: 32s; max: 34min 8s)
             Leap: normal
          Version: 4
          Stratum: 2
        Reference: C342F10A
        Precision: 1us (2^0)
     Root distance: 24.054ms (max: 5s)
           Offset: +2.156ms
            Delay: 48.567ms
           Jitter: 1.452ms
     Packet count: 3
    
  • Beispiel /etc/ntp.conf:

    root@kitploit:~
    driftfile /var/lib/ntp/ntp.drift
    statistics loopstats peerstats clockstats
    filegen loopstats file loopstats type day enable
    filegen peerstats file peerstats type day enable
    filegen clockstats file clockstats type day enable
    restrict -4 default kod notrap nomodify nopeer noquery limited
    restrict -6 default kod notrap nomodify nopeer noquery limited
    restrict 127.0.0.1
    restrict ::1
    restrict source notrap nomodify noquery
    pool pool.ntp.org iburst         # added by user on 2019-03-09 @ 10:23:35
    
  • Starten Sie ntp neu:

    root@kitploit:~
    sudo service ntp restart
    
  • Überprüfen Sie den Status des ntp-Dienstes:

    root@kitploit:~
    sudo systemctl status ntp
    
    root@kitploit:~
    ● ntp.service - LSB: Start NTP daemon
       Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled)
       Active: active (running) since Sat 2019-03-09 15:19:46 EST; 4s ago
         Docs: man:systemd-sysv-generator(8)
      Process: 1016 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS)
      Process: 1028 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS)
        Tasks: 2 (limit: 4915)
       CGroup: /system.slice/ntp.service
               └─1038 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:113
    
    Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 0 v6wildcard [::]:123
    Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 1 v4wildcard 0.0.0.0:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 2 lo 127.0.0.1:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 3 enp0s3 10.10.20.96:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 4 lo [::1]:123
    Mar 09 15:19:46 host ntpd[1038]: Listen normally on 5 enp0s3 [fe80::a00:27ff:feb6:ed8e%2]:123
    Mar 09 15:19:46 host ntpd[1038]: Listening on routing socket on fd #22 for interface updates
    Mar 09 15:19:47 host ntpd[1038]: Soliciting pool server 108.61.56.35
    Mar 09 15:19:48 host ntpd[1038]: Soliciting pool server 69.89.207.199
    Mar 09 15:19:49 host ntpd[1038]: Soliciting pool server 45.79.111.114
    
  • Überprüfen Sie den Status von ntp:

    root@kitploit:~
    sudo ntpq -p
    
    root@kitploit:~
         remote           refid      st t when poll reach   delay   offset  jitter
    ==============================================================================
     pool.ntp.org    .POOL.          16 p    -   64    0    0.000    0.000   0.000
    *lithium.constan 198.30.92.2      2 u    -   64    1   19.900    4.894   3.951
     ntp2.wiktel.com 212.215.1.157    2 u    2   64    1   48.061   -0.431   0.104
    
  • eine Ziffer
  • ucredit=-1 = muss mindestens einen Großbuchstaben enthalten
  • lcredit=-1 = muss mindestens einen Kleinbuchstaben enthalten
  • ocredit=-1 = muss mindestens ein nicht-alphanumerisches Zeichen enthalten
  • difok=3 = mindestens 3 Zeichen des neuen Passworts dürfen nicht im alten Passwort vorkommen
  • maxrepeat=3 = maximal 3 wiederholte Zeichen erlauben
  • gecoschec = Passwörter mit dem Kontonamen nicht erlauben
  • Für die Faulen:

    root@kitploit:~
    sudo sed -i -r -e "s/^(password\s+requisite\s+pam_pwquality.so)(.*)$/# \1\2         # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")\n\1 retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec         # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/pam.d/common-password
    

    Hinweise:

    • Überprüfen Sie /usr/lib/apt/apt.systemd.daily für Details zu den APT::Periodic-Optionen
    • Überprüfen Sie https://github.com/mvo5/unattended-upgrades für Details zu den Unattended-Upgrade-Optionen
  • Führen Sie einen Probelauf von unattended-upgrades durch, um sicherzustellen, dass Ihre Konfigurationsdatei in Ordnung ist:

    root@kitploit:~
    sudo unattended-upgrade -d --dry-run
    

    Wenn alles in Ordnung ist, können Sie es zu den geplanten Zeiten laufen lassen oder einen manuellen Lauf mit unattended-upgrade -d erzwingen.

  • Konfigurieren Sie apt-listchanges nach Ihren Wünschen:

    root@kitploit:~
    sudo dpkg-reconfigure apt-listchanges
    
  • Für apticron sind die Standardeinstellungen ausreichend, aber Sie können sie in /etc/apticron/apticron.conf überprüfen, wenn Sie sie ändern möchten. Meine Konfiguration sieht zum Beispiel so aus:

    root@kitploit:~
    EMAIL="root"
    NOTIFY_NO_UPDATES="1"