Geschätzte Lesezeit: Eine Kaffeepause - ca. 15 Minuten

2025-02-15

Ubuntu Server härten

Ein frisch aufgesetzter Ubuntu Server ist wie eine Wohnung mit offener Tür – funktional, aber nicht sicher. In dieser Anleitung zeigen wir Ihnen Schritt für Schritt, wie Sie Ihren Server professionell absichern: von der SSH-Key-Authentifizierung über Firewall-Konfiguration bis hin zum Schutz vor Brute-Force-Angriffen mit Fail2ban.

Variablen-Erklärung

In dieser Anleitung verwenden wir Platzhalter in eckigen Klammern, die Sie durch Ihre eigenen Werte ersetzen müssen. So bleibt die Anleitung flexibel und Sie können sie für jeden Server anwenden.

Diese Variablen müssen Sie anpassen:

[server-name] = FQDN oder IP-Adresse Ihres Servers

[server-user-name] = Ihr Benutzername auf dem Server

[service-name] = Bezeichnung für das System/den Service

Diese Variablen bleiben wie sie sind:

[client-name] = Ihr lokaler Linux-Client

[client-user-name] = Ihr lokaler Benutzername

1 Benutzer auf dem Server anlegen

WICHTIG: Schließen Sie diese Session nicht!

Dies ist Ihre Sicherheitsleine, falls bei der Konfiguration etwas schief geht. Alternativ können Sie eine Konsolen-Session Ihres Cloud-Providers nutzen.

Am Server anmelden

[client-user-name]@[client-name]:~$ ssh root@[server-name]

Benutzer erstellen

root@[server-name]:~# adduser [server-user-name]

info: Adding user `[server-user-name]' ...
info: Selecting UID/GID from range 1000 to 59999 ...
info: Adding new group `[server-user-name]' (1001) ...
info: Adding new user `[server-user-name]' (1001) with group `[server-user-name] (1001)' ...
info: Creating home directory `/home/[server-user-name]' ...
info: Copying files from `/etc/skel' ...
New password: 
Retype new password:

Benutzer zu Sudoers hinzufügen

Damit der neue Benutzer administrative Aufgaben ausführen kann, fügen wir ihn zur sudo-Gruppe hinzu:

root@[server-name]:~# usermod -aG sudo [server-user-name]

2 SSH-Schlüsselpaar auf dem Client erstellen

SSH-Keys sind deutlich sicherer als Passwörter. Ein Angreifer müsste Zugriff auf Ihren privaten Schlüssel haben, nicht nur ein Passwort erraten. Wir verwenden ed25519 – einen modernen, sicheren Algorithmus.

Verzeichnis für SSH-Keys anlegen

[client-user-name]@[client-name]:~$ mkdir -p /[encryptedfs]/[service-name]/config/.ssh

SSH-Schlüssel generieren

[client-user-name]@[client-name]:~$ ssh-keygen -t ed25519 -C "[service-name]"

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/[client-user-name]/.ssh/id_ed25519): /[encryptedfs]/[service-name]/config/.ssh/id_[service-name]
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /[encryptedfs]/[service-name]/config/.ssh/id_[service-name]
Your public key has been saved in /[encryptedfs]/[service-name]/config/.ssh/id_[service-name].pub
Tipp: Passphrase verwenden

Eine Passphrase schützt Ihren privaten Schlüssel zusätzlich. Selbst wenn jemand Zugriff auf die Datei erhält, kann er ohne die Passphrase nichts damit anfangen.

Public Key auf den Server kopieren

[client-user-name]@[client-name]:~$ ssh-copy-id -i /[encryptedfs]/[service-name]/config/.ssh/id_[service-name].pub [server-user-name]@[server-name]

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/[encryptedfs]/[service-name]/config/.ssh/id_[service-name].pub"
/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
[server-user-name]@[server-name]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[server-user-name]@[server-name]'"
and check to make sure that only the key(s) you wanted were added.

Verbindung mit SSH-Key testen

Testen Sie die Verbindung mit dem neu erstellten Schlüssel:

[client-user-name]@[client-name]:~$ ssh -i /[encryptedfs]/[service-name]/config/.ssh/id_[service-name] [server-user-name]@[server-name]

Wenn Sie sich erfolgreich anmelden können, funktioniert die Key-Authentifizierung!

3 SSH-Konfiguration härten

Jetzt kommt der wichtigste Schritt: Wir deaktivieren Passwort-Logins und erlauben nur noch SSH-Key-Authentifizierung. Außerdem blockieren wir den Root-Login komplett.

Haupt-Konfigurationsdatei bearbeiten

[server-user-name]@[server-name]:~$ sudo vim /etc/ssh/sshd_config

Fügen Sie folgende Zeilen hinzu oder ändern Sie diese ab:

# Enable key authentication
PubkeyAuthentication yes
# Disable password authentication
PasswordAuthentication no
# Block empty passwords
PermitEmptyPasswords no
# Block root login
PermitRootLogin no
# Allow only the user listed
AllowUsers [server-user-name]
# Disable X11 forwarding (enable only if you need to display GUI applications from the server on your local machine)
X11Forwarding no
# Max authentication tries before disconnect
MaxAuthTries 3
# SSH keepalive interval in seconds
ClientAliveInterval 300
# Max keepalive messages without response
ClientAliveCountMax 2

Zusätzliche Konfigurationsdateien prüfen

Einige Cloud-Provider legen eigene Konfigurationsdateien an, die Ihre Einstellungen überschreiben können. Prüfen Sie daher das /etc/ssh/sshd_config.d/ Verzeichnis:

[server-user-name]@[server-name]:~$ ls -al /etc/ssh/sshd_config.d/

total 12
drwxr-xr-x 2 root root 4096 Feb 15 06:19 .
drwxr-xr-x 4 root root 4096 Feb 15 06:23 ..
-rw-r--r-- 1 root root   26 Feb 15 06:19 dd-foo-bar.conf

Falls eine Datei PasswordAuthentication yes enthält, ändern Sie diese:

[server-user-name]@[server-name]:~$ sudo vim /etc/ssh/sshd_config.d/dd-foo-bar.conf
# Disable password authentication
PasswordAuthentication no

SSH-Service neu starten

Damit die Änderungen wirksam werden, starten Sie den SSH-Service neu:

[server-user-name]@[server-name]:~$ sudo systemctl restart ssh

Verifizierung - Sehr wichtig!

Testen Sie in einer neuen SSH-Session, ob:

  • Sie sich mit dem SSH-Key anmelden können
  • Sie sich nicht mit einem Passwort anmelden können
  • Sie sich nicht als root anmelden können

Schließen Sie Ihre ursprüngliche Session erst, wenn alle Tests erfolgreich waren!

4 UFW Firewall aktivieren

Eine Firewall ist essenziell für die Server-Sicherheit. UFW (Uncomplicated Firewall) macht die Konfiguration einfach und verständlich. Wir öffnen nur die Ports, die wirklich benötigt werden.

Firewall-Status prüfen

[server-user-name]@[server-name]:~$ sudo ufw status verbose

Status: inactive

Firewall-Regeln hinzufügen

Wichtig: Reihenfolge beachten!

Führen Sie die Befehle genau in dieser Reihenfolge aus. Wenn Sie zuerst alles blockieren und dann SSH erlauben, sperren Sie sich selbst aus!

[server-user-name]@[server-name]:~$ sudo ufw allow 22/tcp comment 'SSH'
[server-user-name]@[server-name]:~$ sudo ufw allow 80/tcp comment 'HTTP'
[server-user-name]@[server-name]:~$ sudo ufw allow 443/tcp comment 'HTTPS'
[server-user-name]@[server-name]:~$ sudo ufw default deny incoming
[server-user-name]@[server-name]:~$ sudo ufw default allow outgoing

Firewall aktivieren

[server-user-name]@[server-name]:~$ sudo ufw enable

Regeln überprüfen

[server-user-name]@[server-name]:~$ sudo ufw status numbered

Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere                   # SSH
[ 2] 80/tcp                     ALLOW IN    Anywhere                   # HTTP
[ 3] 443/tcp                    ALLOW IN    Anywhere                   # HTTPS
[ 4] 22/tcp (v6)                ALLOW IN    Anywhere (v6)              # SSH
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)              # HTTP
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)              # HTTPS
Weitere Ports öffnen

Falls Sie weitere Dienste betreiben (z.B. MySQL auf Port 3306 oder PostgreSQL auf 5432), fügen Sie diese mit sudo ufw allow 3306/tcp comment 'MySQL' hinzu.

5 Fail2ban für SSH einrichten

Fail2ban schützt vor Brute-Force-Angriffen, indem es IP-Adressen nach mehreren fehlgeschlagenen Login-Versuchen automatisch für eine bestimmte Zeit sperrt. Ein unverzichtbares Tool für jeden öffentlich erreichbaren Server.

Fail2ban installieren

[server-user-name]@[server-name]:~$ sudo apt update
[server-user-name]@[server-name]:~$ sudo apt install fail2ban

Lokale Konfiguration erstellen

Wir erstellen eine lokale Konfigurationsdatei, die Updates übersteht:

[server-user-name]@[server-name]:~$ sudo vim /etc/fail2ban/jail.local
[DEFAULT]
# Ban duration in seconds (3600 = 1 hour)
bantime = 3600
# Time window to count failed attempts (600 = 10 minutes)
findtime = 600
# Maximum failed attempts before ban
maxretry = 3
# Ignore localhost
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
Konfiguration verstehen

bantime: Wie lange eine IP gesperrt bleibt (3600 Sekunden = 1 Stunde)
findtime: Zeitfenster für fehlgeschlagene Versuche (600 Sekunden = 10 Minuten)
maxretry: Maximale Anzahl fehlgeschlagener Versuche (3 = nach dem dritten Versuch wird gebannt)

Fail2ban neu starten

[server-user-name]@[server-name]:~$ sudo systemctl restart fail2ban

Logs überprüfen

Überprüfen Sie, ob Fail2ban korrekt gestartet wurde:

[server-user-name]@[server-name]:~$ sudo tail /var/log/fail2ban.log

2026-02-15 18:44:45,543 fail2ban.filter         [92546]: INFO    maxRetry: 3
2026-02-15 18:44:45,543 fail2ban.filter         [92546]: INFO    findtime: 600
2026-02-15 18:44:45,543 fail2ban.actions        [92546]: INFO    banTime: 3600
2026-02-15 18:44:45,543 fail2ban.filter         [92546]: INFO    encoding: UTF-8
2026-02-15 18:44:45,544 fail2ban.jail           [92546]: INFO    Jail 'sshd' started
Fail2ban-Status prüfen

Mit sudo fail2ban-client status sshd können Sie sehen, wie viele IPs aktuell gebannt sind und wie viele fehlgeschlagene Login-Versuche registriert wurden.

Geschafft - Ihr Server ist jetzt deutlich sicherer!

Sie haben erfolgreich:

  • Einen dedizierten Benutzer mit sudo-Rechten angelegt
  • SSH-Key-Authentifizierung eingerichtet und Passwort-Login deaktiviert
  • Root-Login komplett blockiert
  • Eine Firewall konfiguriert, die nur notwendige Ports öffnet
  • Fail2ban installiert, um Brute-Force-Angriffe automatisch abzuwehren

Troubleshooting

Ich habe mich ausgesperrt - was nun?

Genau dafür sollten Sie die ursprüngliche SSH-Session offen gelassen haben! Falls Sie sich trotzdem ausgesperrt haben:

  • Nutzen Sie die Konsolen-Zugang Ihres Cloud-Providers
  • Setzen Sie PasswordAuthentication yes vorübergehend zurück
  • Starten Sie den SSH-Service neu: sudo systemctl restart ssh
  • Melden Sie sich an und prüfen Sie die Konfiguration erneut

Fail2ban hat meine eigene IP gebannt!

# IP entsperren:
sudo fail2ban-client set sshd unbanip IHRE-IP-ADRESSE

# Oder eigene IP zur Whitelist hinzufügen in /etc/fail2ban/jail.local:
ignoreip = 127.0.0.1/8 ::1 IHRE-IP-ADRESSE

Hinweis: Diese Anleitung bietet eine solide Basis-Absicherung für Ubuntu Server. Für produktive Umgebungen mit hohen Sicherheitsanforderungen empfehlen wir eine professionelle Security-Bewertung und individuelle Härtungsmaßnahmen.