SSH onder Windows

Wat is SSH?

SSH staat voor Secure SHell. Maar wat is het eigenlijk? SSH is een communicatie-standaard (protocol) dat zorgt voor een beveiligde verbinding tussen twee computers, waarbij je vanaf de ene computer veilig op de andere in kunt loggen. Beveiligd betekent hier dat alle communicatie versleuteld (encrypted) is; zelfs het inlogproces. Dit is anders dan bij bijvoorbeeld het inloggen op je email-account: hier gaat je wachtwoord onversleuteld over het internet. Ook bied SSH heen en weer garanties dat jij (en de andere kant) ook bent wie je zegt dat je bent (authenticatie).

Let op! SSH is zeer veilig als het goed is opgezet, maar als de zaak slecht is geconfigureerd of als je zwakke wachtwoorden gebruik biedt het iemand die binnen weet te komen veel mogelijkheden!

SSH biedt een aantal mogelijkheden:

  • Het op een beveiligde manier een command-prompt op een remote computer openen (en ook zelfs grafische programma's kunnen draaien, mits je een X-server hebt wat onder Windows niet standaard het geval is).
  • Het op zetten van een beveiligde tunnel tussen programma's op verschillende computers (bijvoorbeeld tussen je email-programma en de email-server van je provider, als die SSH support; of naar je samba file server)
  • SFTP, Secure FTP; een vervanging voor FTP waarbij alle gegevens versleutelt over het internet gaan, inclusief je inloggegevens en SCP, Secure copy; een veilige variant van het Linux CP (copy).

Client en server

Hiertoe moet op beide computers een programma draaien, op de een de server en op de ander de cliënt:

Meer (Engelstalige) info over SSH is te vinden op de SSH manual pages. Een uitgebreid boek er over: SSH, The secure Shell (the definitive guide) van O'Reilly.

  • De SSH-cliënt (aan de gebruikerskant, dus de computer waar je zelf achter zit).
    Voor Windows is dit bijvoorbeeld PuTTY (wat een command window a la DOS box opent op de remote computer), een X server (voor grafische programma's) of een SSH-ready file transfer programma, bijvoorbeeld het FileZilla FTP programma. FileZilla kan ook SFTP (secure FTP) aan, ook met public/private key identificatie (al is dat niet direct zichtbaar: gebruik van te voren het PUTTY pageant programma om de key te laden, en geef in FileZilla een leeg wachtwoord op). Een alternatief voor FileZilla is WinSCP.
    Linux/Ubuntu: hier zit ssh en scp doorgaans standaard bij (al is PuTTY ook beschikbaar in Linux/Ubuntu, handig als je er aan gewent bent). Equivalent van pageant is hier de ssh-agent; met het commando ssh-add om sleutels aan de (vermoedelijk al standaard draaiende) agent door te geven.
    Android phones: ConnectBot
  • Aan de te contacteren kant een SSH-server (typisch de SSH deamon, sshd, genoemd, vanuit de Linux-wereld). Op veel computers (behalve Windows) zit dit al standaard, tot en met de iPhone toe... Onder Linux is OpenSSH een veelgebruikte versie, te installeren met sudo apt-get install openssh-server. In Ubuntu 12.04 is dan de configuratiefile te vinden in /etc/ssh/sshd_config.

Op Windows zijn er standaard andere mogelijkheden, zoals 'remote desktop' en 'hulp op afstand', die de noodzaak van besturing via SSH kleiner maken. Ook een VNC als TightVNC kan een goede vervanging zijn.

Verschil met remote desktop is dat een SSH-verbinding een zelfstandige inlog doet, en niet meeloopt met de gebruiker achter de PC. Je bent dus onder een ander account ingelogd.

De cliënt legt de verbinding naar de server, en samen zetten ze de encryptie op.

SSH op Windows

Oorspronkelijk uit de Unix/Linux-wereld (waar deze programma's meestal standaard zijn geïnstalleerd) zijn er ook op Windows (incl Vista) goede mogelijkheden.

  • De meest gebruikte Windows SSH-cliënt is PuTTY, verkrijgbaar op alle mogelijke platforms, zelfs op mijn mobiele telefoon (Qtek9100 met Windows Mobile: PocketPutty). Download de 'Windows installer for everything'. Heeft ook uitgebreide help.
  • Een andere, uitgebreidere versie is Tunnelier, voor persoonlijk gebruik ook gratis (heb er zelf geen ervaring mee).
  • Een gratis maar door mij nog niet geteste SSH server voor Windows is MobaSSH. Daarnaast is er de (nog niet probleemloze) freeSSHd server (wel als administrator runnen bij installatie en bij het bijwerken van de configuratie). Een derde alternatief (en vermoedelijk stabieler) is de Cygwin sshd, maar hiervoor moet je Cygwin installeren (groot pakket). Let op: een ssh server stelt wel eisen aan hoe je router is geconfigureerd, zie mijn server pagina.
  • Een X server voor Windows is Xming, inclusief OpenGL 3D graphics support. Een alternatief in Windows is Ubuntu in een virtual machine: ssh met de -X optie opstarten, en test met bijvoorbeeld xterm &, zou een nieuw window met een X-terminal moeten openen.

Wachtwoorden

SSH heeft meerdere mogelijkheden om je te identificeren.

Info over gebruik met keys? Zie HowTo SSH logins using keys (Engels).

Aanmaken van sleutels in Ubuntu (of andere Linux-varianten)? Kijk eens op de SSHOpenSSHKeys pagina,  komt in het kort neer op:
sh-keygen -t rsa

Maar, pas op: zo aangemaakte files zijn niet direct compatible met PuTTY/PuTTYgen; je hebt de development versie van PuTTYgen nodig om deze keys naar PuTTY formaat om te zetten...

Handig om keys van te voren te laden: ssh-add <keyfile>. Alle keys wissen: ssh-add -D.

  • Klassieke wachtwoorden zijn de meest voor de hand liggende manier, maar niet altijd de meest veilige (afhankelijk van je keuze kunnen ze bijvoorbeeld makkelijk te raden zijn). Is om veiligheidsredenen dan ook niet overal toegestaan, zelf heb ik deze mogelijkheid ook uitgezet (gebruik SSH om op afstand bij mijn NSLU2 netwerk file server te kunnen, wil ik wel veilig hebben)
  • Een andere methode is met elektronische sleutels. Hierbij maak je (op Windows met bijvoorbeeld PuTTYgen) een RSA public/private key paar. De private key houd je zelf bij je (op bijvoorbeeld een USB stick). Ook kan bij de private key een optionele 'pass phrase' (wachtwoord). Dubbele veiligheid dus: een inbreker heeft zowel de file als de pass phrase nodig. Een Nederlandse handleiding hierover bij gebruik van PuTTY gevonden. Details afhankelijk van je programma's, configuratie en of je ssh1 of ssh2 gebruikt.
    De publieke sleutel zet je op de server. Als je PuTTYgen gebruikt om de keys te maken, en je server openssh/dropbear draait, kopiëer je vanuit PuTTYgen de tekst uit het veld 'Public key for pasting into OpenSSH authorized_keys file' naar de file .ssh/authorized_keys in de gebruikers home-directory op de server (maak deze directory writable voor gebruiker, maar niet voor anderen). Bij Windows/freeSSHd moet je volgens dit forum-artikel de publieke sleutelfile de login-naam geven, en in de goede directory kopiëren.
    De private key: opslaan als .ppk file voor gebruik met PuTTY. Voor Linux/Ubuntu clients: laat PuTTYgen de private key als openSSH key opslaan (via 'export openSSH key' in het Conversions-menu).
Bij de eerste keer inloggen wordt er gevraagd of de 'fingerprint' klopt. Hiermee kan je checken of je wel echt met je eigen systeem verbonden bent, en geen last hebt van iemand die er tussenin zit en je systeem nabootst: de fingerprint is niet zo maar na te maken. Check deze dus met de originele fingerprint van je systeem... Fingerprint kwijt? ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key (en net zo voor andere keys)

SSH op de LinkSys NSLU2 netwerk fileserver

Overgegaan op Debian op mijn NSLU2, hier gebruik ik niet de openssh-server maar de meer lichtgewicht dropbear. Werkt ook prima!

En met het pakket openssh-sftp-server heb je daar ook sftp access

Ik gebruik SSH met name om op afstand bij mijn samba file server op de NSLU2 te kunnen. Ik heb mijn Linux NSLU2 'geopend' voor extra software packages met behulp van uNSLUng. Vervolgens heb ik het NSLU2 openSSH package geïnstalleerd ('ipkg install open-ssh'), plus het openssh-sftp-server pakket (anders wordt alleen SCP ondersteund, en dat werkt niet samen met FileZilla). Zie de nslu page UseOpenSSHForRemoteAccess voor meer details.

Wel heb ik voor de veiligheid de openssh configuratiefile wat aangepast, bijvoorbeeld om alleen met public/private key files te werken en niet met wachtwoorden (PasswordAuthentication no). Op deze manier heb je de private key file nodig om in te loggen (zie hierboven), en niet alleen maar een wachtwoord. Ook heb ik het standaard SSH poortnummer aangepast van poort 22 naar een andere zelf gekozen waarde (boven de 1024, b.v. 22222!). Meer details op de sshd_config man page. Bijwerken van de configuratiefile kan op de NSLU2 met de nano editor (ook eerst installeren): nano /opt/etc/openssh/sshd_config. Om sshd in uNSLUng te herstarten niet zoals op de meeste systemen (als Debian) /etc/init.d/ssh restart maar /opt/etc/init.d/S40sshd (raak je meestal niet eens je bestaande verbinding kwijt). Daarnaast kan je overwegen om root als inlogmogelijkheid helemaal onmogelijk te maken (geen authorized_keys file in /root)

Daarna mijn router aangepast zodat de gekozen poort wordt doorgesluisd naar mijn NSLU2, en klaar (zie mij server pagina): ik kan via internet veilig op mijn NSLU2 inloggen. Zelfs met mijn Qtek9100 Windows Mobile mobieltje dank zij PocketPutty, en mijn Android phone: ConnectBot. Gezien ik van mijn provider geen vast IP adres heb, heb ik een account bij DynDNS: kan inloggen via <gekozennaam>.dyndns.org in plaats van een IP-adres te moeten onthouden.

SSH/Putty voorbeelden

SSH en Linux

SSH is meer gericht op Linux etc, hier is het ook standaard aanwezig. Om op je cliënt (dekstop) ook grafische windows te kunnen openen (niet standaard mogelijk onder Windows, zie verderop) moet je inloggen met de -X option (en X forwarding aan hebben staan op de server), bv SSH -X username@ipaddress

Een manier om dit vanuit Windows te doen is met Ubuntu in een virtual machine. Test met bijvoorbeeld xterm &, zou een nieuw window met een X-terminal moeten openen. Een alternatief is om Xming te installeren, een X server voor Windows, inclusief OpenGL 3D graphics support.

Zie ook: SSH tutorial for Linux

Een lijst van een paar nuttige opties/config items etc voor SSH (voor de ssh server zie de sshd_config man page)

Putty port forwarding:

Om bij Putty via een remote SSH server te linken naar een andere remote server (bijvoorbeeld een simpele webserver): Connection » SSH » tunnels; enable 'Remote ports do the same', source port is je lokale poort (bijvoorbeeld '8000'), destination is de IP:poort die je wilt bezoeken (bijvoorbeeld '192.168.1.200:8080'), enable 'Local' en 'auto'. Je kunt nu in je web browser 'http://127.0.0.1:8000' opgeven, en je wordt via Putty en je remote SSH server doorgelinkt naar '192.168.1.200:8080' op de remote site.

Tunneling (port forwarding) op Linux

Alleen maar een tunnel opzetten, geen terminal: de -f optie (bv voor secure mail; configureer je mailprogramma om localhost poort 2001 te gebruiken). -S ipv -f plaatst ssh niet in de achtergrond. localhost:143 specificeert de poort op de remote computer. Je kan op deze manier ook naar een andere computer op je lokale netwerk (vul het bijhorende lokale ip-adres in, zie volgende sectie).

ssh -f -L2001:localhost:143 mailserver.example.com

X server forwarding via SSH gateway (Linux)

Je kan via ssh ook grafische programma's opstarten, draaien op de remote computer maar geven de output op de computer vanaf waar je bent ingelogd. Een voorbeeld: start het remote programma xclock, en geeft dit op je lokale computer weer (als X forwarding aan staat):

ssh -f remotesystem.com xclock

X11 Forwarding aan

X11 forwarding aanzetten: zet in je .ssh/config file de regel
ForwardX11 yes

In PuTTY: pas de configuratie aan: SSH -> X11 -> X11 Forwarding aankruisen

Maar hoe nu dit te veilig doen via een NSLU2 als gateway? Je moet nu de X-programma's doortunnelen door de gateway naar de uiteindelijke lokale computer.

  1. Eerst een ssh-tunnel opzetten naar de NSLU2, waarbij je een port forward naar de sshd op de gewenste PC op je lokale netwerk
  2. Via de zo gecreëerde lokale poort (en over die tunnel) met een tweede ssh de X server forwarden...
  3. Vanuit de nu draaiende ssh shell (op de thuis-PC) kan je daar X applicaties als xeyes opstarten

Aannemend dat de thuisnetwerk-PC (op 192.168.1.112) sshd heeft draaien op standaardpoort 22, gaat dat met de volgende twéé regels (ieder beginnend met 'ssh'):

ssh -2 -f -N -p <port> -L 12322:192.168.1.112:22 <nslu_ssh_username>@<extern_ipaddress>
ssh -C -X -p 12322 <username>@localhost

xeyes is een mooie app om dit te testen. Wel twee ssh-verbindingen over elkaar heen... Twee keer encryptie (een keer op de thuisPC, een keer op de NSLU2), gaat vast niet sneller. Netter misschien via de xauth route? Meer in Putty SSH Multi-hop X11 Forwarding, O'Reilly's artikelen Connecting Through a Gateway Host en SSH Port Forwarding. Kan het met één ssh en dan xauth (apt-get install xbase-clients)?

Inloggen met keyfile/passphrase op ssh vanuit Linux/Ubuntu

Vreemd genoeg soms nog wat problemen om in te loggen met keyfile en passphrase vanuit Ubuntu; ssh-add accepteert de keyfile wel, maar inloggen gaat vervolgens nog steeds mis. Wat wel werkt is (met -p in geval je niet op poort 22 zit):

ssh -p <poortnummer> -i <keyfile> <user>@<remote>

Samba via SSH

Voor het veilig via het internet benaderen van je lokale file server kan je samba ook via SSH tunnelen. Zie hiervoor mijn samba pagina.

VNC/Vinagre/remote desktop door een SSH-tunnel

VNC/remote desktop via een reverse connection

Soms is de computer aan de andere kant achter een firewall. Lastig als je mensen met minder computerkennis op afstand wilt helpen; weinig kans dat zij de firewall kunnen onzeilen. Vergelijkbaar aan de Windows Ultra-VNC single-click oplossing kan je ook met Ubuntu een 'reverse VNC conection' opzetten, kijk bijvoorbeeld op de x11vnc oplossing op Ubuntu-Ubuntu single click (zonder SSH), of de Ubuntu VNC documentatie.

Ik gebruik zelf nog de Windows UltraVNC (in Wine) als viewer op poort 5555; aan de te helpen kant start je dan x11vnc met:
x11vnc -ultrafilexfer -connect <ip_van_jouw_viewer>:5555

Maar, wil je dit 'veilig' doen, dan kan je beter vanaf de andere kant een SSH-tunnel laten opzetten, en dan met een reverse port forward daarheen connecten. Hoe leg je dat aan de te helpen kant uit... ?

Om een ander systeem op afstand te besturen heb je tools als een 'Remote Desktop Viewer', zoals in het geval van Ubuntu: Vinagre. (Applications » Internet » Remote Desktop Viewer). Deze kan ook via een SSH-tunnel een verbinding opzetten, en hoeft dan niet zelf encryptie te verzorgen. In het Vinagre connect-menu moet je hiervoor 'Use host as a SSH tunnel' aanvinken, en daar de ssh-gegevens in de vorm <username>@<ipaddress>:<port> invullen (en natuurlijk het IP-adres van de te bezoeken computer bovenaan in het Host-veld). Hier een link naar vragen en antwoorden over Vinagre.

PS: de andere kant moet natuurlijk wel een VNC-server draaien zoals de Gnome Remote Desktop Server (System » Preferences » Remote Desktop); en deze zo ingesteld hebben dat deze bezoek toe laat...
PS2: Ik gebruik zoals boven uitgelegd een passphrase bij SSH; deze van te voren laden met ssh-add.
PS3: Vanuit Android werken met VNC over SSH? Kijk even op mijn HTC-pagina, kader VNC over SSH.

File copy over SSH

Om een file van/naar een SSH-beveiligde host te sturen kan je scp gebruiken. Voorbeeld: scp -P <port> raspberry:scripts/Home/20131221.log ~/Documents/20131221.log

Problemen

freeSSHd lijkt (2009) nog behoorlijk te rammelen. Opzetten van accounts met elektronische sleutels is erg lastig (en mij niet gelukt); en met Putty krijg ik soms foutmeldingen. Ook de koppeling tussen de settings en de eigenlijke server lijkt niet altijd goed te lopen. Met PocketPutty lukt me nog niet om een verbinding op te zetten op mijn mobiele telefoon, wat naar een Linux SSHd wel prima lukt (PocketPuTTY ziet wel de host dus firewall lijkt OK geconfigureerd, maar ik zie geen prompt om username/password, krijg een foutmelding, zelfs bij Blowfish of 3DES encryptie).

freeSSHd altijd als administrator beheren! op de een of andere manier  kan ik, als de service loopt, deze niet vanuit het freeSSHd window configureren; moet hem eerst via task manager afschieten (draait op verkeerde account?). Daarna geen problemen om te starten/stoppen, en instellingen worden goed overgenomen.

SSH1/SSH2: er zijn twee versies van het SSH protocol, 1 en 2. Deze zijn niet compatibel. Meeste programma's tegenwoordig kunnen beiden aan, maar bijvoorbeeld de elektronische sleutels hebben een ander formaat.