
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.
Eine fortlaufende Anleitung zum Sichern eines Linux-Servers, die hoffentlich auch ein wenig über Sicherheit lehrt und warum sie wichtig ist.
(Inhaltsverzeichnis erstellt mit nGitHubTOC)
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.
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.
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.
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.
Diese Anleitung...
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:
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.
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.
Bevor Sie beginnen, sollten Sie Ihre Prinzipien identifizieren. Was ist Ihr Bedrohungsmodell? Einige Dinge, über die Sie nachdenken sollten:
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.
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...
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:
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.
sudo apt update && sudo apt upgrade auf Debian-basierten Systemen)./etc/fstabmanapt-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.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!
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
[...]
Führen Sie das Requirements-Playbook mit dem Root-Passwort aus, das Sie bei der Installation des Servers angegeben haben:
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:
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:
ansible-playbook --inventory hosts.yml -e ansible_ssh_port=SSH_PORT --key-file /PFAD/ZUM/SSH-SCHLÜSSEL main-playbook.yml
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.
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.
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.
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.
man ssh-keygenman ssh-copy-idman ssh-addErstellen 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:
ssh-keygen -t ed25519
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.
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.
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.
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.
/etc/ssh/sshd_config verwenden, um einzuschränken, wer SSH auf den Server durchführen kannAllowGroup zu unterstützen, die in Secure /etc/ssh/sshd_config gesetzt wird.man groupaddman usermodErstellen Sie eine Gruppe:
sudo groupadd sshusers
Fügen Sie Konto(s) zur Gruppe hinzu:
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.
/etc/ssh/sshd_configSSH 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.
/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.
man sshd_configErstellen Sie eine Sicherungskopie der OpenSSH-Server-Konfigurationsdatei /etc/ssh/sshd_config und entfernen Sie Kommentare, um das Lesen zu erleichtern:
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
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.
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.
man moduliErstellen Sie eine Sicherungskopie der SSH-Moduli-Datei /etc/ssh/moduli:
sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
Entfernen Sie kurze Moduli:
sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
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:
Ohne beide Schlüssel können sie nicht hineinkommen.
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.
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.
Installieren Sie libpam-google-authenticator.
Auf Debian-basierten Systemen:
sudo apt install libpam-google-authenticator
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:
google-authenticator
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
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.
Debian erstellt die sudo-Gruppe. Um Benutzer anzuzeigen, die Teil dieser Gruppe sind (und somit sudo-Berechtigungen haben):
cat /etc/group | grep "sudo"
RedHat erstellt die wheel-Gruppe
sudo kein Passwort erfordert. Danke an sbrl für den Hinweis.Erstellen Sie eine Gruppe:
sudo groupadd sudousers
Fügen Sie das/die Konto(en) zur Gruppe hinzu:
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.
Erstellen Sie ein Backup der sudo-Konfigurationsdatei /etc/sudoers:
sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
Bearbeiten Sie die sudo-Konfigurationsdatei /etc/sudoers:
sudo visudo
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:
%sudousers ALL=(ALL:ALL) ALL
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.
Erstellen Sie eine Gruppe:
sudo groupadd suusers
Fügen Sie das/die Konto(en) zur Gruppe hinzu:
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.
Stellen Sie sicher, dass nur Benutzer dieser Gruppe /bin/su ausführen können:
sudo dpkg-statoverride --update --add root suusers 4750 /bin/su
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.
Installieren Sie die Software:
sudo apt install firejail firejail-profiles
Hinweis: Für Debian 10 Stable wird das offizielle Backport empfohlen:
sudo apt install -t buster-backports firejail firejail-profiles
Erlauben Sie einer Anwendung (installiert in /usr/bin oder /bin), nur in einer Sandbox zu laufen (siehe einige Beispiele unten):
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
Führen Sie die Anwendung wie gewohnt aus (über Terminal oder Launcher) und überprüfen Sie, ob sie in einem Jail läuft:
firejail --list
Erlauben Sie einer gesandboxten App, wieder wie zuvor zu laufen (Beispiel: Firefox)
sudo rm /usr/local/bin/firefox
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.
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 vonsudo apt install ntpschlä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 vonsystemd-timesyncd, das bereits vorinstalliert ist und keine zusätzlichen Pakete erfordert. Siehe die Debian 13+ Schritte unten.
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.
Aktivieren Sie die NTP-Synchronisation:
sudo timedatectl set-ntp true
Überprüfen Sie, ob es funktioniert:
timedatectl status
Sie sollten NTP service: active und System clock synchronized: yes in der Ausgabe sehen.
Konfigurieren Sie vertrauenswürdige NTP-Server. Erstellen Sie ein Backup der Konfigurationsdatei und bearbeiten Sie sie dann:
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:
[Time]
NTP=pool.ntp.org
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org
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
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.
Installieren Sie ntp.
Auf Debian-basierten Systemen:
sudo apt install ntp
Erstellen Sie ein Backup der NTP-Client-Konfigurationsdatei /etc/ntp.conf:
sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
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:
pool pool.ntp.org iburst
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
Um https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/ zu zitieren:
Wenn Sie in
/procschauen, 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.
/proc mit hidepid=2 eingehängt, sodass Benutzer nur Informationen über ihre eigenen Prozesse sehen könnenErstellen Sie ein Backup von /etc/fstab:
sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
Fügen Sie diese Zeile zu /etc/fstab hinzu, damit /proc mit hidepid=2 eingehängt wird:
proc /proc proc defaults,hidepid=2 0 0
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
Starten Sie das System neu:
sudo reboot now
Hinweis: Alternativ können Sie /proc ohne Neustart neu einhängen mit sudo mount -o remount,hidepid=2 /proc
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."
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.
Installieren Sie libpam-pwquality.
Auf Debian-basierten Systemen:
sudo apt install libpam-pwquality
Erstellen Sie ein Backup der PAM-Passwortkonfigurationsdatei /etc/pam.d/common-password:
sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
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:
password requisite pam_pwquality.so
in diese ändern:
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 enthaltenEs 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.
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.
Auf Debian-basierten Systemen können Sie verwenden:
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.
/etc/apt/apt.conf.d/50unattended-upgradesInstallieren Sie unattended-upgrades, apt-listchanges und apticron:
sudo apt install unattended-upgrades apt-listchanges apticron
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:
// 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";
WIP
WIP
WIP
Installieren Sie rng-tools.
Auf Debian-basierten Systemen:
sudo apt-get install rng-tools
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:
HRNGDEVICE=/dev/urandom
echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
Starten Sie den Dienst neu:
sudo systemctl stop rng-tools.service
sudo systemctl start rng-tools.service
Testen Sie die Zufälligkeit:
Ein nettes Tool, um zusätzliche Passwortsicherheit gegen physische Angriffe (persönlich) wie Erpressung/Raub/Überfall zu bieten.
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.
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.
cat > "$ScriptFile" <<-EOF #!/bin/bash sudo rm -rf /home
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
([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)
~/.ssh/authorized_keysssh-copy-idssh-copy-id user@server
/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########################################################################################################
# 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:
| Einstellung | Gültige Werte | Beispiel | Beschreibung | Hinweise |
|---|---|---|---|---|
| AllowGroups | lokaler UNIX-Gruppenname | AllowGroups sshusers | Gruppe, für die SSH-Zugriff erlaubt ist | |
| ClientAliveCountMax | Anzahl | ClientAliveCountMax 3 | maximale Anzahl von Client-Alive-Nachrichten, die ohne Antwort gesendet werden | |
| ClientAliveInterval | Anzahl Sekunden | ClientAliveInterval 15 | Timeout in Sekunden vor einer Antwortanforderung | |
| ListenAddress | durch Leerzeichen getrennte Liste lokaler Adressen |
| Lokale Adressen, auf denen sshd hören soll | Siehe Issue #1 für wichtige Details. |
| LoginGraceTime | Anzahl Sekunden | LoginGraceTime 30 | Zeit in Sekunden, bevor die Anmeldung abbricht | |
| MaxAuthTries | Anzahl | MaxAuthTries 2 | Maximal zulässige Anzahl von Anmeldeversuchen | |
| MaxSessions | Anzahl | MaxSessions 2 | Maximale Anzahl offener Sitzungen | |
| MaxStartups | Anzahl | MaxStartups 2 | Maximale Anzahl von Anmeldesitzungen | |
| PasswordAuthentication | yes oder no | PasswordAuthentication no | Ob die Anmeldung mit einem Passwort erlaubt ist | |
| Port | jeder offene/verfügbare Portnummer | Port 22 | Port, 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.
awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
Starten Sie ssh neu:
sudo service sshd restart
Sie können mit sshd -T überprüfen, ob die Konfigurationen funktioniert haben, und die Ausgabe überprüfen:
sudo sshd -T
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:
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:
auth required pam_google_authenticator.so nullok
Hinweis: Überprüfen Sie hier, was nullok bedeutet.
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:
ChallengeResponseAuthentication yes
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:
sudo service sshd restart
Starten Sie den Dienst neu, um die Änderungen zu übernehmen:
sudo systemctl restart systemd-timesyncd
Überprüfen Sie den Synchronisationsstatus:
timedatectl timesync-status
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:
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:
sudo service ntp restart
Überprüfen Sie den Status des ntp-Dienstes:
sudo systemctl status ntp
● 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:
sudo ntpq -p
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
ucredit=-1 = muss mindestens einen Großbuchstaben enthaltenlcredit=-1 = muss mindestens einen Kleinbuchstaben enthaltenocredit=-1 = muss mindestens ein nicht-alphanumerisches Zeichen enthaltendifok=3 = mindestens 3 Zeichen des neuen Passworts dürfen nicht im alten Passwort vorkommenmaxrepeat=3 = maximal 3 wiederholte Zeichen erlaubengecoschec = Passwörter mit dem Kontonamen nicht erlaubensudo 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:
/usr/lib/apt/apt.systemd.daily für Details zu den APT::Periodic-OptionenUnattended-Upgrade-OptionenFühren Sie einen Probelauf von unattended-upgrades durch, um sicherzustellen, dass Ihre Konfigurationsdatei in Ordnung ist:
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:
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:
EMAIL="root" NOTIFY_NO_UPDATES="1"