Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


admin_grundlagen:ssh

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige ÜberarbeitungVorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
admin_grundlagen:ssh [2011/11/26 15:32] – [TCP Tunnel] ingo_wichmannadmin_grundlagen:ssh [2025/08/14 12:24] (aktuell) – [Syntax prüfen] ingo_wichmann
Zeile 1: Zeile 1:
 ====== ssh ====== ====== 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 ===== ===== 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 ======
-Einloggen auf <Rechner> mit <Benutzer>:+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>   ssh <Benutzer>@<Rechner>
-In dem Zusammenhang ist die Nutzung von [[screen]] sehr hilfreich. 
  
-Dateien auf andere Rechner kopieren:+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>   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 ======
-Als Nutzer Schlüsselpaar erzeugen: +===== Als Nutzer Schlüsselpaar erzeugen ===== 
-  ssh-keygen -d -C "Kommentar" +Einfach: 
-Public-Key auf anderen Rechner übertragen: +  ssh-keygen 
-  ssh-copy-id  -i .ssh/id_dsa.pub nutzer05@notebook05 +oder für Schlüssel mit Kommentar auf Basis von [[wpde>Curve25519]] 
-oder alternativ: +  ssh-keygen -t ed25519 -C "Kommentar" 
-  cat .ssh/id_dsa.pub | ssh nutzer05@notebook05 "cat >> .ssh/authorized_keys" + 
-  ssh nutzer05@notebook05 "chmod 400 .ssh/authorized_keys"+===== 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 ===== ===== Serverseitig Passwortauthentifizierung abschalten =====
-''/etc/ssh/sshd_config'': + 
-<file> +<file txt /etc/ssh/sshd_config.d/keyonly.conf> 
-  UsePAM no+  UsePAM yes 
 +  KbdInteractiveAuthentication no
   PasswordAuthentication no   PasswordAuthentication no
 </file> </file>
 +
 +==== Syntax prüfen ====
 +  sshd -t
 +
 +==== Dienst neu starten ====
 +  systemctl restart ssh.service
  
 ===== ssh-agent ===== ===== ssh-agent =====
 Schlüssel dem ''ssh-agent'' hinzufügen: Schlüssel dem ''ssh-agent'' hinzufügen:
-  ssh-add -i .ssh/id_dsa+  ssh-add .ssh/id_rsa
  
-Bei SuSE 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 ==== +Prüfen, welche Schlüssel der agent kennt: 
-  ssh -A nutzer17@notebook17 +  ssh-add -l
-  ssh -A nutzer07@notebook07+
  
-==== SSH über mehrere Hops ====  +===== Nutzer Zugriff beschränken ===== 
-((ausführlicher beschrieben unter http://sshmenu.sourceforge.net/articles/transparent-mulithop.html))+==== 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 //
  
-''nc'' ( netcat ) muss installiert sein.+<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>
  
-''~/.ssh/config'' :+====== Fehlersuche ====== 
 +  ssh -v nutzer06@notebook06 
 +  ssh -vv nutzer06@notebook06 
 + 
 +====== SSH über mehrere Hops ======
 <file> <file>
-Host notebook01 ++--------+                  +------------+                +------------+ 
-  Hostname notebook01.linuxhotel.de +| ssh    |                  | Hop Server |                | server     | 
-  ForwardAgent yes+| 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 Host notebook02
   Hostname notebook02.linuxhotel.de   Hostname notebook02.linuxhotel.de
-  ProxyCommand ssh -q notebook01 nc -q0 notebook02 22+  ProxyJump notebook01.linuxhotel.de
 </file> </file>
  
   ssh notebook02   ssh notebook02
  
-==== SSH skriptbar über mehrere Hops ==== +Bei älteren SSH-Versionen: 
-Befehl per Skript auf notebook16 ausführen, notebook16 ist nur via notebook15 zu erreichen: + 
-  ssh-agent bash -c "ssh-add .ssh/id_dsa; ssh -A nutzer15@notebook15 ssh nutzer16@notebook16 ls"+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 ==== ==== Sicherheitseinschränkung bei Agent-Forwarding ====
-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  +Sockets zu den ssh-agents anzeigen: 
-  * Prozess-Nummern ( ''-t'' ),   +  ls -ld /tmp/ssh-*/agent* 
-  * die dem verbundenen Benutzer gehören ( ''-u'' ), + 
 +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'' ),   * die eine IP-Verbindung geöffnent haben ( ''-i'' ),
-  * deren Namen mit der Zeichenkette ''sshd'' beginnt ( ''-c'' )+  * 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)"
  
-  PIDS="$(lsof -a -i -c sshd -u nutzer05 -t)"+(( Weiter sucht er nach dazu passenden Socket-Dateien ( ''/tmp/ssh-*/agent.$pid'' ), und speichert eine ( ''head -n 1'' ) in der Variablen ''SSH_AUTH_SOCK''.))
  
-Weiter sucht er nach dazu passenden Socket-Dateien ( ''/tmp/ssh-*/agent.$pid'' ), und speichert die letzte ( ''tail -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)
  
-  export SSH_AUTH_SOCK=$(for pid in $PIDS; do ls /tmp/ssh-*/agent.$pid; done 2>/dev/null | tail -n 1)+  ssh nutzer05@notebook07
  
 Auch ein ssh-agent auf dem client-Rechner kann ähnlich mitgenutzt werden: Auch ein ssh-agent auf dem client-Rechner kann ähnlich mitgenutzt werden:
  
-  export SSH_AGENT_PID=$(pgrep -u nutzer05 -x 'ssh-agent') +  PIDS="$(lsof -t -w -a -U -c /agent/ -u nutzer05)"
-  SSH_AUTH_SOCK=$(lsof -a -U -p $SSH_AGENT_PID -F n | tail -n 1) +
-  export SSH_AUTH_SOCK=${SSH_AUTH_SOCK#n} +
-  ssh nutzer07@notebook07+
  
-====== Fehlersuche ====== +Weitere Diskussion auch: [[https://heipei.github.io/2015/02/26/SSH-Agent-Forwarding-considered-harmful/|diesen Link]]
-  ssh -v nutzer06@notebook06 +
-  ssh -vv nutzer06@notebook06+
  
 ====== SSH Tunnel ====== ====== SSH Tunnel ======
Zeile 122: Zeile 242:
   -L <lokaler Port>:<Zielrechner>:<Zielport>   -L <lokaler Port>:<Zielrechner>:<Zielport>
  
-===== ppp over ssh ===== +===== SOCKS Tunnel ===== 
-Dies ist nur ein Beispiel um zu zeigen das das geht. In der Praxis würde ich immer OpenVPN oder ähnliche Lösungen verwenden.+z.B. für Firefox:
  
-==== Einfache Variante ==== +  ssh -D 1080 <Zielrechner>
-  pppd noauth nodetach pty "ssh root@notebook05 pppd idle 300 nodetach notty noauth" 192.168.2.1:192.168.2.2+
  
-==== Komplexe Variante ==== +===== IP Tunnel / VPN ===== 
-PPP over SSH - Tunnel bauen mit Standartwerkzeugen+//noch nicht getestet//
  
-Die Lösung ist noch nicht ausreichend getestet und wahrscheinlich unvollständig.Hier sind die Bausteine, die ich gerade nutze:+==== 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
  
-  pppd +==== Server ==== 
-  ssh +''/etc/ssh/sshd_config'' :
-  sudo +
- +
-Damit baue ich eine solche Verbindung: +
- +
-Notebook --> PPP-over-SSH --> Router --> Netzwerk ( 172.16.240.0/24 ) +
- +
-==== Zuerst die Einstellungen auf dem Router==== +
-=== SSH Client Konfiguration === +
-''/home/user/.ssh/authorized_keys'':+
 <file> <file>
-command="/usr/bin/sudo /usr/sbin/pppd nodetach notty noauth 10.0.0.1:10.0.0.2" ssh-dss laj4flksa7dflkj ... ( der Schlüssel ) ...+PermitTunnel yes
 </file> </file>
-Dieser Eintrag führt dazu, daß der ''sshd'' für den Benutzer "user" den angegebenen Befehl ausführt, wenn der sich mit dem entsprechenden Schlüssel authentifiziert. +  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
-Mehr Informationen dazu unter ''man sshd'', im Abschnitt "AUTHORIZED_KEYS FILE FORMAT" +
- +
- +
-=== sudo Konfiguration === +
-''/etc/sudoers'', editieren mit dem Befehl ''visudo'': +
-<file>user router=NOPASSWD: /usr/sbin/pppd *</file> +
- +
-oder strenger: +
-<file>user router=NOPASSWD: /usr/sbin/pppd nodetach notty noauth +
-10.0.0.1\:10.0.0.2</file> +
- +
-Dieser Eintrag führt dazu, daß die Benutzer "user" und "andereruser" auf +
-dem Rechner "router" den Befehl /usr/sbin/pppd mit den angegebenen +
-Optionen mit root-Rechten ausführen dürfen. +
- +
- +
-==== Dann die Einstellungen auf dem Notebook ==== +
-=== sudo Konfiguration === +
-''/etc/sudoers'', editieren mit dem Befehl ''visudo'': +
-<file> +
-User_Alias PPP = user, andereruser +
-PPP notebook=NOPASSWD: /usr/sbin/pppd * +
-PPP notebook=NOPASSWD: /sbin/route add -net 172.16.240.0/24 gw 10.0.0.2 +
-</file> +
- +
-oder strenger: +
-<file> +
-User_Alias PPP = user, andereruser +
-PPP notebook=NOPASSWD: /usr/sbin/pppd noauth nodetach persist demand +
-connect /bin/true pty "ssh user@router" +
-PPP notebook=NOPASSWD: /sbin/route add -net 172.16.240.0/24 gw 10.0.0.2 +
-</file> +
- +
-Dieser Eintrag führt dazu, daß die Benutzer "user" und "andereruser" auf +
-dem Rechner "notebook" die Befehle ''/sbin/route'' und ''/usr/sbin/pppd'' mit +
-den angegebenen Optionen mit root-Rechten ausführen dürfen.  +
- +
-====== sshd als ftp-Server Ersatz ====== +
-scponly: http://www.sublimation.org/scponly/+
  
 ====== Links ====== ====== Links ======
admin_grundlagen/ssh.1322321536.txt.gz · Zuletzt geändert: 2011/11/26 15:32 von ingo_wichmann