Tutorial: Server-Sicherheit erhöhen – SSH-Zugang absichern

Alexander Nolte
Alexander Nolte 3 Minuten Lesezeit

Der SSH-Zugang (Secure Shell) ist das Haupttor zu deinem Server. Standardmäßig ist dieses Tor oft nur mit einem Passwort geschützt und anfällig für automatisierte Angriffe (Brute-Force). In diesem Tutorial lernst du, wie du den SSH-Zugang so absicherst, dass nur noch deine Ansible-Zentrale (und deine Administratoren-Geräte) per kryptografischem Schlüssel reinkommen und Angreifer komplett ausgesperrt werden.

⚠️ Wichtiger Sicherheitshinweis vorab!

Wenn du den Passwort-Login für SSH deaktivierst, kannst du dich nie wieder mit einem normalen Passwort anmelden.

  • Regel #1: Stelle vor dem Abschalten der Passwörter zwingend sicher, dass das Kopieren deines SSH-Schlüssels (ssh-copy-id) erfolgreich war und der passwortlose Login funktioniert.

  • Regel #2: Schließe deine aktuelle SSH-Sitzung erst, wenn du dich in einem neuen, separaten Terminal-Fenster erfolgreich per SSH-Key einloggen konntest. So sperrst du dich nicht versehentlich selbst aus.

Teil 1: Was bedeutet „SSH-Absicherung“ im Detail?

Um einen Server nach aktuellem Sicherheitsstandard abzuriegeln, ändern wir drei wesentliche Einstellungen in der SSH-Konfiguration (/etc/ssh/sshd_config):

  1. PermitRootLogin prohibit-password oder yes: Wir erlauben dem administrativen root-User den Login nur noch mittels eines verifizierten SSH-Schlüssels. Eine Anmeldung mit dem root-Passwort wird blockiert.

  2. PasswordAuthentication no: Das ist das wichtigste Schutzschild. Es schaltet die klassische Passworteingabe für alle Benutzer komplett ab. Wer keinen hinterlegten SSH-Schlüssel besitzt, wird sofort abgewiesen.

  3. PubkeyAuthentication yes: Stellt sicher, dass die Anmeldung mittels kryptografischer Schlüsselpaare aktiv und erlaubt ist.

Teil 2: Das automatisierte Ansible-Playbook

Anstatt dich nun auf jedem deiner Server einzeln einzuloggen und Textdateien zu bearbeiten, lassen wir Ansible diese Arbeit erledigen. Das sorgt dafür, dass alle Server exakt denselben, sicheren Standard erhalten.

Erstelle in deinem Ordner ~/ansible-inframanagement/ eine neue Datei namens secure-ssh.yaml:

nano secure-ssh.yaml

Füge dort das folgende vollständige Playbook ein:

---
- name: SSH-Zugang auf allen Servern härten und absichern
  hosts: docker_hosts, mailserver
  become: true
  gather_facts: false

  handlers:
    - name: SSH-Dienst neu starten
      ansible.builtin.systemd:
        name: ssh
        state: restarted

  tasks:
    - name: 🔑 Sicherstellen, dass Public-Key-Authentifizierung aktiv ist
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^#?PubkeyAuthentication'
        line: 'PubkeyAuthentication yes'
        state: present
      notify: SSH-Dienst neu starten

    - name: 🛡️ Root-Login nur noch mit SSH-Key erlauben (Passwort für Root sperren)
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^#?PermitRootLogin'
        line: 'PermitRootLogin prohibit-password'
        state: present
      notify: SSH-Dienst neu starten

    - name: 🛑 Passwort-Authentifizierung komplett abschalten
      ansible.builtin.lineinfile:
        path: /etc/ssh/sshd_config
        regexp: '^#?PasswordAuthentication'
        line: 'PasswordAuthentication no'
        state: present
      notify: SSH-Dienst neu starten

Wie funktioniert dieses Playbook?

  • ansible.builtin.lineinfile: Dieses Modul durchsucht die Datei /etc/ssh/sshd_config. Mithilfe von regulären Ausdrücken (regexp) findet es die Zeile (egal ob sie auskommentiert ist oder nicht) und ersetzt sie exakt durch den sicheren Wert (line).

  • handlers & notify: Das Ändern der Datei reicht unter Linux nicht aus; der SSH-Dienst muss die Konfiguration neu einlesen. Damit der SSH-Dienst aber nicht nach jedem einzelnen Task neu startet und uns die Verbindung kappt, merkt sich Ansible über notify die Änderung. Erst wenn alle Tasks fehlerfrei durchgelaufen sind, wird der Handler (SSH-Dienst neu starten) exakt einmal am Ende ausgeführt.

Teil 3: Ausführung und Verifizierung

Führe das Playbook von deiner Ansible-Zentrale aus:

ansible-playbook -i hosts secure-ssh.yaml

In der Konsole siehst du nun, wie Ansible deine Server nacheinander absichert:

PLAY RECAP *******************************************************************************************************************************************
192.168.1.100            : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.1.101              : ok=4    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
...

(Das changed=3 zeigt dir, dass alle drei Sicherheitsstufen erfolgreich in die Konfigurationsdatei geschrieben wurden).

Der ultimative Test (Wichtig!):

  1. Lasse dein aktuelles Terminal-Fenster unbedingt offen.

  2. Öffne ein neues, separates Terminal-Fenster auf deinem PC.

  3. Versuche dich ohne Angabe eines Schlüssels oder von einem Gerät, das keinen Key hat, einzuloggen. Der Server muss dich sofort abweisen (Permission denied (publickey)).

  4. Versuche dich von deiner Ansible-Zentrale einzuloggen: ssh root@192.168.1.100. Das muss blitzschnell und ohne Passwortabfrage funktionieren.

Deine Server-Flotte ist nun effektiv gegen automatisierte Brute-Force-Angriffe geschützt!