SSH Tipps & Tricks

Axel "XTaran" Beckert

Debian / Hackerfunk / ISG D-PHYS, ETH Zürich

abe@noone.org
http://noone.org/abe/

Einleitung und Ziele

  • Nicht Grundlagen, sondern das Drumherum
  • Möglichkeiten aufzeigen, nicht zuviel Details
  • Kompatibilität:
    • Sollte alles gehen mit OpenSSH 4.3 (wo nicht anders erwähnt, getestet mit 5.1)
    • Das meiste geht auch mit älteren OpenSSH-Versionen
    • Vieles geht auch mit anderen Implementationen

Übersicht

  • Das Leben mit Bordmitteln leichter machen
  • Tunneln ist nicht böse, sondern wichtig
  • Ich bin drin! Und jetzt?
  • Neues in OpenSSH 6.5 (aktuell ist 6.6)
  • Nette Tools drumherum
  • SSH ist nicht nur Unix-Sache
  • Verbindungen im Vornhinein kastrieren
  • Links und Abschluß

Bordmittel (1/9): SSH-Host-Schlüssel (1/2)

SSH-Host-Keys verifizieren

  • Public-Key-Kryptographie
  • RFC 4255 (2006, Draft von 2003)
  • ssh-keygen -l -f /etc/ssh/ssh_host_<algorithmus> (oder .pub):
    $ ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key
    256 fd:89:37:8e:f0:76:f0:c9:47:ee:73:31:0f:48:fe:20  root@c-cactus (ECDSA)
  • GET https://db.debian.org/debian_known_hosts > ~/.ssh/known_hosts2 (Neben ~/.ssh/known_hosts wird per Default auch in ~/.ssh/known_hosts2) geschaut. Wie praktisch! ;-)
;

Bordmittel (2/9): SSH-Host-Schlüssel (2/2)

SSH-Host-Keys per DNS verifizieren — DNSSEC empfohlen

  • ssh-keygen -r <hostname>:
    $ ssh-keygen -r c-cactus.deuxchevaux.org
    c-cactus.deuxchevaux.org IN SSHFP 1 1 8270d67451d29af5b2cc3d0a00c2df20060746fa
    c-cactus.deuxchevaux.org IN SSHFP 1 2 7683a04bbd2dbbae9c6d487493c251de69100287e09fa6c72d7d74555c8a4912
    c-cactus.deuxchevaux.org IN SSHFP 2 1 f43b0e9d2367bf6cd47fb405288d7304a10a41d9
    c-cactus.deuxchevaux.org IN SSHFP 2 2 0e6b6d17e1565ec05d9c400abda79eae935e44b6a1faa22d20083d38c517f7b9
    c-cactus.deuxchevaux.org IN SSHFP 3 1 2de9449a6917145f0839a5b6d41c30cb2685bb1d
    c-cactus.deuxchevaux.org IN SSHFP 3 2 8a459888de5d7ed2c6d88be79282038fe2cde417e34fc9655fdb4fc91a249b46
  • host -t SSHFP <hostname>:
    $ host -t SSHFP www.ccczh.ch
    www.ccczh.ch is an alias for proxy.ccczh.ch.
    proxy.ccczh.ch has SSHFP record 3 1 CC60D7A88E96BDAD570EAA39CDC86FED
    proxy.ccczh.ch has SSHFP record 1 1 9BA56C02A0A82E2BED5D946413E6A62B
    proxy.ccczh.ch has SSHFP record 2 1 99C0844B0A0692EEC6601B5ACBDC81D5
  • ssh -o "VerifyHostKeyDNS ask" <hostname>:
    $ ssh -o "VerifyHostKeyDNS ask" host.example.com
    […]
    Matching host key fingerprint found in DNS.
    Are you sure you want to continue connecting (yes/no)?

Bordmittel (3/9): SSH-Schlüssel und SSH-Agent

Mit SSH-Schlüsseln arbeiten

  • Public-Key-Kryptographie
  • ssh-keygen (Nur in Ausnahmen ohne Passphrase!)
  • ssh-copy-id (schreibt Key(s) in ~/.ssh/authorized_keys remote)
  • eval `ssh-agent` (Kann auch durch Xsession gestartet worden sein.)
  • ssh-add
  • ssh-add -l (List fingerprints) / ssh-add -L (List public key parameters)
  • ssh anderer.rechner -t -A ssh-add (Schlüssel von anderem Rechner in den Key-Agent laden.

Beinahe Bordmittel (4/9): Alternative SSH-Agents

  • GnuPG Agent (gpg-agent)
  • GNOME Keyring
  • KWallet via kwalletcli, kwalletaskpass und gpg-agent

Bordmittel (5/9): Mit dem SSH-Agent arbeiten

  • ssh-add -x (Lock)
  • ssh-add -X (Unlock)
  • ssh -A (Forward Agent)
  • ssh -a (Don't forward Agent)
  • Host *.deuxchevaux.org *.noone.org
      ForwardAgent yes

Bordmittel (6/9): SFTP, SCP

Dateien mit SSH übertragen

  • $ scp datei meinkonto@rechner:verzeichnis/
    datei                            100%  337     0.3KB/s    00:00

    (Zielpfad auf Remote-Rechner relativ zu $HOME oder Chroot)
  • $ sftp meinkonto@rechner
    Connecting to rechner...
    sftp> ls
    datei1 datei2
    sftp> get datei1
    Fetching /home/meinkonto/datei1 to datei1
    /home/abe/datei1                      100%  337     0.3KB/s   00:00
    sftp> lls
    datei1 datei3
    sftp> put datei3
    Uploading datei3 to /home/meinkonto/datei3
    datei3                                100%   65     0.1KB/s   00:00
    sftp> quit

Bordmittel (7/9): SSH-Konfigurationsdatei

$EDITOR ~/.ssh/config

Host *
        HashKnownHosts no
        NoHostAuthenticationForLocalhost yes

Host sym
        HostName symlink.to.noone.org
        ForwardAgent yes
        ForwardX11Trusted yes

Host sf
        Hostname shell.sourceforge.net
        User xtaran

Host avaya
        StrictHostKeyChecking no
        UserKnownHostsFile /dev/null

Bordmittel (8/9): ProxyCommand

$EDITOR ~/.ssh/config

# OpenSSH < 5.4
Host myhomeserver
        ProxyCommand ssh myhomegateway nc myhomeserver 22

# OpenSSH >= 5.4
Host myhomeserver
        ProxyCommand ssh myhomegateway -W myhomeserver:22

Bordmittel (9/9): ControlMaster

$EDITOR ~/.ssh/config

Host host-with-picky-firewall
        ControlMaster autoask
        ControlPath ~/.ssh-master-%l-%h-%p-%r

Tunneln (1/6): Übersicht

  • Tunneln ist nicht böse sondern dient der eigenen Sicherheit und Privatsphäre (Hallo liebe NSA! *blblblbl* :-P)
  • Anwendungen, die ssh selbst aufrufen
  • X-Anwendungen tunneln ("DISPLAY Forward")
  • Einzelne Verbindungen tunneln
  • ssh als SOCKS-Proxy
  • ssh als "VPN für Arme"

Tunneln (2/6): Anwendungen, die ssh nutzen

  • Rufen original meist die unverschlüsselte rsh auf.
  • rsh oft symbolischer Link auf ssh falls rsh nicht installiert
  • rsync -e ssh
  • "Pre-Authenticated IMAP" (braucht SSH-Keys)
    • mutt (.muttrc: set tunnel="ssh -q imap.example.org /etc/rimapd")
    • pine (.pinerc)
      inbox-path={imap.example.org/user=meinkonto/secure}INBOX
      folder-collections=Mail {imap.example.org/user=meinkonto/secure}[]
      rsh-open-timeout=0
      ssh-path=/usr/bin/ssh
  • Viele Versionskontrollsysteme unterstützen ssh "out of the box": cvs (CVS_RSH=ssh), svn (svn+ssh://…), git, hg, etc.

Tunneln (3/6): X-Anwendungen tunneln

  • "Weiterleitung" von X-Anwendungen normal unverschlüsselt
  • ssh kann automatisch den passenden Tunnel einrichten und $DISPLAY passend setzen. Braucht xauth remote im Suchpfad.
  • -X oder ForwardX11 yes
  • -Y oder ForwardX11Trusted yes (Details in ssh_config(5))
  • -x oder ForwardX11 no

Tunneln (4/6): Einzelne Ports tunneln

  • Ein Zugriff auf einen lokalen "Port" wird auf einen anderen Port hinter dem Remote-Rechner weitergeleitet (oder umgekehrt)
  • Weitergeleitete Ports per Default nur von "localhost" erreichbar. -g zu freischalten des Zugriffs von überall.
  • ssh -L 8080:proxy:8080 heimrouter (Proxy zuhause von außen nutzen)
  • ssh -R 8000:localhost:8001 firmenrechner (Firmenrechner Zugriff auf lokalen Webserver geben)
  • ssh -R 8000:localhost:8001 -g firmenrechner (Allen Firmenrechnern Zugriff auf lokalen Webserver geben)

Tunneln (5/6): SOCKS-Proxy

ssh als SOCKS-Proxy nutzen

  • ssh -D 1080 rechner und localhost:1080 als SOCKS-Proxy in Browser, E-Mail-Programm, sonstigem Programm oder mit tsocks angeben
  • Alle TCP-Verbindungen des Programms scheinen dann von "rechner" aus zu kommen.
  • Achtung: DNS-Anfragen (normalerweise UDP) werden per Default nicht getunnelt, ab Protokoll SOCKS4a möglich.

Tunneln (6/6): VPN für Arme

  • OpenSSH ab Version 4.3 kann auch sog. "tun/tap Devices" für das Tunneln kompletter Netzwerkverbindungen anlegen.
  • Tunnelt auch UDP und damit DNS.
  • Ist langsam, weil "IP over TCP"
  • Braucht root-Rechte auf beiden Seiten.
  • Routing-Tabellen müssen manuell oder mit Skripten angepaßt werden.

Ich bin drin! Und jetzt?

  • Nach <Enter>~ passiert nix?
  • Eine Tilde nach einem Enter ist die Escape-Zeichenkombination der SSH
  • ~~ ergibt eine Tilde
  • ~. beendet die Verbindung sofort
  • ~<Ctrl-Z> stoppt die SSH (Wieder weiterlaufen lassen: fg)
  • ~& schiebt die SSH in den Hintergrund nach Ausloggen falls noch Tunnel genutzt werden.
  • ~? zeigt die Hilfe

Neues in OpenSSH 6.5

  • Daniel J. Bernsteins Elliptic Curve "Curve25119" und Elliptic Curve Diffie-Hellman "Ed25119"
  • RSA+MD5 und schwache Hashalgorithmen bei Key-Austausch werden nicht mehr akzeptiert.
  • Match Schlüsselwort als Alternative zu Host
  • Hostnames werden zweimal gematcht in ~/.ssh/config, einmal nach Kommandozeile und einmal nach Hostname-Setting und FQDN-Auflösung
  • http://www.openssh.com/txt/release-6.5

Nette Tools drumherum (1/5): screen

GNU Screen erlaubt u.a. Shells und andere Text-Mode-Programme (z.B. mutt, irssi, centericq, mcabber) auf anderen Rechnern weiterlaufen zu lassen ohne die ssh-Verbindung dorthin permanent offen zu halten.

  • Starten: screen
  • Programm im Screen starten: screen irssi
  • Abhängen (Detach): <Ctrl-A><Ctrl-D>
  • Wieder zu Session verbinden: screen -r
  • Verbinden, andere Verbindung abbrechen: screen -r -d
  • Verbinden ohne andere Verbindung abzubrechen: screen -x

Nette Tools drumherum (2/5): autossh

  • Testet über SSH-Tunnel die Verfügbarkeit der Verbindung und startet die SSH-Verbindung bei Bedarf neu.
  • Ideal zusammen mit Screen
  • autossh -t rechner 'screen -RD' und man hat sofort wieder seine Shell, sobald die Verbindung wieder steht.

Nette Tools drumherum (3/5): mosh

  • SSH-Alternative bei hoher Latenz oder viel Paketverlust.
  • mosh-server muss auf Server-Seite installiert sein.
  • Kein offener Port wenn ungenutzt
  • Nutzt ssh zur Authentifizierung, Autorisierung und zum Starten des Servers.
  • Nutzt per Default UDP Ports 60000 bis 61000.
  • Braucht kein "Detach" — Server wartet einfach, bis Verbindung wieder da ist.
  • Unterstützt ausschliesslich UTF-8.

Nette Tools drumherum (4/5): sshfs

  • Mountet Verzeichnisse von per SSH erreichbaren Rechnern mittels FUSE.
  • Nutzt das SFTP-Subsystem auf dem Remote-Rechner. → Geht nicht mit dropbear — solange nicht OpenSSHs sftp-server installiert ist.
  • sshfs rechner:/home/meinkonto home-auf-rechner
  • cd home-auf-rechner

Nette Tools drumherum (5/5): sslh

  • Erlaubt, auf Port 443 (HTTPS) sowohl HTTPS als auch SSH zu nutzen.
  • Erkennt das Protokoll und leitet die Verbindung an den richtigen Dienst (HTTPS dann meist auf Port 442) weiter.
  • Hilft gegen Firewalls, die SSH verbieten, aber HTTPS erlauben.

SSH ist nicht nur Unix-Sache

  • Cygwin: POSIX-Umgebung für Windows inkl. OpenSSH (Client+Server)
  • Putty: Freier SSH-Client für u.a. Windows
  • WinSCP: Drag & Drop SCP für Windows, baut auf Putty auf.
  • dropbear: Freie SSH-Implementation (Client+Server) für Embeddedsysteme (inkl. iPhone, AppleTV, Dreambox, viele NAS und Router)
  • PSPSSH: Freier SSH-Client für die Sony PSP, baut auf dropbear auf
  • MidpSSH: Freier SSH-Client für MIDP/J2ME-fähige Mobiltelefone
  • S2Putty: Freier SSH-Client für Symbian S60 Mobiltelefone

Verbindungen kastrieren

  • Oft will man nur Zugang zu einem Programm geben.
  • Per Web ist aufwendig, kompliziert und fehleranfällig.
  • command="blafasel" ssh-rsa AAAAB3Nza… führt bei jedem Login mit diesem Schlüssel "blafasel" aus
  • from="rechner" ssh-rsa AAAAB3Nza… erlaubt Zugriff mit diesem Schlüssel nur von "rechner" aus.
  • no-{agent,port,X11}-forwarding ssh-rsa AAAAB3Nza… verbietet diverses Weiterleiten.
  • no-pty ssh-rsa AAAAB3Nza… verbietet Pseudo-Terminals.

Mirror-Sync per SSH anstoßen

  • Beispiel einer maximal beschränkten SSH-Verbindung zum Anstoßen des Mirror-Syncs auf ftp.ch.debian.org
  • Alte Variante, ein Ping ohne Feedback: no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="~/sync </dev/null >/dev/null 2>&1 &" ssh-rsa AAAAB3Nza…
  • Neue Variante, Parameterweitergabe via $SSH_ORIGINAL_COMMAND, Feedback via STDIN/STDOUT: no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="~/ftpsync" ssh-rsa AAAAB3Nza…

Zusammenfassung

  • SSH ist viel mehr als nur per Kommandozeile woanders einloggen.
  • Tunnel sind nicht böse, sondern wichtig.
  • SSH gibt's nicht nur auf und zu Linux-Rechnern.

Links (1/2)

Links (2/2)

Danke + Feedback

Danke an

  • Fabian Wenk für den Hinweis auf -D und damit der Idee zum Vortrag
  • Aaron Toponce, Michael Pobega, Michael Prokop, Sven Guckes, Jörg Jaspert, Alexander Wirt, Raoul vom CCC ZH und Venty für Tipps und Ideen zum Vortrag
  • Eric S. Meyer für S5

Feedback an

  • Axel Beckert
  • E-Mail, Jabber: abe@noone.org