Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


admin_grundlagen:ssh

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
Letzte Überarbeitung Beide Seiten, nächste Überarbeitung
admin_grundlagen:ssh [2012/03/06 23:25]
ingo_wichmann [SSH über mehrere Hops]
admin_grundlagen:ssh [2023/12/27 10:47]
ingo_wichmann [mit authorized_keys command]
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 ======
Zeile 20: Zeile 33:
   ~Strg+z   ~Strg+z
  
-Dateien auf andere Rechner kopieren: (( manchmal ist hier auch [[tar#​dateien_kopieren_mit_sudo_tar_und_ssh]] nützlich, besonders wenn sowohl die Quell-Datei als auch das Ziel auf entfernten Rechnern liegen ))+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 ​-t dsa -C "Kommentar+Einfach
-Public-Key ​auf anderen Rechner übertragen:​ +  ssh-keygen 
-  ssh-copy-id  ​-i .ssh/​id_dsa.pub nutzer05@notebook06 +oder für Schlüssel mit Kommentar auf Basis von [[wpde>​Curve25519]] 
-oder alternativ:​ +  ssh-keygen ​-t ed25519 ​-"Kommentar"
-  cat .ssh/​id_dsa.pub | ssh nutzer05@notebook06 ​"cat >> .ssh/​authorized_keys"​ +
-  ssh nutzer05@notebook06 "chmod 400 .ssh/​authorized_keys"+
  
 +===== Public-Key auf anderen Rechner übertragen =====
 +  ssh-copy-id -i .ssh/​id_ed25519.pub 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>​
   UsePAM no   UsePAM no
 +  PasswordAuthentication no
 +</​file>​
 +
 +Alternativ (CentOS 7)
 +<file txt /​etc/​ssh/​sshd_config>​
 +  UsePAM yes
 +  ChallengeResponseAuthentication no
   PasswordAuthentication no   PasswordAuthentication no
 </​file>​ </​file>​
Zeile 51: Zeile 91:
 ===== 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+ 
 +===== 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 ====+====== SSH über mehrere Hops ======
 <​file>​ <​file>​
-+--------+ ​                 +------------+ ​               +--------+ ++--------+ ​                 +------------+ ​               +------------+ 
-| ssh    |                  | Hop Server |                | server | +| ssh    |                  | Hop Server |                | server ​    ​
-| client | ===ssh=over=netcat=tunnel====================>​ |        +| client ​|  _ _ _ ssh _ _ _ | notebook01 |                | notebook02 | 
-+--------+ ​                 +------------+ ​               +--------++|        ​| ================ssh========tunnel============>​ |            
 ++--------+ ​ ​̅ ​ ̅  ̅  ̅  ̅  ̅  ̅  ̅  ​+------------+ ​               +------------+
 </​file>​ </​file>​
-((ausführlicher beschrieben unter http://​sshmenu.sourceforge.net/​articles/​transparent-mulithop.html)) 
  
-''​nc''​ ( netcat ) muss installiert sein. (( laut http://​www.rschulz.eu/​2008/​09/​ssh-proxycommand-without-netcat.html geht das auch ohne netcat: +===== Client ===== 
-  ProxyCommand ssh {gw} '​exec ​3<>/​dev/​tcp/​{host}/​22;​ cat <&3 & cat >&​3;​kill $!' +centos 7.4, debian 9, ubuntu 18.04: ​(ab OpenSSH-Version 7.3)
-habe ich aber noch nicht gestestet ))+
  
-''​~/​.ssh/​config''​ : ( debian 6.0, centos 6 )+  ​ssh -J notebook01.linuxhotel.de notebook02.linuxhotel.de
  
-<​file>​ +mit einer ''​~/​.ssh/​config''​ reduziert sich das zu:
-Host notebook01 +
-  Hostname notebook01.linuxhotel.de +
-  ForwardAgent yes+
  
 +<file text ~/​.ssh/​config >
 Host notebook02 Host notebook02
   Hostname notebook02.linuxhotel.de   Hostname notebook02.linuxhotel.de
-  ​ProxyCommand ssh -q notebook01 ​nc %h %p+  ​ProxyJump ​notebook01.linuxhotel.de
 </​file>​ </​file>​
  
-=== testen === 
   ssh notebook02   ssh notebook02
  
-==== SSH skriptbar über mehrere Hops ==== +Bei älteren SSH-Versionen:​ 
-Befehl per Skript auf notebook16 ausführennotebook16 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//​ Absicherungdamit 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 -a -i -c sshd -u nutzer05 ​-t)"+  PIDS="​$(lsof ​-t -a -i -c sshd -u nutzer05)"​
  
-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''​+(( 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 ls /​tmp/​ssh-*/​agent.$pid;​ done 2>/​dev/​null ​tail -n 1)+  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: Auch ein ssh-agent auf dem client-Rechner kann ähnlich mitgenutzt werden:
  
-  ​export SSH_AGENT_PID=$(pgrep -u nutzer05 ​-x '​ssh-agent'​) +  ​PIDS="$(lsof ---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 137: Zeile 241:
   help   help
   -L <lokaler Port>:<​Zielrechner>:<​Zielport>​   -L <lokaler Port>:<​Zielrechner>:<​Zielport>​
-===== ppp over ssh ===== 
-Dies ist nur ein Beispiel um zu zeigen das das geht. In der Praxis würde ich immer OpenVPN oder ähnliche Lösungen verwenden. 
  
-==== Einfache Variante ​==== +===== SOCKS Tunnel ===== 
-  pppd noauth nodetach pty "ssh root@notebook05 pppd idle 300 nodetach notty noauth"​ 192.168.2.1:192.168.2.2+z.Bfür Firefox:
  
-==== Komplexe Variante ==== +  ssh -D 1080 <​Zielrechner>​
-PPP over SSH Tunnel bauen mit Standartwerkzeugen+
  
-Die Lösung ist noch nicht ausreichend ​getestet ​und wahrscheinlich unvollständig.Hier sind die Bausteine, die ich gerade nutze:+===== IP Tunnel / VPN ===== 
 +//noch nicht getestet//
  
-  pppd +==== Client ==== 
-  ssh +  ssh -f -w 0:1 192.168.1.15 true 
-  ​sudo+  ​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
  
-Damit baue ich eine solche Verbindung:​ +==== Server ​==== 
- +''/​etc/ssh/sshd_config''​ :
-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.+
-</​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.txt · Zuletzt geändert: 2024/03/01 14:17 von ingo_wichmann