wichtige Information
Wenn du wenig oder keine Erfahrung im leiten eines Servers / virtuellen privaten Srever (VPS) hast, welcher eine global externe IPv4 und/oder IPv6 Adresse mit mehreren offenen Ports hat is es von Safing empfohlen keinen SPN Node zu betreiben.
Dieses Tutorial ist dazu da supplementär zu den Server Administratioren zu wirken, die bereits die Gefahren einer Software die dem globalen Internet ausgesetzt ist kennen. dieser guide erwägt den Fakt das manche Personen einen node ohne linux Server management Erfahrung betreiben wollen. Es ist empfohlen das du zumindest die bash skript Sprache kennst und weißt wie du das Linux Datei System durch ein Terminal leitest, bevor du diesem Tutorial folgst.
Dieses Tutorial nutzt Debian 12. Wenn du Erfahrung mit adneren Distributionen hast die du nutzen willst tue dies auf eigene Gefahr. Dieser Guide wird UFW als Firewall verwenden.
Dieser Guide nimmt an, dass du ein Terminal mit OpenSSH installiert benutzt. Wenn du auf Linux bist hast du vermutlich schon OpenSSH, aber auf MacOS wirst du es vermutlich zuerst herunterladen müssen. Auf Windows kannst du das Subsystem für Linux (WSL) installieren und dann OpenSSH installieren.
Lies die ganze Seite, überspringe keine Schritte wenn du nicht erfahren bist oder nur wenig Wissen mit Linux hast
Ort: Nutze eine gut verbundenes Datencenter um deine node zu betreiben mit guter Geschwindigkeit (~ 300Mbit/s).
Hardware: 4GB Ram und 2 Kerne sollten genug sein, aber das könnte sich ändern.
Bandbreite: Ein Monat Betriebszeit könnte in über 1TB von Bandbreite enden, nutze einen Anbieter der unbegrenzte Bandbreite zur verfügung stellt mit mindestens 3TB. (Lese dir die Nutzungsbedingungen des Anbieters durch, hier ist auch die Bandbreite zu finden.)
Merke das der Node Installierer automatisch deine globalen extern zugreifbare IP Adressen nutzen will. Nicht alle Anbieter stellen eine IPv6 Adresse zur verfügung, aber du benötigst zumindest eine globale IPv4 Adresse.
Diese Sektion des Tutorials ist haupsächlich auf der Server Seite. Sei Aufmerksam auf die Warnungs und Info Etiketten während des Tutorials und versichere dich, dass du client Prozesse machst wenn du danach gefragt wirst, und Server Prozesse auf dem Server.
Jedes System das dem globalen Internet ausgesetzt ist muss gehärtet werden um schlechte Akteure davor zu bewahren Zugriff auf deinen Server zu erlangen. Dein VPS/Serverandbierter wird das root Passwort auf seiner Webschnittstelle ausgeben oder es per e-mail senden.
Jedes System auf das man global zugreifen kann wird gehackt werden. Der einzige unhackbare Server ist einer der ausgeschaltet und nicht verbunden wird. Behalte im Kopf, dass ** as patchen und das erkennen von Befehlen und Werkzeugen die du nutzt deine beste Verteidigung ist**.
Um auf deinen Server zuzugreifen, bearbeite den folgenden Befehl und gebe die korrekte IPv4 Addresse in dein Terminal ein. Wenn die Verbindung erfolgreich ist wirst du aufgefordert das Passwort einzugeben werlches du von deinem Anbieter erhalten haben solltest. Wenn du das Passwort eingibst wird dir graphisch nichts gezeigt aber das Passwort wird erkannt werden.
ssh root@your-ipv4-address
Ersezte your-ipv4 Adresse mit deiner ip-Adresse für den Server.
Wenn du mit einer Wilkommensnachricht begrüßt wirst hast du dich erfolgreich eingeloggt.
Jezt werden wir alle Packete auf dem Server updaten. Für Debian funktioniert folgender Befehl:
apt update && apt upgrade -y
Das -y nach upgrade befiehlt dem Programm auf die: *bist du sicher das du upgraden willst Aufforderung, mit ja zu antworten. Zu diesem Status wirst du vielleicht gefragt ob du eine Datei ändern oder editieren willst, welche dein VPS Anbieter bereits editiert oder geändert hat damit diese mit seinem System funktioniert. Lass die Dateien erstmal unverändert.
jetzt solltest du berreit in deine Server als root geloggt sein.
Wir werden den adduser Befehl nutzen um einen neuen Nutzer auf deinem System zu erstellen.
adduser your_username
your_username sollte der Nutzername sein den du dir gut merken kannst
Jetz wirst du aufgefordert ein neues UNIX Passwort einzugeben. Du kannst wieder nicht sehen was du tippst. Merke dir das Passwort gut.
Danach wirst du aufgefordert Nutzerinformation einzugeben, du kannst das überspringen indem du Enter klickst, oder du kannst die Details ausfüllen.
Jetzt werden wir einen neuen Nutzer zu der sudo Gruppe hinzufügen, welche dem Nutzer administrator Priviliegien oder sudo Zugang gibt.
usermod -aG sudo your_username
Um zu verifizieren das du den Nutzer zu sudo hinzugefügt hast, lass den folgenden Befehl laufen: getent group sudo
Das sollte dir den Nutzernamen den du ausgewählt hast anzeigen zB.
sudo:x:27:your_username
Du wirst auch:
su - your_username
ausführen müssen. das wird den derzeitigen Nutzer (welcher die Root ist) zu dem neuen sudo nutzer ändern. Führe irgendeinen Command aus um sicherzustellen das du sudo Zugriff hast:sudo apt update -y
. Das sudo Passwort ist das Passwort das du für den sudo Nutzer ausgewählt hast.
Während du als Sudo Nutzer eingeloggt bist kannst du überprüfen ob dein System die benötigten .ssh Ordner hat
das setzt voraus das du in dem Home Verzeichnis deines System bist. Wenn du dir unsicher bist kannst du
cd ~
tippen und enter drücken. Du kannst auch denls -a
Befehl verwenden um verstecke Verzeichnise zu sehen. Ein Verzeichnis mit einer Periode davor, wird als versteckt gesehen. {.is-info}
ls .ssh
Wenn die Ausgabe angibt das dieses Verzeichnis nicht existiert kannst du irgendetwas hinein verschieben. So solltest du es erstellen:
mkdir .ssh
Diese Sektion ist für den client, wenn du zu deinem Server verbunden bist und du keinen anderen Tab oder Fenster auf deinem Client hast. Tippe
exit
, bis du bei localhost bist, oder bei dem hostname deines clients.
Wenn du keine Ipv4 Adressen mehr eingeben willst kannst du eine config Datei erstellen was die Verbindung zu deinem VPS leichter macht. Ich weiß nur wie das auf Linux und MacOS geht, wenn du WSL verwendest sollte es änhnlich sein.
touch ~/.ssh/config
vim ~/.ssh/config
oder nano ~/.ssh/config
.Host *spn-node
User *your_username
Port 22
IdentityFile ~/.ssh/id_rsa
HostName *your_ipv4_address
ssh spn-node
und der Server wird automatisch die config Datei für die Verbindung benutzenDiese Sektion ist auf der client Seite. Wenn du noch immer zu deinem VPS verbunden bist kannst du einen neuen tab erstellen mit CTRL + SHIFT + T. Lies die ganze Sektion und die informations und Warunungs Etiketten.
Diese Sektion wird sich mit dem generieren eines SSH Schlüsselpaares auseinandersetzen und dem hochladen des öffentlichen Schlüssels zu deinem Server, was die Passwort Authentifizierung und die Möglichkeit sich als root einzuloggen nimmt. Du kannst noch immer deinen sudo Nutzer zum root Nutzer wechseln wenn du weißt was du tust. Nur die Verbindung durch SSH als root ist deaktiviert.
Wenn du schon ein SSH Schlüsselpaar auf deinem Client hast, kannst du zu: Lade den öffentlischen Schlüssel
auf deinen Server springen
Zuerst musst du ein Schlüsselpaar in deinem client .ssh Ordner erstellen. Daher wird OpenSSH den Schlüssel ziehen was deinen Nutzer authentifiziert. Hier sind die Pfade für die meisten Betriebssysteme.
Schlüsselpaar Ort auf Linux: ~/.ssh/
Schlüsselpaar Ort auf Windows: C:\Users\your_username.ssh
Schlüsselpaar Ort auf MaOS: ~/.ssh/
Wir werden das ssh-keygen Programm nutzen um einen öffentlichen und einen privaten Schlüssel auf deinem Client zu erstellen.
ssh-keygen -t rsa
Du wirst aufgefordert mit: Enter file in which to save the key. ~/.ssh/id_rsa
Du kannst enter tippen wenn du das als deinen primären oder einzigen Schlüssel verwendest. du kannst den Namen zu was immer du auch willst ändern. Danach wirst du aufgefordert eine Passphrase einzugeben.
Es ist wichtig eine Passphrase zu nutzen da diese deinen Schlüssel sicherer macht. Ideal wähhlst du ein Passwort das du noch nie online verwendet hast und das du dir merken kannst. Die komplexität der Passphrase überlasse ich dir, aber sei schlau wenn du die Passphrase wählst.
Danach wirst du randomart sehen, und deinen .ssh Ordner welcher folgendes enthält.
Du wirst dann jedes mal wen du dich zum Server verbindest die Passphrase eingeben müssen.
Das ist leicht auf MacOS und Linux Clients. Wir werden den ssh-copy-id Befehl verwenden.
ssh-copy-id your_username@your_ipv4_address
your_username muss der sudo Nutzer sein den du vorher erstellt hast.
Wenn du auf Windows bist musst du aus WSL austeigen und die normale Windows Eingabeaufforderung nutzen. Wenn du in der Normalen Windows Eingabeaufforderung bist kopiere den Code unten.
Wenn du den Namen der id_rsa.pub Datei geändert hast musst du diesen Namen nutzen.
{.is-info}
scp .ssh/id_rsa.pub your_username@your_ipv4_address:~/.ssh/authorized_keys
Jezt teste die Verbindung indem du folgendes eingibst:
ssh your_username@your_ipv4_address
Wenn alles funktioniert hat solltest du aufgefordert werden eine Passphrase einzugeben und dann wirst du dich ohne das Passwort deines Nutzers verbinden.
Sei dir sicher das du einen anderen Weg hast auf deinen Server zuzugreifen. Nach diesem Punkt wirst du nicht mehr fähig sein mit SSH zu deinem Server als root zu kommen, oder ein Passwort als sudo Nutzer zu verwenden. Eine erfolgreiche Schlüssel Authentifizierung wird dann der einzige Weg sein auf deinen Server zuzugreifen.
Diese Subsektion ist auf der Server-Seite. Du musst Vim oder Nano verwenden um die Dateien zu editieren. Wir schauen uns die sshd_config Datei an. Auf Debian 12 ist diese in dem /etc/ssh/
Verzeichnis. Dieses Verzeichnis hat einige sshd_config Datein die einen .d Dateityp nach dem Namen haben. Wir suchen nur die sshd_config Datei.
Um die Datei anzusehen:
cat /etc/ssh/sshd_config
Das sollte dir die Inhalte der Datei in deinem Terminal ausgeben. wir suchen nach:
Ändere alle Eingaben zu dem folgenden indem du entweder Vim (nutze nur Vim wenn du die Unterschiede der Moduse kennst) oder Nano verwendest. entferne hashtags vor den Eingaben.
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
PermitRootLogin no
Schreibe und beende den Editor.
Wenn du ChallengeResponseAuthentication nicht findest kanst du die Zeile unten hinzufügen PasswordAuthentication.
Wenn du fertig bist starte den SSH daemon neu.
sudo systemctl restart sshd
jetzt solltest du versuchen deine Verbindung mit exit
zu verlassen, und versuchen dich als root Nutzer zu verbinden. ssh root@your_ipv4_address
. Du solltest sehen das dein Zugriff automatisch verweigert wird. Du kannst auch versuchen dich neu als sudo Nutzer mit deinem Server zu verbinden. Du musst nur die Passphrase eingeben.
Uncomplicatet Firewall ist ein Firewall konfigurations Werkzeug das auf dem iptables Programm läuft. Um sicherzustellen das der SPN node korrekt funktionert werden wir ports öffnen müssen. Manche dieser ports werden so konfigurert das sie ein bisschen mehr sicheres Umfeld zulassen.
Diese Sektion nimmt an das du mit deinem Server verbunden bist. Verbinde dich mit deinem Server bevor du die folgenden Befehle durchführst. Fall du diese ports auf deinem client Gerät öffnest wirst du dich vielleicht schlechten Akteuren aussetzen. (Wenn du UFW installiert hast und Linux nutzt.
Zuerst versichere dich das du UFW installiert hast:
sudo apt install ufw
Wenn du aufgefordert wirst es zu installieren, tippe y und drücke enter. Nachdem es fertig installiert ist nutze:
sudo ufw status
Je nach deiner Ausgabe wirst du sehen ob es aktiv oder inaktiv ist. Wir wollen den Service noch nicht aktivieren. Wenn er aktiv ist springe zu Port management und deaktiviere es.
Network Mapper ist ein Werkzeug das Ports auf globalen oder lokalen Computern scannen kann. Nmap kann offene oder geschlossene Ports in einem System scannen und Information über das system erlangen, was ein schlechter Akteur nutzen kann um dein System auszubeuten.
Diese kleine subsektion wird sich damit beschäftigen wie du denen server scannen kannst und sicher stellen kannst welche ports offen und welche geschlossen sind. Diese Sektion nimmt auch an das du auf Linux bist.
Das sollte auf deinem Client und nicht auf deinem Server sein.
Installiere Nmap mit dem Packet Manager deiner Distribution:
sudo apt install nmap
Dann führe folgendes aus:
sudo nmap -sW <your-server-ip-address>
Es dauert vielleicht etwas bis dein Terminal etwas anzeigt warte einfach kurz.
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-31 17:29 CEST
Nmap scan report for vps-my-server-address.stwvps.net (my-server-address)
Host is up (0.043s latency).
Not shown: 994 filtered tcp ports (no-response)
PORT STATE SERVICE
17/tcp open qotd
22/tcp open ssh
80/tcp closed http
443/tcp closed https
8080/tcp closed http-proxy
8888/tcp closed sun-answerbook
Das wird Window Scan genannt wie du sehen kannst habe ich manche offene und manche geschlossene ports. SPN wird sich trozdem mit diesen Ports verbinden aber Nmap zeigt sie als closed an.
Auf deinem Server soltest du jetzt UFW installiert haben. Fürs erste werden wir sie deaktivieren (Wenn sie aktiv ist) und zurücksetzen, wir werden sie aktivieren sobald wir einige Regeln zu unserer Firewall hinzugefügt haben.
Führe aus:
sudo ufw disable
dann
sudo ufw reset
Jetzt wird sudo ufw status verbose
oder sudo ufw status
keine Regeln anzeigen. Wenn du glaubst das du unabsichtlich eine Regel hinzugefügt hast kannst du dir die Regeln mit sudo ufw show added
anschauen.
Zuerst wollen wir den SSH port hinzufügen damit er Verbindungen erlaubt.
Lese die nächste Sektion aufmerksam
sudo ufw limit 22/tcp
Nutze die untere Methode nicht wenn du nicht verstehst wie sie funktioniert oder wenn du die erste Lösung verwendet hast
Wenn du diese Methode verwendest um deinen Server zu sichern, nutze eine statische IP. Wenn du diese Regel hinzufügst und UFW aktiv ist wird es unmöglich sein deinen Sever mit einer anderen IP zu betreten. (Dein VPS Anbieter könnte eine Web Konsole haben mit der dein Server gerettet werden kann.)
sudo ufw allow from your-static-ip-address proto tcp to any port 22
Jetzt werden wir Ports zu der Firewall hinzufügen und Verbindungen von ihnen erlauben.
Fürs erste werden wir diese Ports erlauben damit SPN eine Verbindung herstellen kann wenn wir SPN auf dem System installieren.
Führe jede Zeile seperat aus
sudo ufw allow 17/tcp
sudo ufw allow 80/tcp
sudo ufw allow 8080/tcp
sudo ufw allow 443/tcp
sudo ufw allow 17017/tcp
Unsere Firewall ist noch immer nicht aktiv, aber wir werden sie bald aktivieren. Zuerst müssen wir das Netzwerk weiter härten bis wir die Firewall aktivieren und die node software installieren können.
Wenn du dich vertippt hast und einen falschen Port erlaubt hast, kannst du
sudo ufw delete allow 80/tcp
ausführen ersetze die Zahl mit der Zahl die du eingetippt hast.
Wir werden manche core Regeln der UFW für diese Sektion ändern, lies aufmerksam und wenn du dir unsicher bist was du tun sollst, überspringe diese Sektion. Diese Sektion zu überspringen macht dein System anfälliger für Angreifer da diese sehen können welche ports und services derzeit laufen.
TCP handshakes bestehen aus einem drei Wege handshape: SYN, SYN-ACK, und ACK. Abnormale Verbindugnen starten nicht mit der SYN flagge, und folgen nicht dem TCP Drei wege handshake. Schlechte Akteure versuchen daher TCP Packete mit ungewöhnlichen und komischen Flaggen kombinationen zu senden, welche wir mit UFW blockieren werden.
Wir werden uns die beiden Dateien unter /etc/ufw/
ansehen die Dateien mit denen wir arbeiten sind:
Nutze deinen Lieblings Editor und öffne die Datei. Merke, dass wenn du auf deinem sudo nutzer bist du sudo ausführen solltest bevor du die Datein öffnest, sonst kannst du diese nicht editieren. z.B sudo nano /etc/ufw/before.rules
In dieser Datei suchen wir nach dieser Sektion:
# drop INVALID packets (logs these in loglevel medium and higher)
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
nach der letzten Zeile solltest du folgendes hinzufügen:
-A ufw-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ufw-logging-deny
-A ufw-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP
Für before6.rules füge diese Zeilen hinzu:
-A ufw6-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j ufw6-logging-deny
-A ufw6-before-input -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j DROP
Schreibe und verlasse die Datei. Jetzt können invalide Packete nicht mehr verwendet werden um zu indetifizieren welche Ports auf deinem System offen sind wenn du UFW nutzt.
jetzt können wir endlich UFW aktivieren, weil wir den Service nie aktiviert hatten mussten wir nicht den Service neu laden damit die Änderungen in Kraft treten. lasse folgendes laufen:
sudo ufw enable
Du wirst vielleicht informiert das SSH Verbindungen unterbrochen sind, aber du solltest noch immer verbunden sein da du einen validen Schlüssel hast.
Wenn alles gut funktioniert und UFW meldet das sie aktiv ist. Führe sudo ufw reload
aus. Versichere dich, dass unsere Regeln hinzugefügt wurden. Du kannst auch cat /etc/ufw/before.rules
machen und wenn es die 2 zusätlichen Zeilen auspuckt, sollten diese jetzt funktionieren. Du kannst auch sudo ufw status verbose
machen um eine Ausgabe der derzeitigen port Regeln zu erhalten.
Hier ist ein vorher und ancher Nmap Window scan wenn UFW richtig konfiguriert ist:
Vorher:
Starting Nmap 7.94 ( https://nmap.org ) at 2024-03-31 17:29 CEST
Nmap scan report for vps-my-server-ip.stwvps.net (my-server-ip)
Host is up (0.043s latency).
Not shown: 994 filtered tcp ports (no-response)
PORT STATE SERVICE
17/tcp open qotd
22/tcp open ssh
80/tcp closed http
443/tcp closed https
8080/tcp closed http-proxy
8888/tcp closed sun-answerbook
(Merke: nur weil ein Service als closed angezeigt wird heißt das nicht das er nicht von anderen Programmen verwendet wird, UFW zeigt ob ein Port von der Liste seiner bekannten applikationen genutz wird.)
Danach
Starting Nmap 7.94 ( https://nmap.org ) at 2024-04-01 23:46 CEST
Nmap scan report for vps-my-server-ip.stwvps.net (my-server-ip)
Host is up (0.0097s latency).
All 1000 scanned ports on vps-my-server.stwvps.net (my-server-ip) are in ignored states.
Not shown: 1000 filtered tcp ports (no-response)
Mit dieser Verhärtung ist die Möglichkeit das ein schlechter Akteur Zugriff erlangt gering. Das Passwortlose SSH setup versichert, dass du nur 6 Verbindungen von einer Bestimmten IP erhalten kannst, die sich versucht mit deinem Port 22 zu verbinden. Sie werden auch automatisch abgelehnt da sie keinen id_rsa.pub Schlüssel haben. Root ist auch deaktiviert, somit kann sich niemand als root einloggen. Sie könnten Zugriff erlangen, wenn du ein schwaches Passwort mit deinem VPS Anbieter hast und sie Zugriff auf die Web konsole erlangen. Ich empfehle 2FA zu nutzen um diese Attacken zu verhindern.
Wir haben auch die Möglichkeit verhindert, dass jemand scannen kann welche ports offen sind. Das lässt Angreifer im dunkeln was es für sie schwer macht zu entscheiden wie sie attakieren. Es gibt weitere Möglichkeiten deinen Schutz zu verbesssern. Aber das liegt außerhalb dieses Tutorials. Schau in die UFW leistungs Optimierung.
Wir haben auch maleware und rootkit scanning ausgelassen. Maldet und ClamAV scans können sehr Resourcen intensiv sein. Wir wollen nicht das SPN Nutzer schlechtere Leistung erfahren weil wir ein maleware oder rootkit scan laufen. Malware kann von vielen Quellen kommen, aber sie wird normalerweise heruntergeladen und ausgeführt, oder von einem Angreifer injektziert. Wenn du keine komischen Skripte herunterlädst oder nutzt ist es sehr unwahrscheinlich das du malware bekommst. Rootkits müssen außerdem von jemandem platziert werden der Administratorzugriff hat, also wenn du ein Rootkit auf deiner box hattest wurdest du bereits kompromittiert, oder hast ein skrip oder software ausgeführt welche sudo Zugriff hatte und das kit unabsichtlich selbst platziert