===== SSH (Secure Shell) =====
SSH ist ein verschlüsseltes Netzwerkprotokoll für die sichere Fernverwaltung von Computern und die sichere Datenübertragung über unsichere Netzwerke. Es wird hauptsächlich für Remote-Login, Dateitransfer und Tunnel verwendet.
==== SSH installieren ====
=== Debian / Ubuntu ===
# SSH-Server installieren
sudo apt update
sudo apt install openssh-server
# SSH-Client installieren (meist bereits installiert)
sudo apt install openssh-client
# Status prüfen
sudo systemctl status ssh
=== RHEL / CentOS / Fedora ===
# SSH-Server installieren
sudo dnf install openssh-server
# SSH-Client installieren
sudo dnf install openssh-clients
# Status prüfen
sudo systemctl status sshd
=== openSUSE ===
# SSH-Server installieren
sudo zypper install openssh
# Status prüfen
sudo systemctl status sshd
=== Arch Linux ===
# SSH-Server installieren
sudo pacman -S openssh
# Status prüfen
sudo systemctl status sshd
=== SSH-Dienst verwalten ===
# SSH-Dienst starten
sudo systemctl start sshd # RHEL/Fedora/openSUSE/Arch
sudo systemctl start ssh # Debian/Ubuntu
# Automatischer Start beim Booten
sudo systemctl enable sshd # RHEL/Fedora/openSUSE/Arch
sudo systemctl enable ssh # Debian/Ubuntu
# SSH-Dienst neu starten (nach Konfigurationsänderungen)
sudo systemctl restart sshd
sudo systemctl restart ssh
# SSH-Dienst stoppen
sudo systemctl stop sshd
sudo systemctl stop ssh
==== SSH-Dateien Server ====
=== Hauptkonfigurationsdatei ===
/etc/ssh/sshd_config # SSH-Server-Hauptkonfiguration
Wichtige Optionen in `/etc/ssh/sshd_config`:
Port 22 # Standard-SSH-Port
ListenAddress 0.0.0.0 # Auf allen Interfaces lauschen
PermitRootLogin no # Root-Login verbieten (empfohlen)
PasswordAuthentication yes # Passwort-Login erlauben
PubkeyAuthentication yes # Public-Key-Authentifizierung erlauben
AuthorizedKeysFile .ssh/authorized_keys # Pfad zu autorisierten Schlüsseln
X11Forwarding yes # X11-Forwarding erlauben
MaxAuthTries 3 # Maximale Anmeldeversuche
ClientAliveInterval 300 # Keep-Alive in Sekunden
AllowUsers user1 user2 # Nur bestimmte Benutzer erlauben
DenyUsers baduser # Bestimmte Benutzer verbieten
=== Host-Schlüssel ===
/etc/ssh/ssh_host_rsa_key # RSA Host-Schlüssel (privat)
/etc/ssh/ssh_host_rsa_key.pub # RSA Host-Schlüssel (öffentlich)
/etc/ssh/ssh_host_ecdsa_key # ECDSA Host-Schlüssel (privat)
/etc/ssh/ssh_host_ecdsa_key.pub # ECDSA Host-Schlüssel (öffentlich)
/etc/ssh/ssh_host_ed25519_key # ED25519 Host-Schlüssel (privat)
/etc/ssh/ssh_host_ed25519_key.pub # ED25519 Host-Schlüssel (öffentlich)
=== Weitere Konfigurationsdateien ===
/etc/ssh/sshd_config # Globale Client-Konfiguration
/etc/ssh/sshd_config.d/ # Zusätzliche Server-Konfigurationen
/etc/ssh/ssh_config # Globale Client-Konfiguration
/etc/ssh/ssh_config.d/ # Zusätzliche Client-Konfigurationen
=== Logs ===
/var/log/auth.log # SSH-Login-Logs (Debian/Ubuntu)
/var/log/secure # SSH-Login-Logs (RHEL/CentOS)
# Logs anzeigen
sudo tail -f /var/log/auth.log
sudo journalctl -u sshd -f
==== SSH-Dateien User ====
=== User-Verzeichnis ===
~/.ssh/ # User-SSH-Verzeichnis
~/.ssh/id_rsa # Privater RSA-Schlüssel
~/.ssh/id_rsa.pub # Öffentlicher RSA-Schlüssel
~/.ssh/id_ed25519 # Privater ED25519-Schlüssel (empfohlen)
~/.ssh/id_ed25519.pub # Öffentlicher ED25519-Schlüssel
~/.ssh/authorized_keys # Autorisierte öffentliche Schlüssel (Server)
~/.ssh/known_hosts # Bekannte Host-Schlüssel
~/.ssh/config # User-SSH-Client-Konfiguration
=== Berechtigungen setzen (wichtig!) ===
# Korrekte Berechtigungen für .ssh-Verzeichnis
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys
chmod 644 ~/.ssh/known_hosts
chmod 600 ~/.ssh/config
=== User-SSH-Config ===
# ~/.ssh/config
Host myserver
HostName 192.168.1.100
User username
Port 22
IdentityFile ~/.ssh/id_ed25519
Host github
HostName github.com
User git
IdentityFile ~/.ssh/id_github
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
==== SSH-Key erstellen ====
=== ED25519-Schlüssel erstellen (empfohlen) ===
# Neuen ED25519-Schlüssel erstellen
ssh-keygen -t ed25519 -C "user@email.com"
# Mit eigenem Dateinamen
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_custom -C "user@email.com"
# Ohne Passphrase (nicht empfohlen für produktive Systeme)
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""
=== RSA-Schlüssel erstellen (4096 Bit) ===
# RSA mit 4096 Bit (sicherer als Standard 2048)
ssh-keygen -t rsa -b 4096 -C "user@email.com"
# Mit eigenem Dateinamen
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_custom -C "user@email.com"
=== ECDSA-Schlüssel erstellen ===
# ECDSA mit 521 Bit
ssh-keygen -t ecdsa -b 521 -C "user@email.com"
=== Interaktiver Prozess ===
# Beim Erstellen werden Sie gefragt:
# 1. Speicherort (Enter für Standard: ~/.ssh/id_ed25519)
# 2. Passphrase (empfohlen für Sicherheit)
# 3. Passphrase wiederholen
# Beispiel-Ausgabe:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:... user@email.com
=== Öffentlichen Schlüssel anzeigen ===
# Öffentlichen Schlüssel anzeigen
cat ~/.ssh/id_ed25519.pub
cat ~/.ssh/id_rsa.pub
# Fingerprint anzeigen
ssh-keygen -lf ~/.ssh/id_ed25519.pub
ssh-keygen -lf ~/.ssh/id_rsa.pub
==== SSH-Key verwalten ====
=== Öffentlichen Schlüssel auf Server kopieren ===
# Automatisch mit ssh-copy-id (empfohlen)
ssh-copy-id user@server
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# Mit spezifischem Port
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 user@server
# Manuell (wenn ssh-copy-id nicht verfügbar)
cat ~/.ssh/id_ed25519.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# Oder mit scp
scp ~/.ssh/id_ed25519.pub user@server:~/.ssh/authorized_keys
# Berechtigungen auf Server prüfen
ssh user@server "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
=== SSH-Agent verwenden ===
# SSH-Agent starten
eval "$(ssh-agent -s)"
# Schlüssel zum Agent hinzufügen
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_rsa
# Schlüssel mit Timeout hinzufügen (1 Stunde)
ssh-add -t 3600 ~/.ssh/id_ed25519
# Geladene Schlüssel anzeigen
ssh-add -l
# Alle Schlüssel aus Agent entfernen
ssh-add -D
# Spezifischen Schlüssel entfernen
ssh-add -d ~/.ssh/id_ed25519
=== Passphrase ändern ===
# Passphrase eines bestehenden Schlüssels ändern
ssh-keygen -p -f ~/.ssh/id_ed25519
# Passphrase entfernen (leer lassen)
ssh-keygen -p -f ~/.ssh/id_ed25519 -N ""
=== Schlüssel konvertieren ===
# Öffentlichen Schlüssel aus privatem generieren
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub
# PEM-Format konvertieren (für ältere Systeme)
ssh-keygen -p -f ~/.ssh/id_rsa -m pem
=== Autorisierte Schlüssel verwalten ===
# authorized_keys auf Server
cat ~/.ssh/authorized_keys # Alle autorisierten Schlüssel anzeigen
# Schlüssel hinzufügen
echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys
# Optionen für Schlüssel
# no-port-forwarding,no-X11-forwarding ssh-ed25519 AAAA...
# from="192.168.1.0/24" ssh-ed25519 AAAA...
# command="/usr/bin/backup.sh" ssh-ed25519 AAAA...
# Duplikate entfernen und sortieren
sort -u ~/.ssh/authorized_keys -o ~/.ssh/authorized_keys
=== Schlüssel testen ===
# Verbindung mit spezifischem Schlüssel testen
ssh -i ~/.ssh/id_ed25519 user@server
# Verbose-Modus für Debugging
ssh -v user@server
ssh -vv user@server # Mehr Details
ssh -vvv user@server # Maximum Details
# Nur Authentifizierung testen (ohne Shell)
ssh -T user@server
=== Bekannte Hosts verwalten ===
# Host aus known_hosts entfernen (bei Hostkey-Änderung)
ssh-keygen -R hostname
ssh-keygen -R 192.168.1.100
# Bekannte Hosts anzeigen
cat ~/.ssh/known_hosts
# Hostkey vorab hinzufügen
ssh-keyscan hostname >> ~/.ssh/known_hosts
ssh-keyscan -H hostname >> ~/.ssh/known_hosts # Mit Hash
=== Mehrere SSH-Keys verwalten ===
# In ~/.ssh/config verschiedene Keys für verschiedene Hosts
Host work
HostName work.example.com
User workuser
IdentityFile ~/.ssh/id_work
Host personal
HostName personal.example.com
User homeuser
IdentityFile ~/.ssh/id_personal
Host github-work
HostName github.com
User git
IdentityFile ~/.ssh/id_github_work
Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_github_personal
==== SSH-Verbindung herstellen ====
=== Grundlegende Verbindung ===
# Standard-Verbindung
ssh user@hostname
ssh user@192.168.1.100
# Mit spezifischem Port
ssh -p 2222 user@hostname
# Mit spezifischem Schlüssel
ssh -i ~/.ssh/id_custom user@hostname
# Befehl auf Remote-System ausführen
ssh user@hostname "ls -la"
ssh user@hostname "sudo systemctl status nginx"
=== Port-Forwarding ===
# Lokalen Port weiterleiten (Local Port Forwarding)
ssh -L 8080:localhost:80 user@server
# Dann http://localhost:8080 im Browser öffnen
# Remote Port Forwarding
ssh -R 8080:localhost:80 user@server
# Dynamic Port Forwarding (SOCKS-Proxy)
ssh -D 1080 user@server
=== X11-Forwarding ===
# X11-Anwendungen remote ausführen
ssh -X user@server
ssh -Y user@server # Trusted X11 Forwarding (weniger sicher)
# Beispiel: Firefox remote starten
ssh -X user@server firefox
=== SSH-Tunneling ===
# SSH-Tunnel im Hintergrund
ssh -fN -L 3306:localhost:3306 user@server
# -f: Im Hintergrund
# -N: Keine Remote-Befehle ausführen
==== SSH absichern ====
=== Server-Konfiguration härten ===
# /etc/ssh/sshd_config bearbeiten
sudo nano /etc/ssh/sshd_config
# Empfohlene Sicherheitseinstellungen:
Port 2222 # Nicht-Standard-Port
PermitRootLogin no # Root-Login verbieten
PasswordAuthentication no # Nur Key-basierte Auth
PubkeyAuthentication yes # Public-Key-Auth aktivieren
PermitEmptyPasswords no # Leere Passwörter verbieten
MaxAuthTries 3 # Max. Anmeldeversuche
LoginGraceTime 30 # Timeout für Login
AllowUsers user1 user2 # Nur bestimmte User erlauben
Protocol 2 # Nur SSH-2-Protokoll
X11Forwarding no # X11 deaktivieren (wenn nicht benötigt)
AllowTcpForwarding no # Port-Forwarding deaktivieren (optional)
# Nach Änderungen neu starten
sudo systemctl restart sshd
=== Fail2Ban einrichten ===
# Fail2Ban installieren (automatische IP-Sperre nach Fehlversuchen)
sudo apt install fail2ban # Debian/Ubuntu
sudo dnf install fail2ban # Fedora/RHEL
sudo zypper install fail2ban # openSUSE
# Konfiguration
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = 22
maxretry = 3
bantime = 3600
findtime = 600
# Fail2Ban starten
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Status prüfen
sudo fail2ban-client status sshd
=== Firewall-Regeln ===
# UFW (Debian/Ubuntu)
sudo ufw allow 22/tcp
sudo ufw allow from 192.168.1.0/24 to any port 22 # Nur aus lokalem Netz
# firewalld (RHEL/Fedora)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
# iptables
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
=== Zwei-Faktor-Authentifizierung (2FA) ===
# Google Authenticator installieren
sudo apt install libpam-google-authenticator
# Als User konfigurieren
google-authenticator
# PAM konfigurieren
sudo nano /etc/pam.d/sshd
# Zeile hinzufügen:
auth required pam_google_authenticator.so
# sshd_config anpassen
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
sudo systemctl restart sshd
==== SSH-Troubleshooting ====
=== Verbindungsprobleme diagnostizieren ===
# Verbose-Modus für detaillierte Ausgabe
ssh -vvv user@server
# SSH-Dienst-Status prüfen
sudo systemctl status sshd
# Port-Verfügbarkeit testen
telnet hostname 22
nc -zv hostname 22
# Firewall prüfen
sudo ufw status
sudo firewall-cmd --list-all
sudo iptables -L
# Logs überprüfen
sudo tail -f /var/log/auth.log # Debian/Ubuntu
sudo tail -f /var/log/secure # RHEL/CentOS
sudo journalctl -u sshd -f
=== Häufige Fehler ===
# "Permission denied (publickey)"
# Lösung: Berechtigungen prüfen
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
chmod 600 ~/.ssh/authorized_keys
# "Host key verification failed"
# Lösung: Host aus known_hosts entfernen
ssh-keygen -R hostname
# "Connection refused"
# Lösung: SSH-Dienst läuft nicht oder Firewall blockiert
sudo systemctl start sshd
sudo ufw allow 22
# "Too many authentication failures"
# Lösung: Weniger Schlüssel im SSH-Agent oder IdentitiesOnly verwenden
ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@server
=== Konfiguration testen ===
# SSH-Config-Syntax testen
sudo sshd -t
# Extended Test mit Konfigurationsausgabe
sudo sshd -T
# SSH-Client-Konfiguration testen
ssh -G hostname
==== Best Practices ====
* **ED25519-Schlüssel verwenden** - Moderner, sicherer und schneller als RSA
* **Passphrase für Schlüssel** - Privaten Schlüssel mit Passphrase schützen
* **SSH-Agent nutzen** - Bequemes Arbeiten mit geschützten Schlüsseln
* **Root-Login deaktivieren** - PermitRootLogin no in sshd_config
* **Key-basierte Authentifizierung** - Passwort-Login deaktivieren
* **Nicht-Standard-Port** - SSH-Port ändern (z.B. 2222)
* **Fail2Ban installieren** - Automatischer Schutz vor Brute-Force
* **Regelmäßige Updates** - OpenSSH aktuell halten
* **Berechtigungen prüfen** - .ssh-Verzeichnis und Dateien korrekt setzen
* **Firewall konfigurieren** - Nur notwendige Zugriffe erlauben
* **Logs überwachen** - Verdächtige Aktivitäten erkennen
* **Backup der Schlüssel** - Private Schlüssel sicher aufbewahren
==== Siehe auch ====
* [[sammlung:scp|SCP - Secure Copy]]
* [[sammlung:sftp|SFTP - SSH File Transfer Protocol]]
* [[sammlung:rsync|Rsync über SSH]]
* [[sammlung:sshd_config|sshd_config]]
* [[sammlung:ssh-keygen|ssh-keygen]]
* [[sammlung:dot_ssh|~/.ssh]]
* [[sammlung:ssh_tunnel|SSH-Tunnel]]
* [[sammlung:systemd|Systemd-Dienste]]
==== Weitere Informationen ====
man ssh
man sshd
man sshd_config
man ssh-keygen
man ssh-copy-id
man ssh-agent
man ssh-add
----
{{tag>cli security remote-access protocol basics advanced}}
----