Tutorial: Server-Sicherheit erhöhen – SSH-Zugang absichern
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):
-
PermitRootLogin prohibit-passwordoderyes: Wir erlauben dem administrativenroot-User den Login nur noch mittels eines verifizierten SSH-Schlüssels. Eine Anmeldung mit dem root-Passwort wird blockiert. -
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. -
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¬ify: 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 übernotifydie Ä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!):
-
Lasse dein aktuelles Terminal-Fenster unbedingt offen.
-
Öffne ein neues, separates Terminal-Fenster auf deinem PC.
-
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)). -
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!