Linuxhotel Wiki

Wie ging das nochmal?

Benutzer-Werkzeuge

Webseiten-Werkzeuge


admin_grundlagen:ssh

Dies ist eine alte Version des Dokuments!


ssh

Einsatzzwecke von ssh

  • Fernadministration
  • Dateien übers Netz kopieren
  • 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

Einloggen auf <Rechner> mit <Benutzer>: 1)

ssh <Benutzer>@<Rechner>

hängende ssh-Verbindung beenden:

~.

ssh-Verbindung pausieren:

~Strg+z

Dateien auf andere Rechner kopieren: 2)

scp <Datei> <Benutzer>@<Rechner>:/<Verzeichnis>

Dateien auf andere Rechner ohne lange Pfadangaben ins $HOME-Verzeichnis von <Benutzer> kopieren:

scp <Datei> <Benutzer>@<Rechner>:<Verzeichnis>

Fingerprint Hostkey überprüfen:

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key.pub

Server Keys neu erzeugen

Debian

rm /etc/ssh/ssh_host_*key*
dpkg-reconfigure openssh-server

Public-Private-Key Authentifizierung

Als Nutzer Schlüsselpaar erzeugen:

ssh-keygen -t dsa -C "Kommentar"

Public-Key auf anderen Rechner übertragen:

ssh-copy-id  -i .ssh/id_dsa.pub nutzer05@notebook06

oder alternativ:

cat .ssh/id_dsa.pub | ssh nutzer05@notebook06 "cat >> .ssh/authorized_keys"
ssh nutzer05@notebook06 "chmod 400 .ssh/authorized_keys"

Serverseitig Passwortauthentifizierung abschalten

/etc/ssh/sshd_config:

  UsePAM no
  PasswordAuthentication no

ssh-agent

Schlüssel dem ssh-agent hinzufügen:

ssh-add -i .ssh/id_dsa

Bei SuSE 11.0 wird der ssh-agent bei der Anmeldung nur gestartet, wenn das Verzeichnis ~/.ssh existiert:

mkdir -m 700 ~/.ssh

Agent-Forwarding nutzen

ssh -A nutzer17@notebook17
ssh -A nutzer07@notebook07

SSH über mehrere Hops

+--------+                  +------------+                +--------+
| ssh    |                  | Hop Server |                | server |
| client | ===ssh=over=netcat=tunnel====================> |        |
+--------+                  +------------+                +--------+

3)

nc ( netcat ) muss installiert sein. 4)

~/.ssh/config : ( debian 6.0 )

Host notebook01
  Hostname notebook01.linuxhotel.de
  ForwardAgent yes

Host notebook02
  Hostname notebook02.linuxhotel.de
  ProxyCommand ssh -q notebook01 nc -q0 notebook02 22

~/.ssh/config : ( centos 6 )

Host notebook01
  Hostname notebook01.linuxhotel.de
  ForwardAgent yes

Host notebook02
  Hostname notebook02.linuxhotel.de
  ProxyCommand ssh -q notebook01 nc notebook02 22

5)

ssh notebook02

SSH skriptbar über mehrere Hops

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"

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

  • Prozess-Nummern ( -t ),
  • die dem verbundenen Benutzer gehören ( -u ),
  • die eine IP-Verbindung geöffnent haben ( -i ),
  • deren Namen mit der Zeichenkette sshd beginnt ( -c )
PIDS="$(lsof -a -i -c sshd -u nutzer05 -t)"

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 ls /tmp/ssh-*/agent.$pid; done 2>/dev/null | tail -n 1)

Auch ein ssh-agent auf dem client-Rechner kann ähnlich mitgenutzt werden:

export SSH_AGENT_PID=$(pgrep -u nutzer05 -x 'ssh-agent')
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

ssh -v nutzer06@notebook06
ssh -vv nutzer06@notebook06

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:

X11Forwarding yes

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:

GatewayPorts yes

Tunnel nachträglich anlegen:

~C
help
-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

pppd noauth nodetach pty "ssh root@notebook05 pppd idle 300 nodetach notty noauth" 192.168.2.1:192.168.2.2

Komplexe Variante

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:

pppd
ssh
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:

command="/usr/bin/sudo /usr/sbin/pppd nodetach notty noauth 10.0.0.1:10.0.0.2" ssh-dss laj4flksa7dflkj ... ( der Schlüssel ) ...

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.

Mehr Informationen dazu unter man sshd, im Abschnitt „AUTHORIZED_KEYS FILE FORMAT“

sudo Konfiguration

/etc/sudoers, editieren mit dem Befehl visudo:

user router=NOPASSWD: /usr/sbin/pppd *

oder strenger:

user router=NOPASSWD: /usr/sbin/pppd nodetach notty noauth
10.0.0.1\:10.0.0.2

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:

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

oder strenger:

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

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

Links

1)
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
2)
manchmal ist hier auch dateien_kopieren_mit_sudo_tar_und_ssh nützlich, besonders wenn sowohl die Quell-Datei als auch das Ziel auf entfernten Rechnern liegen
4)
laut http://www.rschulz.eu/2008/09/ssh-proxycommand-without-netcat.html geht das auch ohne netcat:
ProxyCommand ssh {gw} 'exec 3<>/dev/tcp/{host}/22; cat <&3 & cat >&3;kill $!'
habe ich aber noch nicht gestestet
5)
Der Unterschied zwischen Debian und Centos ist hier, dass die Centos-Variante von nc den Schalter -q 0 nicht kennt. Scheint bei Centos aber auch ohne zu gehen.
admin_grundlagen/ssh.1331075988.txt.gz · Zuletzt geändert: 2012/03/06 23:19 von ingo_wichmann