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
admin_grundlagen:ssh [2012/03/06 23:25]
ingo_wichmann [SSH über mehrere Hops]
admin_grundlagen:ssh [2024/03/01 14:17] (aktuell)
ingo_wichmann [Serverseitig Passwortauthentifizierung abschalten]
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   PasswordAuthentication no
 </​file>​ </​file>​
 +
 +Alternativ (CentOS 7)
 +<file txt /​etc/​ssh/​sshd_config>​
 +  UsePAM yes
 +  ChallengeResponseAuthentication no
 +  PasswordAuthentication no
 +</​file>​
 +
 +==== Syntax prüfen ====
 +  ssh -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+ 
 +===== 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 247:
   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.1331076357.txt.gz · Zuletzt geändert: 2012/03/06 23:25 von ingo_wichmann