sammlung:ssh

Dies ist eine alte Version des Dokuments!


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.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

Weitere Informationen

man ssh
man sshd
man sshd_config
man ssh-keygen
man ssh-copy-id
man ssh-agent
man ssh-add


sammlung/ssh.1767701641.txt.gz · Zuletzt geändert: von Branislav Zeljak