Wenn wir einen Bitcoin / Lightning Node bzw. einen Server betreiben, sind diese Geräte im Normalfall 24 Stunden, 7 Tage die Woche, 365 Tage im Jahr für uns erreichbar. Wir nutzen all die Vorteile eines eigenen Node und unserem eigenen Electrum- / Fulcrumserver.
Diese Geräte sind allerdings auch rund um die Uhr mit dem Internet verbunden damit sie zuverlässig funktionieren. Das birgt Gefahren...!
Um nicht Opfer des erstbesten Script-Kiddies zu werden, ist es unumgänglich uns Gedanken darüber zu machen, wie wir unseren Node vor Angreifern schützen.
Da wir via SSH (secure shell) verschlüsselt mit unserem Node kommmunizieren, kommt diesem Service besondere Aufmerksamkeit zu. Denn Ports welche eine Authentifizierung anbieten (HTTPS, SSH, FTP, SMTP, …) werden auch angegriffen.
Im wesentlichen werden wir als erstes ein paar Basics an unserem SSH Zugang ändern. Diese sind dann schon ein riesen Schritt in die richtige Richtung! Fangen wir an....
Hinweis: Damit wir uns bei Fehlern in der Config nicht aus unserem Node bzw. Server aussperren, lasst das aktive Terminalfenster geöffnet! Die Session und der Login bleibt erhalten, bis wir das Terminal beenden. Zum Testen der Änderungen einfach ein weiteres Terminal öffnen.
Standard SSH Port ändern
Um automatischen SSH Portscans von Angreifern aus dem Weg zu gehen, legen wir den SSH-Dienst, der standardmäßig auf dem TCP-Port 22 horcht, auf einen zufälligen höheren Port. Nehmt einen Port, der in euren Node Konfigs nicht von anderen Services genutzt wird z.B. 43210.
Login zu eurem Node, wechselt in das Verzeichnis /etc/ssh und öffnet die sshd_config (die systemweiter SSH Konfiguration):
sudo nano /etc/ssh/sshd_config
Port 43210
Strg+x und J zum speichern.
Neustart des SSH Servers:
sudo systemctl restart sshd
Macht ein neues Terminal auf und ssh auf euren Node...
ssh [email protected] -p 43210
Um es uns zu ersparen, bei jedem Login den Port mit angeben zu müssen öffnen wir lokal (auf dem SSH Client) die SSH Config...
nano ~/.ssh/config
Dort tragen wir 2 Zeilen ein:
Host "Name oder IP des Node/Server"
Port 43210
Strg+x speichern und fertig. Beim erneuten Versuch euch per SSH zu verbinden reicht euer normaler [email protected].
Damit gehen wir automatisierten SSH-Scans effektiv aus dem Weg.
TCP-Wrapper nutzen mit "/etc/hosts.allow" und "/etc/hosts.deny"
Mit dem TCP-Wrapper haben wir die Möglichkeit, Anfragen an unsere Services wie SSH zu beschränken. TCP-Wrapper nimmt entsprechende Verbindungsanfragen im voraus entgegen und unterbindet oder leitet sie an unseren Dienst weiter. Somit können wir auf einfache Weise bestimmte IP's und Netzwerke ausschließen bzw. zulassen.
Dazu bearbeiten wir die Sperrklauseln /etc/hosts.deny:
sudo nano /etc/hosts.deny
#SSH Zugangssperre Alle außer Lokale
sshd: ALL EXCEPT LOCAL
Strg+x speichern.
Die freigegebenen Adressen kommen in die /etc/hosts.allow:
sudo nano /etc/hosts.allow
#Beispiele für erlaubte IP's und Netze
#sshd: 192.168.10.123
#sshd: 192.168.10.5
#sshd: 192.168.178.0/255.255.255.0
Strg+x speichern.
Die Adressen müssen an eure Netzwerkumgebung angepasst werden. Mit diesen beiden Dateien stellen wir sicher, dass nur noch von den direkt angegebenen IP's und den IP's des Subnetzwerk auf den Node/Server zugegriffen werden kann. Mit ALL EXCEPT LOCAL haben wir uns den lokalen Zugriff am Server selbst freigehalten.
Deaktivieren des direkten Root-Zugangs
Direkte Root-Anmeldungen an unserem Node sind nicht zu empfehlen! Wir brauchen es auch nicht, da unser angelegter User jederzeit per "su-command" als Root angemeldet werden kann bzw. jeder Terminal Befehl auch mit dem vorgesetzten "sudo" als Root ausgeführt werden kann.
Wir sperren den Root Login:
sudo nano /etc/ssh/sshd_config
PermitRootLogin no
Wir sperren die PAM Authentifizierung:
UsePAM no
ChallengeResponseAuthentication no
Strg+x speichern und fertig.
Einschränken auf Public-Key-Zugang
Um Brute-Force Attacken, auf unser relativ unsichers Passwort Login zu unterbinden, sollte der Passwort Login komplett abgeschaltet werden und die Authentifizierung nur über ein Public-Key-Auth erfolgen.

Hierzu müssen wir uns zuerst ein Schlüsselpaar erstellen. Das tun wir lokal auf unserem Rechner/Client.
Voraussetzungen: OpenSSL installieren, z.B. unter Debian/Ubuntu mittels apt-get install openssl
Im Terminal erstellen wir unser Key-Pair:
ssh-keygen -t rsa -b 4096 -f /home/"USER"/.ssh/id_rsa
Ausgabe:
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): "nutzt einen PW-Manager und erstellt ein starkes Passwort!"
Enter same passphrase again:
Your identification has been saved in /<Verzeichnis_zum_Speichern_der_Schlüssel>/id_rsa.
Your public key has been saved in /<Verzeichnis_zum_Speichern_der_Schlüssel>/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
Die Passphrase schützt den Zugriff auf den privaten Schlüssel.
Der öffentliche Schlüssel befindet sich in der Datei "id_rsa.pub", der private Schlüssel in "id_rsa".
Für Windows:
Ihr könnt versuchen im Windows CMD das Schlüsselpaar via OpenSSH zu generieren. OpenSSH wurde irgendwann in Windows 10 integriert... folgenden Befehl im Terminal ausführen:
ssh-keygen -b 4096
Nach "Enter" kommt die Eingabe der Passphrase. Die Passphrase schützt den Zugriff auf den privaten Schlüssel. Verwendet einen Passwortmanager und erzeugt ein starkes Passwort!
Das Key-Pair wird in folgendem Verzeichnis gespeichert.
C:\Users\MyUserName\.ssh
id_rsa
und id_rsa.pub
Alternativ, falls es dabei Schwierigkeiten gibt, nehmt das Tool Puttygen um Schlüssel für OpenSSH zu erstellen. Sucht euch die passende Version für euer Windows raus.
Schlüssel erstellen:
1. Unter "Parameters" auf "SSH-2-RSA" bzw. "SSH-2-DSA" klicken.
2. Anschließend im Textfeld darunter "4096" eingeben.
3. Auf die Schaltfläche "Generate" klicken.
4. Die Maus bewegen, bis der blaue Balken am rechten Rand angekommen ist.
5. Nach kurzer Zeit hinter "Key Passphrase" und "Confirm Passphrase" die Passphrase eingeben.
Hinweis: Die Passphrase schützt den Zugriff auf den privaten Schlüssel. Verwendet einen Passwortmanager und erzeugt ein starkes Passwort!
6. Auf die Schaltfläche "Save public key" und danach auf "Save private key" klicken. Legt dann im jeweils erscheinenden Dialogfenster fest, wo die Schlüssel gespeichert werden sollen.
Jetzt kopieren wir den Public Key, rsa.pub auf unseren Node/Server in die Datei /home/USER/.ssh/authorized_keys. USER ist wie immer mit eurem Nutzernamen zu ersetzen...
scp ~/.ssh/id_rsa.pub | ssh USER@HOST "mkdir /home/USER/.ssh; cat >> .ssh/authorized_keys"
Für einen extra Layer an Sicherheit setzen wir die Ordner & Dateirechte von authorized_keys auf:
sudo chmod -R 700 ~/.ssh && chmod 600 ~/.ssh/authorized_key
Das verhindert einen Zugriff auf das Verzeichnis und unser Keyfile durch andere User außer uns.
Anpassen der SSH Config
Wechselt in die ssh config eures Node und setzt diese 2 Zeilen auf:
sudo nano /etc/ssh/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no
Strg+x speichern.
Damit wir uns bei einem Fehler jetzt nicht aus unserem Node aussperren, lasst dieses Terminalfenster geöffnet! Die Session und der Login bleibt erhalten, bis wir das Terminal beenden.
Damit unsere Änderungen angewendet werden öffnen wir ein neues Terminal und melden uns mit unserem [email protected] und dem noch erlaubten Passwort an. Danach restarten wir unseren SSH Server mit:
sudo systemctl restart sshd
Jetzt checken wir ob alles geklappt hat. Neues Terminal öffnen und login auf eurem Node/Server via:
ssh [email protected]
Im folgenden öffnet sich ein Fenster zur Abfrage der Passphrase (unser neu erstelltes starkes PW).
Nach Eingabe des PW erfolgt der Login zu eurem Node.
Last login: Thu Apr 6 21:04:23 2023 from 192.168.10.123
Falls jetzt Probleme auftreten wie Permission denied oder Fehler im PreAuth haben wir noch unsere aktive Terminalsession, die wir vorhin NICHT geschlossen haben. Dort einfach nochmal in die SSH Config und die Zeile
PasswordAuthentication no
ändern auf
PasswordAuthentication yes
Danach könnt ihr in Ruhe schauen wo es hängt. Bei Problemen findet ihr immer guten Rat in unserer Telegram Gruppe ;)
Hat dir der Artikel gefallen? Stay safe... cheers ;)
Onchain/Lightning Beer: https://coinos.io/FuSsY
http://vm7h454g5hiy2nt3u5o7evtz3vigtypo2mkyausakvdkbmd7wpyhx5qd.onion/FuSsY
Lightning only Beer: [email protected]