Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
|
lpi1:ssh [2020/07/27 14:02] |
lpi1:ssh [2025/08/14 12:24] (aktuell) |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== ssh ====== | ||
| + | |||
| + | ===== ssh in firewalld freischalten ===== | ||
| + | |||
| + | **Enable firewall rule for ssh.** | ||
| + | |||
| + | sudo firewall-cmd --permanent --add-service=ssh | ||
| + | success | ||
| + | |||
| + | **Reload firewall rules.** | ||
| + | |||
| + | sudo firewall-cmd --reload | ||
| + | success | ||
| + | |||
| + | oder Firewall abschalten: | ||
| + | |||
| + | systemctl stop firewalld.service | ||
| + | |||
| + | |||
| + | ===== Einsatzzwecke von ssh ===== | ||
| + | * Fernadministration | ||
| + | * Dateien übers Netz kopieren | ||
| + | * Tunnel bauen | ||
| + | |||
| + | ====== Grundfunktionen ====== | ||
| + | Einloggen auf <Rechner> mit <Benutzer>: (( Wenn auf dem entfernten Rechner Befehle ausgeführt werden sollen (z.B. Updates einspielen), die nicht unterbrochen werden sollen (z.B. von einem Netzwerkproblem), dann ist [[screen]] auf dem entfernten Rechner sehr nützlich )) | ||
| + | ssh <Benutzer>@<Rechner> | ||
| + | |||
| + | hängende ssh-Verbindung beenden: | ||
| + | ~. | ||
| + | |||
| + | ssh-Verbindung pausieren: | ||
| + | ~Strg+z | ||
| + | |||
| + | Dateien auf andere Rechner kopieren: (( manchmal ist hier auch [[rsync]] oder [[tar#dateien_kopieren_mit_sudo_tar_und_ssh|tar]] nützlich, besonders wenn sowohl die Quell-Datei als auch das Ziel auf entfernten Rechnern liegen )) | ||
| + | scp <Datei> <Benutzer>@<Rechner>:/<Verzeichnis> | ||
| + | Dateien auf andere Rechner ohne lange Pfadangaben ins $HOME-Verzeichnis von <Benutzer> kopieren: | ||
| + | scp <Datei> <Benutzer>@<Rechner>: | ||
| + | |||
| + | ====== Syntax sshd prüfen ====== | ||
| + | Vor dem Neustart des Dienstes die Konfigurationsdatei auf Syntaxfehler prüfen: | ||
| + | sshd -t | ||
| + | oder ausführlicher: | ||
| + | sshd -dddt | ||
| + | ====== Server Keys ====== | ||
| + | ===== Fingerprint Hostkey überprüfen ===== | ||
| + | ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub | ||
| + | |||
| + | ===== Server Key aus known_hosts entfernen ===== | ||
| + | Name und IP-Adresse aus known_hosts entfernen: | ||
| + | |||
| + | ssh-keygen -R notebook02 | ||
| + | ssh-keygen -R 192.168.1.202 | ||
| + | |||
| + | ===== Server Keys neu erzeugen ===== | ||
| + | löschen: | ||
| + | rm /etc/ssh/ssh_host_*key* | ||
| + | === Debian === | ||
| + | dpkg-reconfigure openssh-server | ||
| + | === SuSE / RedHat === | ||
| + | service sshd restart | ||
| + | |||
| + | ====== Public-Private-Key Authentifizierung ====== | ||
| + | ===== Als Nutzer Schlüsselpaar erzeugen ===== | ||
| + | Einfach: | ||
| + | ssh-keygen | ||
| + | oder für Schlüssel mit Kommentar auf Basis von [[wpde>Curve25519]] | ||
| + | ssh-keygen -t ed25519 -C "Kommentar" | ||
| + | |||
| + | ===== Public-Key auf anderen Rechner übertragen ===== | ||
| + | ssh-copy-id nutzer05@notebook06 | ||
| + | oder von Hand: | ||
| + | ssh nutzer05@notebook06 'mkdir -m 700 ~/.ssh' | ||
| + | ssh nutzer05@notebook06 'cat >> .ssh/authorized_keys' < ~/.ssh/id_ed25519.pub | ||
| + | ssh nutzer05@notebook06 'chmod 600 .ssh/authorized_keys' | ||
| + | |||
| + | ===== Serverseitig Passwortauthentifizierung abschalten ===== | ||
| + | |||
| + | <file txt /etc/ssh/sshd_config.d/keyonly.conf> | ||
| + | UsePAM yes | ||
| + | KbdInteractiveAuthentication no | ||
| + | PasswordAuthentication no | ||
| + | </file> | ||
| + | |||
| + | ==== Syntax prüfen ==== | ||
| + | sshd -t | ||
| + | |||
| + | ==== Dienst neu starten ==== | ||
| + | systemctl restart ssh.service | ||
| + | |||
| + | ===== ssh-agent ===== | ||
| + | Schlüssel dem ''ssh-agent'' hinzufügen: | ||
| + | ssh-add .ssh/id_rsa | ||
| + | |||
| + | ((Bei openSuSE 11.0 wird der ''ssh-agent'' bei der Anmeldung nur gestartet, wenn das Verzeichnis ''~/.ssh'' existiert: | ||
| + | mkdir -m 700 ~/.ssh | ||
| + | )) | ||
| + | |||
| + | Prüfen, welche Schlüssel der agent kennt: | ||
| + | ssh-add -l | ||
| + | |||
| + | ===== Nutzer Zugriff beschränken ===== | ||
| + | ==== mit authorized_keys command ==== | ||
| + | //Problem: die Datei ''~/.ssh/authorized_keys'' gehört dem Nutzer, den man einschränken möchte. Mögliche Lösung: AuthorizedKeysFile, AuthorizedKeysCommand und AuthorizedKeysCommandUser // | ||
| + | |||
| + | <file txt ~/.ssh/authorized_keys> | ||
| + | restrict,command="/usr/bin/who" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHBqUtiLsRTLKquoVXKwhrPRD92CzaN9EOkVEfWoHfdC nutzer26@notebook26 | ||
| + | </file> | ||
| + | ==== mit Match ==== | ||
| + | <file txt /etc/ssh/sshd_config> | ||
| + | … | ||
| + | Match User nutzer12 | ||
| + | ForceCommand /usr/bin/who | ||
| + | </file> | ||
| + | |||
| + | ====== Fehlersuche ====== | ||
| + | ssh -v nutzer06@notebook06 | ||
| + | ssh -vv nutzer06@notebook06 | ||
| + | |||
| + | ====== SSH über mehrere Hops ====== | ||
| + | <file> | ||
| + | +--------+ +------------+ +------------+ | ||
| + | | ssh | | Hop Server | | server | | ||
| + | | client | _ _ _ ssh _ _ _ | notebook01 | | notebook02 | | ||
| + | | | ================ssh========tunnel============> | | | ||
| + | +--------+ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ +------------+ +------------+ | ||
| + | </file> | ||
| + | |||
| + | ===== Client ===== | ||
| + | centos 7.4, debian 9, ubuntu 18.04: (ab OpenSSH-Version 7.3) | ||
| + | |||
| + | ssh -J notebook01.linuxhotel.de notebook02.linuxhotel.de | ||
| + | |||
| + | mit einer ''~/.ssh/config'' reduziert sich das zu: | ||
| + | |||
| + | <file text ~/.ssh/config > | ||
| + | Host notebook02 | ||
| + | Hostname notebook02.linuxhotel.de | ||
| + | ProxyJump notebook01.linuxhotel.de | ||
| + | </file> | ||
| + | |||
| + | ssh notebook02 | ||
| + | |||
| + | Bei älteren SSH-Versionen: | ||
| + | |||
| + | centos 7, debian 8, ubuntu 16.04: | ||
| + | |||
| + | ssh -o ProxyCommand="ssh -W %h:%p notebook01.linuxhotel.de" notebook02.linuxhotel.de | ||
| + | |||
| + | mit einer ''~/.ssh/config'' reduziert sich das zu: | ||
| + | |||
| + | <file text ~/.ssh/config > | ||
| + | Host notebook02 | ||
| + | Hostname notebook02.linuxhotel.de | ||
| + | ProxyCommand ssh -W %h:%p notebook01.linuxhotel.de | ||
| + | </file> | ||
| + | |||
| + | ssh notebook02 | ||
| + | |||
| + | Bei noch älteren SSH-Versionen muss zusätzlich ''netcat'' bzw. ''nc'' auf dem Jumphost installiert sein: | ||
| + | |||
| + | debian 6, centos 6: | ||
| + | <file text ~/.ssh/config > | ||
| + | Host notebook02 | ||
| + | Hostname notebook02.linuxhotel.de | ||
| + | ProxyCommand ssh -q notebook01.linuxhotel.de nc %h %p | ||
| + | </file> | ||
| + | |||
| + | ===== Hop Server ===== | ||
| + | //optionale// Absicherung, damit sich der Benutzer nicht auf dem Hop-Server einloggen kann | ||
| + | |||
| + | <file txt /etc/ssh/sshd_config> | ||
| + | # nutzer02 wird auf notebook02 weitergeleitet: | ||
| + | Match User nutzer02 | ||
| + | ForceCommand ssh nutzer02@notebook02 $SSH_ORIGINAL_COMMAND | ||
| + | |||
| + | # nutzer01 wird auf den mit der Option -W gewählten Server weitergeleitet: | ||
| + | Match User nutzer01 | ||
| + | ForceCommand ssh %u@%h $SSH_ORIGINAL_COMMAND | ||
| + | </file> | ||
| + | |||
| + | <file txt ~/.ssh/authorized_keys> | ||
| + | restrict,port-forwarding ssh-rsa AAAAB3NzaC1yc2EAXXXXXXXXXXXXXXXXXXXXXXXXX | ||
| + | </file> | ||
| + | ===== Agent-Forwarding nutzen ===== | ||
| + | ssh -A notebook17 | ||
| + | ssh notebook07 | ||
| + | |||
| + | besser, mit Konfigdatei: | ||
| + | <file txt ~/.ssh/config> | ||
| + | Host notebook17 | ||
| + | ForwardAgent yes | ||
| + | IdentityFile ~/.ssh/id_rsa | ||
| + | IdentitiesOnly yes | ||
| + | </file> | ||
| + | |||
| + | ==== Sicherheitseinschränkung bei Agent-Forwarding ==== | ||
| + | Sockets zu den ssh-agents anzeigen: | ||
| + | ls -ld /tmp/ssh-*/agent* | ||
| + | |||
| + | root kann den Socket für das Agent-Forwarding mitnutzen: (( Mit eingeschaltetem Agent-Forwarding sollte man nur vertrauenswürdige Server besuchen. root-Benutzer auf dem Server können während die Verbindung besteht den ssh-Agent "mitbenutzen". Dazu sucht root nach | ||
| + | * Prozess-Nummern ( ''-t'' ), | ||
| + | * die eine IP-Verbindung geöffnent haben ( ''-i'' ), | ||
| + | * deren Namen mit der Zeichenkette ''sshd'' beginnt ( ''-c'' ), | ||
| + | * und die dem verbundenen Benutzer gehören ( ''-u'' ) | ||
| + | )) | ||
| + | |||
| + | PIDS="$(lsof -t -a -i -c sshd -u nutzer05)" | ||
| + | |||
| + | (( Weiter sucht er nach dazu passenden Socket-Dateien ( ''/tmp/ssh-*/agent.$pid'' ), und speichert eine ( ''head -n 1'' ) in der Variablen ''SSH_AUTH_SOCK''.)) | ||
| + | |||
| + | export SSH_AUTH_SOCK=$(for pid in $PIDS; do echo /tmp/ssh-*/agent.$pid; done | head -n 1) | ||
| + | |||
| + | ssh nutzer05@notebook07 | ||
| + | |||
| + | Auch ein ssh-agent auf dem client-Rechner kann ähnlich mitgenutzt werden: | ||
| + | |||
| + | PIDS="$(lsof -t -w -a -U -c /agent/ -u nutzer05)" | ||
| + | |||
| + | Weitere Diskussion auch: [[https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/|diesen Link]] | ||
| + | |||
| + | ====== SSH Tunnel ====== | ||
| + | ===== TCP Tunnel ===== | ||
| + | Allgemein: | ||
| + | ssh -L <lokaler Port>:<Zielrechner>:<Zielport> <Benutzer>@<ssh-Server> | ||
| + | |||
| + | Spezialfall X-Weiterleitung: | ||
| + | ssh -X <Benutzer>@<Rechner> | ||
| + | |||
| + | Dazu muß in der Datei ''/etc/ssh/sshd_config'' folgender Eintrag vorhanden sein: | ||
| + | <file>X11Forwarding yes</file> | ||
| + | |||
| + | Tunnel Rückwärts: | ||
| + | ssh -R <Port auf ssh-Server>:<Zielrechner>:<Zielport> <Benutzer>@<ssh-Server> | ||
| + | |||
| + | Dazu muß in der Datei ''/etc/ssh/sshd_config'' folgender Eintrag vorhanden sein: | ||
| + | <file>GatewayPorts yes</file> | ||
| + | |||
| + | Tunnel nachträglich anlegen: | ||
| + | ~C | ||
| + | help | ||
| + | -L <lokaler Port>:<Zielrechner>:<Zielport> | ||
| + | |||
| + | ===== SOCKS Tunnel ===== | ||
| + | z.B. für Firefox: | ||
| + | |||
| + | ssh -D 1080 <Zielrechner> | ||
| + | |||
| + | ===== IP Tunnel / VPN ===== | ||
| + | //noch nicht getestet// | ||
| + | |||
| + | ==== Client ==== | ||
| + | ssh -f -w 0:1 192.168.1.15 true | ||
| + | ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252 | ||
| + | route add 10.0.99.0/24 10.1.1.2 | ||
| + | |||
| + | ==== Server ==== | ||
| + | ''/etc/ssh/sshd_config'' : | ||
| + | <file> | ||
| + | PermitTunnel yes | ||
| + | </file> | ||
| + | ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252 | ||
| + | route add 10.0.50.0/24 10.1.1.1 | ||
| + | |||
| + | ====== Links ====== | ||
| + | * [[ http://www.jfranken.de/homepages/johannes/vortraege/ssh1_inhalt.de.html | SSH Grundlagen von Johannes Franken ]] | ||
| + | * [[ http://www.jfranken.de/homepages/johannes/vortraege/ssh2_inhalt.de.html | SSH Tunnels von Johannes Franken ]] | ||
| + | * [[ http://www.jfranken.de/homepages/johannes/vortraege/ssh3_inhalt.de.html | Firewalls durchbohren von Johannes Franken ]] | ||
| + | * [[ http://www.employees.org/~satch/ssh/faq/ssh-faq.html | SSH FAQ englisch ]] | ||
| + | * [[ http://www.openssh.org/de/index.html | SSH Homepage deutsch ]] | ||