Heute mal etwas Vorbereitung für Spass und Unterhaltung mit Freunden, aber incl. Absicherung eines Linux Systems das direkt im Internet steht.
Der erste Schritt ist die Beschaffung eines Cloud Servers. Ich persönlich benutze da bevorzugt immer die Systeme von Contabo, aber das ist persönliche Preferenz. Für unseren kleinen dedizierten Game Server benutzen wir einen Cloud VPS M mit 6 vCPU Kernen, 16 GB RAM, 200 GB NVMe mit Ubuntu 22.04.
Je nach Spieleranzahl und ob ihr das System auch für andere Themen nutzt wollt, könnt ihr die Maschine natürlich kleiner oder größer wählen. Da das speichern von Spielständen, besonders bei Satisfactory, besonders Disk I/O intensiv ist, empfehle ich aber die NVMe Varianten zu nutzen. Ich verdoppele die auch gerne immer direkt, da ich ungern im Nachgang an den Disks arbeite.
Das System sollte nun in maximal 3 Stunden zur Verfügung stehen. Sobald dies getan ist, fange ich immer mit der Absicherung des Systems nach außen und meines root Accounts an.
Sobald das System verfügbar ist, empfehle ich euch im Contabo „Ihre Dienste“ Bereich einen Snapshot zu erstellen. Das sollte dann circa so aussehen.
Im ersten Schritt nutze ich folgendes Skript um die Linux Firewall so zu konfigurieren, dass ein bestimmter Port, ich nutze im Skript als Beispiel 51820, nur von einem dedizierten dynamischen DNS Namen erreichbar ist. Ich benutze persönlich die Dienste von no-ip DynDNS um die IP Adresse meines DSL Anschlusses so dort zu hinterlegen.
#!/usr/bin/python3
# Only allow a particular HOSTNAME to access the given port...
# from https://unix.stackexchange.com/a/534117/66983
# and https://unix.stackexchange.com/a/91711/66983
# If the ufw table is empty you might need to execute the script twice (as inserting on top will not work properly)
# crontab -e and add '*/5 * * * * root /path/to/update_ufw.py > /dev/null 2>&1'
HOSTNAME="mydyndns.org"
PORT=51820
import os
import subprocess
if os.geteuid() != 0:
print("This script must be run as root")
exit(1)
def run(cmd):
process = subprocess.Popen(['bash', '-c', cmd],
stdout=subprocess.PIPE)
stdout, stderr = process.communicate()
return stdout.decode('utf-8')
new_ip_output = run("getent ahosts \"{}\" | awk '{{ print $1 }}'".format(HOSTNAME))
new_ips=set(new_ip_output.split())
old_ip_output = run("/usr/sbin/ufw status | grep {} | head -n1 | tr -s ' ' | cut -f3 -d ' '".format(HOSTNAME))
old_ips=set(old_ip_output.split())
if old_ips == new_ips:
print ("All IPs still OK.")
else:
# add new IPs
for new_ip in new_ips:
if new_ip not in old_ips:
out = run("/usr/sbin/ufw insert 1 allow from {} to any port {} comment {}".format(new_ip, PORT, HOSTNAME))
print(out)
# remove old IPs
for old_ip in old_ips:
if old_ip not in new_ips:
out = run("/usr/sbin/ufw delete allow from {} to any port {}".format(old_ip, PORT))
print(out)
# add deny rule
out = run("/usr/sbin/ufw deny {}".format(PORT))
print(out)
Ersetzt den Port 51820 und den dynamischen DNS Namen „mydyndns.org“ entsprechend eurer persönlichen Konfiguration.
Dieses Skript müsst ihr auf dem Server ablegen oder anlegen. Ich erstelle dies lokal und kopiere es per WinSCP nach /etc/. Nun müsst ihr das Skript ausführbar machen und dann zweimal ausführen. Beim erstenmal ausführen wird die ufw initial konfiguriert und es kommt zu einem Fehler „ERROR: Invalid position ‚1‘
Nun passt ihr die ssh config an. Das geht mit folgendem Befehl und die config Datei sollte danach so aussehen:
Nun startet ihr den ssh Dienst mit dem Befehl „service ssh restart“ neu und verbindet euch mit Putty über den neuen Port 51820 auf das System.
Dies ist für mich persönlich immer der wichtigste Schritt um Systeme mit dem Default SSH Port vor Scannern im Internet zu schützen. Danach beginne ich erst mit den weiteren Aufgaben um das System mir anzupassen und abzusichern.
Im nächsten Schritt installieren wir die aktuellen Sicherheitsupdates. Dazu benötigt es unter Ubuntu 22.04 nur zwei Befehlen.
sudo apt update
sudo apt upgrade
Wer dazu weitere Hilfe benötigt oder sich in den Prozess einlesen will, dem empfehle ich diesen Artikel
Mit dem folgenden Befehl ändern wir den Namen des Systems. Damit ich es sofort erkenne und da das System nur einem Zweck dienen wird, benenne ich es entsprechend dem public DNS Namen.
sudo hostnamectl set-hostname amp.hartig-online.de
Mit diesem Befehl wird das System in amp.hartig-online.de umbenannt.
Wichtig ist hier, dass die Anzeige des hostname erst nach einem reconnect oder reboot des Systems sichtbar wird.
Damit beenden wir den ersten Teil und im nächsten Teil sichern wir den Server noch etwas ab. Dazu gehört ein kleines Werkzeug zum erkennen von Exploits und ein automatischer Prozess, der uns informiert, wenn sich ein root user anmeldet.
In den folgenden Artikeln findet ihr die weiteren Komponenten und Schritte:
Schritt 2. : Installation des AMP Gaming Servers
Optional: Ubuntu – rkhunter & ClamAV zur Suche nach Rootkits