Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
admin_grundlagen:ssh [2016/08/02 13:33] ingo_wichmann [Client] |
admin_grundlagen:ssh [2025/01/31 09:50] (aktuell) natureshadow2 [Serverseitig Passwortauthentifizierung abschalten] |
||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | **Todo**: anpassen des Unit-Files bei systemd ((als Default werden alle Prozesse einer proc group bei restart oder stop gekillt. Das ist nicht das, was man bei ssh o.ä. will. | + | ====== 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 | ||
- | Unit-File nach /etc/systemd/system kopieren und KillMode=process rein | ||
- | und das Verhalten ist wie früher. | ||
- | Bei vielen Distris ist das Standard-Unit-File mit | ||
- | KillMode=control-group. D.h. man müsste immer und überall bei jeder | ||
- | ssh-Installation diese Änderung machen, wenn man nicht irgendwann ein | ||
- | doofes Problem haben will)) | ||
- | ====== ssh ====== | ||
===== Einsatzzwecke von ssh ===== | ===== Einsatzzwecke von ssh ===== | ||
* Fernadministration | * Fernadministration | ||
* Dateien übers Netz kopieren | * Dateien übers Netz kopieren | ||
* Tunnel bauen | * Tunnel bauen | ||
- | |||
- | ===== Vorteile von ssh ===== | ||
- | * Sicherheit durch Public-Private Key Verschlüsselung | ||
- | * Mehrere Benutzer können einen Account gemeinsam Nutzen | ||
- | * Single Sign On möglich | ||
====== Grundfunktionen ====== | ====== Grundfunktionen ====== | ||
Zeile 32: | Zeile 36: | ||
scp <Datei> <Benutzer>@<Rechner>:/<Verzeichnis> | scp <Datei> <Benutzer>@<Rechner>:/<Verzeichnis> | ||
Dateien auf andere Rechner ohne lange Pfadangaben ins $HOME-Verzeichnis von <Benutzer> kopieren: | Dateien auf andere Rechner ohne lange Pfadangaben ins $HOME-Verzeichnis von <Benutzer> kopieren: | ||
- | scp <Datei> <Benutzer>@<Rechner>:<Verzeichnis> | + | scp <Datei> <Benutzer>@<Rechner>: |
- | Fingerprint Hostkey überprüfen: | + | |
- | ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub | + | |
- | ====== Server Keys neu erzeugen ====== | + | ====== Syntax sshd prüfen ====== |
- | === Debian === | + | 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* | rm /etc/ssh/ssh_host_*key* | ||
+ | === Debian === | ||
dpkg-reconfigure openssh-server | dpkg-reconfigure openssh-server | ||
+ | === SuSE / RedHat === | ||
+ | service sshd restart | ||
====== Public-Private-Key Authentifizierung ====== | ====== Public-Private-Key Authentifizierung ====== | ||
Zeile 49: | Zeile 69: | ||
===== Public-Key auf anderen Rechner übertragen ===== | ===== Public-Key auf anderen Rechner übertragen ===== | ||
- | ssh-copy-id -i .ssh/id_rsa.pub nutzer05@notebook06 | + | ssh-copy-id -i .ssh/id_ed25519.pub nutzer05@notebook06 |
oder von Hand: | oder von Hand: | ||
ssh nutzer05@notebook06 'mkdir -m 700 ~/.ssh' | ssh nutzer05@notebook06 'mkdir -m 700 ~/.ssh' | ||
- | ssh nutzer05@notebook06 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub | + | ssh nutzer05@notebook06 'cat >> .ssh/authorized_keys' < ~/.ssh/id_ed25519.pub |
- | ssh nutzer05@notebook06 'chmod 400 .ssh/authorized_keys' | + | ssh nutzer05@notebook06 'chmod 600 .ssh/authorized_keys' |
===== Serverseitig Passwortauthentifizierung abschalten ===== | ===== Serverseitig Passwortauthentifizierung abschalten ===== | ||
- | ''/etc/ssh/sshd_config'': | + | |
- | <file> | + | <file txt /etc/ssh/sshd_config.d/local.conf> |
UsePAM no | UsePAM no | ||
PasswordAuthentication no | PasswordAuthentication no | ||
Zeile 63: | Zeile 83: | ||
Alternativ (CentOS 7) | Alternativ (CentOS 7) | ||
- | <file> | + | <file txt /etc/ssh/sshd_config> |
UsePAM yes | UsePAM yes | ||
ChallengeResponseAuthentication no | ChallengeResponseAuthentication no | ||
Zeile 69: | Zeile 89: | ||
</file> | </file> | ||
- | ===== Nutzer Zugriff beschränken ===== | + | ==== Syntax prüfen ==== |
- | ==== mit authorized_keys command ==== | + | ssh -t |
- | //Problem: die Datei ''~/.ssh/authorized_keys'' gehört dem Nutzer, den man einschränken möchte. // | + | |
- | <file txt ~/.ssh/authorized_keys> | + | ==== Dienst neu starten ==== |
- | command="/bin/cat /var/log/messages",no-agent-forwanding,no-X11-forwarding,no-port-forwarding ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHBqUtiLsRTLKquoVXKwhrPRD92CzaN9EOkVEfWoHfdC nutzer26@notebook26 | + | systemctl restart ssh.service |
- | </file> | + | |
- | ==== mit Match ==== | + | |
- | <file txt /etc/ssh/sshd_config> | + | |
- | Match User nutzer12 | + | |
- | ForceCommand /usr/local/bin/cat_messages | + | |
- | </file> | + | |
- | <file bash /usr/local/bin/cat_messages> | ||
- | #!/bin/sh | ||
- | /bin/cat /var/log/messages | ||
- | </file> | ||
===== ssh-agent ===== | ===== ssh-agent ===== | ||
Schlüssel dem ''ssh-agent'' hinzufügen: | Schlüssel dem ''ssh-agent'' hinzufügen: | ||
- | ssh-add .ssh/id_dsa | + | ssh-add .ssh/id_rsa |
((Bei openSuSE 11.0 wird der ''ssh-agent'' bei der Anmeldung nur gestartet, wenn das Verzeichnis ''~/.ssh'' existiert: | ((Bei openSuSE 11.0 wird der ''ssh-agent'' bei der Anmeldung nur gestartet, wenn das Verzeichnis ''~/.ssh'' existiert: | ||
mkdir -m 700 ~/.ssh | mkdir -m 700 ~/.ssh | ||
)) | )) | ||
- | ==== Agent-Forwarding nutzen ==== | ||
- | ssh -A nutzer17@notebook17 | ||
- | ssh nutzer07@notebook07 | ||
- | ==== Sicherheitseinschränkung bei Agent-Forwarding ==== | + | Prüfen, welche Schlüssel der agent kennt: |
- | 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 | + | ssh-add -l |
- | * 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)" | + | ===== 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 // | ||
- | (( Weiter sucht er nach dazu passenden Socket-Dateien ( ''/tmp/ssh-*/agent.$pid'' ), und speichert eine ( ''head -n 1'' ) in der Variablen ''SSH_AUTH_SOCK''.)) | + | <file txt ~/.ssh/authorized_keys> |
- | + | restrict,command="/usr/bin/who" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHBqUtiLsRTLKquoVXKwhrPRD92CzaN9EOkVEfWoHfdC nutzer26@notebook26 | |
- | export SSH_AUTH_SOCK=$(for pid in $PIDS; do echo /tmp/ssh-*/agent.$pid; done | head -n 1) | + | </file> |
- | + | ==== mit Match ==== | |
- | ssh nutzer05@notebook07 | + | <file txt /etc/ssh/sshd_config> |
- | + | … | |
- | Auch ein ssh-agent auf dem client-Rechner kann ähnlich mitgenutzt werden: | + | Match User nutzer12 |
- | + | ForceCommand /usr/bin/who | |
- | PIDS="$(lsof -t -w -a -U -c /agent/ -u nutzer05)" | + | </file> |
====== Fehlersuche ====== | ====== Fehlersuche ====== | ||
Zeile 125: | Zeile 128: | ||
+--------+ +------------+ +------------+ | +--------+ +------------+ +------------+ | ||
| ssh | | Hop Server | | server | | | ssh | | Hop Server | | server | | ||
- | | client | | notebook01 | | notebook02 | | + | | client | _ _ _ ssh _ _ _ | notebook01 | | notebook02 | |
| | ================ssh========tunnel============> | | | | | ================ssh========tunnel============> | | | ||
- | +--------+ +------------+ +------------+ | + | +--------+ ̅ ̅ ̅ ̅ ̅ ̅ ̅ ̅ +------------+ +------------+ |
</file> | </file> | ||
===== Client ===== | ===== Client ===== | ||
- | centos 7, debian 8: | + | centos 7.4, debian 9, ubuntu 18.04: (ab OpenSSH-Version 7.3) |
- | ssh -o ProxyCommand="ssh -W %h:%p notebook01.linuxhotel.de" notebook02.linuxhotel.de | ||
- | (( ab OpenSSH-Version 7.3 reduziert sich das zu | ||
ssh -J notebook01.linuxhotel.de notebook02.linuxhotel.de | 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: | mit einer ''~/.ssh/config'' reduziert sich das zu: | ||
Zeile 147: | Zeile 164: | ||
ssh notebook02 | ssh notebook02 | ||
- | Bei älteren SSH-Versionen muss zusätzlich ''netcat'' bzw. ''nc'' auf dem Jumphost installiert sein: | + | Bei noch älteren SSH-Versionen muss zusätzlich ''netcat'' bzw. ''nc'' auf dem Jumphost installiert sein: |
debian 6, centos 6: | debian 6, centos 6: | ||
Zeile 168: | Zeile 185: | ||
ForceCommand ssh %u@%h $SSH_ORIGINAL_COMMAND | ForceCommand ssh %u@%h $SSH_ORIGINAL_COMMAND | ||
</file> | </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 ====== | ====== SSH Tunnel ====== | ||
Zeile 190: | Zeile 247: | ||
help | help | ||
-L <lokaler Port>:<Zielrechner>:<Zielport> | -L <lokaler Port>:<Zielrechner>:<Zielport> | ||
+ | |||
+ | ===== SOCKS Tunnel ===== | ||
+ | z.B. für Firefox: | ||
+ | |||
+ | ssh -D 1080 <Zielrechner> | ||
===== IP Tunnel / VPN ===== | ===== IP Tunnel / VPN ===== |