07.02.2025, 17:30 (Dieser Beitrag wurde zuletzt bearbeitet: 07.02.2025, 17:57 von Manfred Aabye.)
Anfängerhilfe Server vor Fremdangriffen sichern
Die Uncomplicated Firewall (UFW) ist ein benutzerfreundliches Frontend für iptables und hilft dabei,
die Sicherheit Deines Servers zu gewährleisten, indem sie unerwünschte Verbindungen blockiert.
In dieser Anleitung zeige ich Dir, wie Du offene Ports ermitteln und die notwendigen Regeln in UFW konfigurieren kannst.
Schaut auch bei einem Neustart Eures Servers die offenen Ports und Apps an (sudo ufw app list) und sucht nach unbekannten verhalten.
Datei readopenport.sh
Dieses Skript ermittelt die offenen Ports auf Deinem Server und speichert sie in einer Datei namens offene_ports.txt.
--- bash
Code:
#!/bin/bash
# Ermitteln der offenen Ports und Speichern in einer Datei
sudo ss -tuln | awk 'NR>1{print $5}' | grep -oE '[0-9]+$' | sort -n | uniq > offene_ports.txt
---
Datei setufwports.sh
Dieses Skript überprüft, ob UFW installiert ist, und installiert es bei Bedarf.
Anschließend erstellt es ein weiteres Skript ufw_commands.sh,
das die UFW-Befehle zum Öffnen der ermittelten Ports enthält.
--- bash
Code:
#!/bin/bash
# Funktion um zu prüfen, ob ufw installiert ist
function check_ufw_installed {
if ! command -v ufw &> /dev/null; then
echo "ufw ist nicht installiert."
read -p "Möchtest Du ufw installieren? (ja/nein): " choice
case "$choice" in
ja|Ja ) sudo apt-get update && sudo apt-get install ufw;;
* ) echo "ufw wird nicht installiert. Beenden."; exit 1;;
esac
else
echo "ufw ist bereits installiert."
fi
}
# ufw Installation prüfen
check_ufw_installed
# Datei mit offenen Ports
PORT_FILE="offene_ports.txt"
# Check if file exists
if [[ ! -f $PORT_FILE ]]; then
echo "Datei $PORT_FILE existiert nicht."
exit 1
fi
# UFW-Befehle in ufw_commands.sh schreiben und Kopfzeile hinzufügen
{
echo "#!/bin/bash"
while IFS= read -r port
do
echo "sudo ufw allow $port/tcp"
echo "sudo ufw allow $port/udp"
done < "$PORT_FILE"
} > ufw_commands.sh
echo "UFW-Befehle wurden in ufw_commands.sh gespeichert und die Kopfzeile wurde hinzugefügt."
---
Zum Schluss müsst ihr noch Eure Firewall starten:
sudo ufw enable
Hier sind die wichtigsten UFW Befehle zur Verwaltung Deiner Firewall:
sudo ufw enable: Aktiviert die Firewall
sudo ufw disable: Deaktiviert die Firewall
sudo ufw default ARG: Setzt die Standardrichtlinie
sudo ufw logging LEVEL: Setzt das Logging auf LEVEL
sudo ufw allow ARGS: Fügt eine Erlaubnisregel hinzu
sudo ufw deny ARGS: Fügt eine Ablehnungsregel hinzu
sudo ufw reject ARGS: Fügt eine Zurückweisungsregel hinzu
sudo ufw limit ARGS: Fügt eine Begrenzungsregel hinzu
sudo ufw delete RULE|NUM: Löscht REGEL oder NUMMER
sudo ufw insert NUM RULE: Fügt REGEL an Stelle NUMMER ein
sudo ufw prepend RULE: Fügt REGEL am Anfang ein
sudo ufw route RULE: Fügt eine Routenzuweisungsregel hinzu
sudo ufw route delete RULE|NUM: Löscht Routenzuweisungsregel oder NUMMER
sudo ufw route insert NUM RULE: Fügt Routenzuweisungsregel an Stelle NUMMER ein
sudo ufw reload: Lädt die Firewall neu
sudo ufw reset: Setzt die Firewall zurück
sudo ufw status: Zeigt den Firewall-Status an
sudo ufw status numbered: Zeigt den Firewall-Status als nummerierte Liste der REGELN an
sudo ufw status verbose: Zeigt den ausführlichen Firewall-Status an
sudo ufw show ARG: Zeigt den Firewall-Bericht
sudo ufw version: Zeigt Versionsinformationen an
Anwendungsprofil-Befehle:
sudo ufw app list: Listet Anwendungsprofile auf
sudo ufw app info PROFILE: Zeigt Informationen zu PROFILE an
sudo ufw app update PROFILE: Aktualisiert PROFILE
sudo ufw app default ARG: Setzt die Standard-Anwendungsrichtlinie
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.
Um es gleich vorweg zu nehmen, ich bin ein grosser Fan der ufw und finde jeden Beitrag gut, der dazu motiviert dieses Tool zu verwenden.
Bei der Verwendung dieses Scripts sehe ich allerdings auch Probleme, denn Tools wie ss (oder netstat) zeigen nicht die tatsächlich offenen Ports, sondern Ports die von einem gerade laufenen Programm abgehört werden. Dabei werden auch Ports gelistet die an die interne lokale Adresse gebunden sind und eigentlich gar nicht nach aussen geöffnet werden müssen.
Ich persönlich bin der Meinung, dass man wissen sollte, welche Ports von welcher Anwendung benötigt werden. Vorausgesetzt, dass alle Systeme laufen, kann das mit dem Befehl 'ss -tulp' oder 'ss -tulpn' (Port Nummern statt Namen) abgerufen werden. Ein leicht abgeändertes Besipiel von einem Raspberry Pi der hinter einem Home-Router mit DHCP-Server steht:
Damit wird ersichtlich, von welcher Anwendung welche Ports benutzt werden (wegen der Übersichtlichkeit habe ich Im Beispiel die Spalten Recv-Q, Send-Q und Peer-Address : Port entfernt).
Die Anbindung des Ports an die Adresse 0.0.0.0 steht unabhängig von der tatsächlichen IP-Adresse für alles was von aussen über IPv4 an den Rechner adressiert wird. [::] gilt entsprechend für IPv6.
127.0.0.1 gilt für Ports die an die interne Adresse (localhost) gebunden sind und somit von aussen nicht zugänglich sein müssen (und somit auch nicht dürfen). Ein * gilt für alle Adressen, egal ob intern oder extern, IPv4 oder IPv6.
Im Beispiel ist der Port 9000 für udp und tcp interessant. Er gehört zum Prozess dotnet. Es sollte allen Betreiber*innen eines OpenSim Servers klar sein, dass es sich damit um OpenSimulator handeln könnte, das mit 'dotnet OpenSim.dll' gestartet wurde.
Damit in Verbinung steht mariadb das an die interne Adresse gebunden ist und im konkreten Fall von der OpenSim benutzt wird. Wenn falsch konfiguriert, kann der Port auch an die externe Adresse gebunden werden und das möchten wir natürlich nicht. Deshalb wollen wir diesen Port auch niemals nach aussen hin öffnen.
Ähnliches gilt für den Prozess containerd, der zu Docker gehört, sowie den Port 2019 von caddy.
Caddy ist ein Web Server, der hier auf allen Schnittstellen an den TCP Ports http (80) und https (443) hört. Da Caddy auch DNS über https unterstützt muss hier der https Port nach aussen hin geöffnet werden. Das kann man der Dokumentation von Caddy entnehmen. Der Port 2019 hingegegen, darf niemals nach aussen hin zugänglich sein, weil darüber über ein API die gesamte Konfiguration zugänglich und somit veränderbar ist.
Da ich mich auf desem Pi von aussen nur über SSH einlogge muss auch dieser Port geöffnet sein. Da ssh-Login-Versuche von aussen aber extrem häufig stattfinden verwende ich auf all meinen Systemen eine andere Port Nummer. Das bedeutet nicht, dass mein System deswegen sicherer ist, aber es hält mir die Logs wesentlich sauberer.
Da bleiben noch die offenen Ports vom Prozess dhcpcd, der auf jedem Raspberry Pi vorinstelliert ist und den es in der Regel auch braucht. Er dient dazu beim Starten von einem DHCP Server (in der Regel vom Router) eine IP Adresse im LAN oder WLAN zu erhalten. Hmmm... muss dieser Port jetzt offen sein oder nicht? Da noch andere Komponenten mithineinspielen ist die Frage gar nicht so einfach zu beantworten. Bevor ich den Port aus den allow-Rules entfernte musste ich mir zuerst eine Notfallstratgeie überlegen, was zu tun ist, falls es nicht funktioniert. Es hat sich dann herausgestellt, dass sich in meinem Fall der Pi beim Starten die IP vom Router holt und in der Tat keine Verbindung von aussen her nötig ist. Ohne den dhcpcd Prozess, hätte mein Pi aber keine im LAN/WAN gültige IP Adresse und er wäre nicht erreichbar.
Der langen Rede kurzer Sinn: ich benötige zur Konfiguration meiner Firewall nur folgende vier Befehle:
Ubuntu Server Absicherung – Eine Einfache Anleitung für Anfänger
Die Absicherung eines Servers ist entscheidend, um unbefugte Zugriffe und Angriffe zu verhindern. Eine gute Firewall, sichere Anmeldeoptionen und die Konfiguration von SSH sind nur einige der Maßnahmen, die dir helfen, deinen Ubuntu-Server sicherer zu machen.
1. Installiere und Aktiviere UFW (Uncomplicated Firewall)
Eine der einfachsten Möglichkeiten, deinen Server zu sichern, ist die Verwendung einer Firewall. Die UFW ist eine benutzerfreundliche Möglichkeit, eine Firewall zu konfigurieren und zu verwalten.
Schritt 1: Installiere UFW
Öffne dein Terminal und gebe folgenden Befehl ein, um sicherzustellen, dass UFW auf deinem Server installiert ist:
sudo apt-get update
sudo apt-get install ufw
Schritt 2: Aktiviere die Firewall
Standardmäßig wird die Firewall nach der Installation deaktiviert. Um sie zu aktivieren, gebe den folgenden Befehl ein:
sudo ufw enable
Dies blockiert alle eingehenden Verbindungen, es sei denn, du gibst explizit an, welche Verbindungen erlaubt werden sollen.
Schritt 3: Erlaube den SSH-Zugang
Wenn du per SSH auf deinen Server zugreifen möchtest (was normalerweise der Fall ist), musst du sicherstellen, dass SSH-Verbindungen zugelassen werden:
sudo ufw allow ssh
Alternativ kannst du den spezifischen Port angeben (Standardport ist 22), aber dies wird später in diesem Tutorial geändert.
Schritt 4: Überprüfe den Status der Firewall
Um zu prüfen, ob die Firewall aktiv ist und welche Regeln momentan angewendet werden, kannst du folgendes eingeben:
sudo ufw status
2. Ändere den Standard-SSH-Port für zusätzliche Sicherheit
Eine einfache, aber sehr effektive Methode zur Verbesserung der Sicherheit ist das Ändern des SSH-Ports. Der Standard-SSH-Port (Port 22) ist weithin bekannt und ein Ziel für viele Angreifer. Das Ändern des Ports kann potenzielle Angreifer abschrecken.
Schritt 1: Ändere den SSH-Port
Öffne die SSH-Konfigurationsdatei mit einem Texteditor:
sudo nano /etc/ssh/sshd_config
Suche nach der Zeile `Port 22` und ändere den Port auf eine Zahl zwischen 30000 und 65535, zum Beispiel:
Port 34567
Schritt 2: Firewall anpassen
Nachdem du den SSH-Port geändert hast, musst du sicherstellen, dass der neue Port in der UFW-Firewall erlaubt ist. Zum Beispiel, wenn du Port `34567` gewählt hast, gib folgenden Befehl ein:
sudo ufw allow 34567/tcp
Den Standard-Port 22 kannst du dann blockieren, um unnötige Verbindungen zu verhindern:
sudo ufw deny 22/tcp
Schritt 3: SSH-Dienst neu starten
Damit die Änderungen wirksam werden, musst du den SSH-Dienst neu starten:
sudo systemctl restart ssh
Jetzt wird der SSH-Zugang nur noch über den neuen Port ermöglicht. Wenn du dich mit deinem Server verbinden möchtest, musst du beim SSH-Befehl den neuen Port angeben:
ssh -p 34567 username@server_ip
3. Verwende SSH-Schlüssel anstelle von Passwörtern
Passwörter sind oft anfällig für Brute-Force-Angriffe. Eine sichere Alternative sind SSH-Schlüssel , die viel schwieriger zu erraten oder zu knacken sind.
Schritt 1: SSH-Schlüssel erzeugen
Erzeuge ein SSH-Schlüsselpaar auf deinem lokalen Rechner (deinem PC) mit folgendem Befehl:
ssh-keygen
Drücke `Enter`, um den Standard-Speicherort zu wählen. Du kannst auch ein Passwort für zusätzlichen Schutz setzen.
Schritt 2: Kopiere den öffentlichen Schlüssel auf deinen Server
Übertrage deinen öffentlichen Schlüssel auf den Ubuntu-Server:
ssh-copy-id -p 34567 username@server_ip
Gib dein Passwort ein, wenn du dazu aufgefordert wirst.
Schritt 3: Deaktiviere die Passwort-Authentifizierung
Um sicherzustellen, dass nur Schlüssel-basierte Authentifizierung verwendet wird, öffne die SSH-Konfigurationsdatei erneut:
sudo nano /etc/ssh/sshd_config
Stelle sicher, dass die folgenden Zeilen auf "no" gesetzt sind:
PasswordAuthentication no
ChallengeResponseAuthentication no
Schritt 4: SSH-Dienst neu starten
Starte den SSH-Dienst neu, damit die Änderungen wirksam werden:
sudo systemctl restart ssh
4. Aktualisiere regelmäßig dein System
Sicherheitslücken werden ständig entdeckt, daher ist es wichtig, dass dein Ubuntu-System immer auf dem neuesten Stand bleibt.
Schritt 1: Automatische Sicherheitsupdates aktivieren
Du kannst sicherstellen, dass Sicherheitsupdates automatisch installiert werden, indem du folgendes tippst:
sudo apt-get install unattended-upgrades
Schritt 2: Manuelles Update durchführen
Um sicherzustellen, dass dein System alle verfügbaren Updates erhält, führe regelmäßig folgende Befehle aus:
sudo apt-get update
sudo apt-get upgrade
5. Verwende Fail2Ban zur Abwehr von Brute-Force-Angriffen
Fail2Ban ist ein Programm, das automatisch IP-Adressen sperrt, die versuchen, sich wiederholt mit falschen Anmeldeversuchen in dein System einzuloggen.
Schritt 1: Installiere Fail2Ban
Installiere Fail2Ban auf deinem Server:
sudo apt-get install fail2ban
Schritt 2: Starte und aktiviere Fail2Ban
Starten und aktivieren den Fail2Ban-Dienst:
Schritt 3: Überwache Fail2Ban
Um zu sehen, ob Fail2Ban Angreifer blockiert hat, kannst du folgendes eingeben:
sudo fail2ban-client status
Zusammenfassung der wichtigsten Maßnahmen
1. Installiere und aktiviere UFW , um nur erlaubte Verbindungen zu deinem Server zu lassen.
2. Ändere den SSH-Port von 22 auf einen zufälligen Port zwischen 30000 und 65535, um Brute-Force-Angriffe zu erschweren.
3. Verwende SSH-Schlüssel anstelle von Passwörtern, um eine sicherere Authentifizierung zu gewährleisten.
4. Aktualisiere regelmäßig dein System, um immer die neuesten Sicherheitsupdates zu erhalten.
5. Installiere und aktiviere Fail2Ban , um Brute-Force-Angriffe zu verhindern.
Mit diesen grundlegenden Schritten kannst du deinen Ubuntu-Server gut absichern.
Natürlich gibt es noch viele weitere Möglichkeiten, die Sicherheit zu erhöhen, aber dies sind die wichtigsten,
die dir helfen sollten, viele der gängigen Angriffe zu verhindern.
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.
15.02.2025, 11:57 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2025, 12:49 von Manfred Aabye.)
# ? Was dieses Skript macht:
# 1️⃣ Firewall & Sicherheitsmaßnahmen
# ✅ UFW (Uncomplicated Firewall) prüfen & installieren
# ➡ Falls UFW nicht installiert ist, wird sie automatisch installiert.
# ✅ SSH-Port ändern
# ➡ Der Benutzer kann einen neuen SSH-Port wählen, um Angriffe auf Port 22 zu vermeiden.
# ✅ SSH-Schlüssel-Authentifizierung aktivieren
# ➡ Deaktiviert das Login per Passwort und erlaubt nur noch Schlüssel-Authentifizierung.
# ✅ Automatische Sicherheitsupdates aktivieren
# ➡ Installiert unattended-upgrades, um sicherzustellen, dass dein Server immer aktuell bleibt.
# ✅ Fail2Ban installieren & aktivieren
# ➡ Schützt vor Brute-Force-Angriffen durch das automatische Sperren von IP-Adressen.
# 2️⃣ Offene Ports & Firewall-Regeln
# ✅ Alle offenen Ports anzeigen
# ➡ Zeigt, welche Ports von welchen Programmen genutzt werden (ss -tulpn).
# ✅ Benutzer entscheidet, welche Ports geöffnet werden
# ➡ Er kann manuell wählen, welche Ports über UFW freigegeben werden sollen.
# ✅ Firewall-Regeln anwenden
# ➡ Blockiert alle eingehenden Verbindungen, erlaubt aber ausgehenden Traffic.
# ✅ SSH-Dienst neu starten
# ➡ Wendet alle Änderungen an der SSH-Konfiguration an.
# 3️⃣ Erhöhte Sicherheit & Analyse
# ✅ Überprüfung fehlgeschlagener Login-Versuche
# ➡ Nutzt grep "Failed" /var/log/auth.log, um Angriffsversuche zu erkennen.
# ✅ Optionaler Portscan mit nmap
# ➡ Falls gewünscht, führt nmap einen umfassenden Scan aller 65.535 Ports durch.
# ? Warum ist dieses Skript wichtig?
# ✔ Minimiert Angriffsfläche: UFW schließt alle unnötigen Ports.
# ✔ Schützt gegen Brute-Force: SSH-Schlüssel & Fail2Ban sichern den Zugriff.
# ✔ Reduziert Sicherheitsrisiken: Automatische Updates verhindern Exploits.
# ✔ Gibt dir volle Kontrolle: Du entscheidest, welche Ports wirklich nötig sind.
Skript osmsafty.sh
PHP-Code:
#!/bin/bash
# Funktion zur Prüfung, ob UFW installiert ist function check_ufw_installed { if ! command -v ufw &> /dev/null; then echo "UFW ist nicht installiert. Installation wird durchgeführt..." sudo apt-get update sudo apt-get install -y ufw else echo "UFW ist bereits installiert." fi }
# Funktion zum Ändern des SSH-Ports function change_ssh_port { echo "Gib den neuen SSH-Port ein (Standard: 22):" read -r SSH_PORT
if [[ -z "$SSH_PORT" ]]; then SSH_PORT=22 fi
sudo sed -i "s/^#Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config sudo sed -i "s/^Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
echo "SSH-Port wurde auf $SSH_PORT geändert." }
# Funktion zur Aktivierung der SSH-Schlüssel-Authentifizierung function enable_ssh_keys { sudo sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config echo "SSH-Schlüssel-Authentifizierung wurde aktiviert." }
# Funktion zur Generierung eines SSH-Schlüssels function create_ssh_key { echo "Möchtest du ein neues SSH-Schlüsselpaar erstellen? (ja/nein)" read -r choice if [[ "$choice" == "ja" ]]; then ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa echo "SSH-Schlüssel wurde erstellt." fi }
# Funktion zur Aktivierung automatischer Updates function enable_auto_updates { echo "Aktiviere automatische Sicherheitsupdates..." sudo apt-get install -y unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades echo "Automatische Updates wurden aktiviert." }
# Funktion zur Installation und Aktivierung von Fail2Ban function install_fail2ban { echo "Installiere Fail2Ban..." sudo apt-get update sudo apt-get install -y fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban echo "Fail2Ban wurde installiert." }
# Funktion zur Anzeige aktuell offener Ports function list_ports { echo "Offene Ports auf diesem System:" ss -tulpn | awk '{print $1, $2, $5, $7}' | column -t }
# Funktion zur Konfiguration der benötigten Ports function configure_ports { echo "Welche Ports sollen geöffnet werden? (Trenne sie mit Leerzeichen, z. B. '22 80 443')" read -r PORTS
for PORT in $PORTS; do sudo ufw allow "$PORT" echo "Port $PORT wurde geöffnet." done }
# Funktion zur vollständigen Firewall-Konfiguration function configure_firewall { echo "Konfiguriere Firewall..." sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw enable echo "Firewall-Regeln angewendet: Eingehender Traffic wird blockiert, ausgehender ist erlaubt." }
# Funktion zum Scannen nach fehlgeschlagenen Login-Versuchen function check_failed_logins { echo "Überprüfung fehlgeschlagener Login-Versuche..." grep "Failed" /var/log/auth.log | tail -20 }
# Funktion zum Durchführen eines Portscans mit nmap function perform_portscan { echo "Möchtest du einen Portscan durchführen? (ja/nein)" read -r choice if [[ "$choice" == "ja" ]]; then echo "Gib die Ziel-IP für den Portscan ein:" read -r TARGET_IP sudo nmap -Pn -sS -sV --version-all --reason -v -A -O --osscan-guess -p0-65535 "$TARGET_IP" fi }