Geavanceerd SSH – broodnodige productiviteitstips
- May 1, 2014
- 0
Om toegang te krijgen tot een ander systeem gebruik je ssh. Dat is één van de eerste lessen die je leert als beginnend Linux gebruiker. OpenSSH, zoals de meest populaire versie heet, komt uit de stal van OpenBSD. Rond de millenniumwisseling was het nog de normaalste zaak van de wereld om via (het ongecodeerde) telnet in te loggen, maar de beveiligingsexperts van OpenBSD hebben daar snel verandering in gebracht. Het is een goed voorbeeld van hoe je de invloed van BSD terugziet in elk modern besturingssysteem. Als gezegd is ssh redelijk bekend, maar vaak komen mensen niet verder dan inloggen op een ander systeem. In dit artikel geven we je de broodnodige productiviteitstips voor geavanceerder ssh gebruik.
Screen
De geavanceerde gebruiker kan niet zonder screen. Met screen houd je vensters open, ook als je op dat moment niet verbonden bent. Maak een nieuwe screen sessie aan via het volgende commando:
$ screen -S mijnsessie
Binnen die sessie kan je nu zoals normaal commando’s uitvoeren. Om terug te keren naar de echte shell type je Control+A+D:
[detached from 5831.mijnsessie]
$ screen -ls
There is a screen on:
5831.mijnsessie(31/03/14 12:54:57)(Detached)
1 Socket in /var/run/screen/S-dk427.
Om nu weer terug te keren naar het scherm gebruik je ‘screen -r’. Zo kan je dus gemakkelijk individuele commando’s uitvoeren.
Uitvoeren
Wat weinig mensen weten is dat je met ssh commando’s op andere systemen kunt uitvoeren zonder dat je eerst moet inloggen. Anders gezegd, je kunt tegelijk inloggen en een commando uitvoeren. Een mooi voorbeeld om dit te illustreren is het volgende commando, waarmee we (op Linux) de microfoon via een pipe verbinden met de luidsprekers op een ander systeem.
$ dd if=/dev/dsp | ssh gebruiker@server dd of=/dev/dsp
Een ander interessant voorbeeld is om via ssh je screen sessie op de externe machine te openen:
$ ssh -t gebruiker@server screen -r mijnsessie
De -t optie is nodig om ssh een terminal te laten openen, dat screen nodig heeft.
Kopiëren en FTPen
Naast het ssh commando bestaan er een aantal andere interessante commando’s. Een veelgehoorde vraag is: hoe kopieer ik bestanden tussen twee machines, als ik alleen ssh toegang heb? Heel simpel, je gebruikt scp:
$ scp gebruiker@server:/home/linmag/bestand lokaal_bestand
Liever een FTP-achtige interface, ook al heb je helemaal geen FTP aanstaan op de server? Gebruik het ‘sftp’ commando.
Zonder wachtwoord
Als je ssh vaak gebruikt, dan wordt het op den duur vervelend om elke keer het wachtwoord in te typen. Om dat te versimpelen en nog steeds veilig te blijven, kunnen we gebruik maken van een public-private key pair. We genereren de sleutels als volgt:
$ ssh-keygen -t dsa
De publieke sleutel (in ~/.ssh/id_dsa.pub) kan je nu via scp of ssh op de server aan authorized_keys toevoegen of je kunt het relatief onbekende ssh-copy-id programma gebruiken om het voor je te doen:
$ ssh-copy-id gebruiker@server
Voordeel van dat laatste programma is dat je minder kans hebt op kleine foutjes. Als je bijvoorbeeld per ongeluk je private key probeert te kopiëren, dan krijg je een waarschuwing.
Host-specifieke instellingen
Als je vaak op dezelfde machine inlogt, dan kan je specifieke instellingen voor die machine toevoegen aan je ~/.ssh/config bestand. Stel dat onze lokale gebruiker “linmag” is, terwijl we op de server altijd als “linuxmagazine” willen inloggen of dat we een aparte key willen gebruiken voor een bepaalde host. We kunnen dit elke keer typen, of we kunnen het toevoegen aan de configuratie, zodat het automatisch gebeurt.
Host server
User linuxmagazine
IdentityFile ~/.ssh/server.id_dsa
X forwarding
Het is soms vervelend om altijd maar aan de command-line gebonden te zijn met ssh. Wat als je snel een plaatje wil bekijken? Je kan het plaatje dan via scp lokaal kopiëren, via ssh pipen naar iets lokaals of het via ftp of http ophalen, maar dat is allemaal nogal omslachtig. Eén van de nuttigste functionaliteiten op dit gebied is X forwarding, waarmee we grafische interfaces gewoon kunnen bekijken. Om dit in te schakelen geven we voor onze host in ~/.ssh/config aan dat X forwarding is toegestaan.
ForwardX11 yes
We moeten op de server zelf ook aangeven dat we dit willen, door aan /etc/ssh/sshd_config het volgende toe te voegen.
X11Forwarding yes
Als je nu ssh opnieuw opstart, kan je het plaatje zien (bijvoorbeeld met imagemagick) door het gewoon te openen.
server $ display plaatje.png
Agent forwarding
In veel gevallen maak je verbinding met een server in een ander netwerk. Als je binnen dat netwerk ook toegang met andere servers wilt hebben (bijvoorbeeld om bestanden heen en weer te kopiëren tussen webservers) dan werkt je key niet meer. Je zou dit kunnen oplossen door je private key naar de server te kopiëren, maar dat is natuurlijk een heel slecht idee. In plaats daarvan kan je (voor een vertrouwde host) aan je configuratie toevoegen dat jouw private key gebruikt moet worden bij verbindingen.
ForwardAgent yes
Het inloggen op een server om daarna weer door te ssh-en binnen het netwerk is sowieso een veel voorkomend iets. Om naar een database server te komen, type je bijvoorbeeld het volgende.
$ ssh gateway
gateway $ ssh db
Nu we agent forwarding aan hebben staan en gebruik maken van keys authenticatie, kunnen we dat echter ook automatisch doen, door het volgende toe te voegen.
Host db
HostName db.local
ProxyCommand ssh gateway -W %h:%p
Je kunt nu direct (met ‘gateway’ als proxy) inloggen op de ‘db’ server.
Port forwarding
Op een database-server is het voor de beveiliging vaak een goed idee om alleen verbindingen vanaf localhost toe te staan. Dat werkt echter ook beperkend, zeker als je bijvoorbeeld de grafische MySQL workbench wilt gebruiken zonder X-forwarding. We kunnen in dat geval de lokale port forwarden.
Host db
LocalForward 6033 localhost:3306
Als je vervolgens een ssh verbinding opent met die server via ‘ssh db’, dan kan je met de MySQL server communiceren via localhost:6033. Voor zover de MySQL server weet, komt de verbinding gewoon vanaf localhost!
Proxy
Je kunt al wel raden wat dan de volgende stap is. Als we ssh kunnen gebruiken als proxy binnen het netwerk, of als port forwarder, dan kunnen we het ook gewoon als reguliere proxy gebruiken. Dat wil zeggen: we kunnen een ‘tunnel’ bouwen via ssh, en ons e-mail- of web-verkeer over die tunnel sturen, alsof het een VPN is. Dat heeft een aantal grote voordelen: op de WiFi van de lokale Starbucks kan je niets vertrouwen, maar als je al je dataverkeer via ssh versleutelt, heb je geen problemen, ook niet met websites die niet SSL-beveiligd zijn. Daarnaast is het makkelijk vanuit het buitenland, als je bijvoorbeeld een programma op Uitzending Gemist wilt bekijken dat alleen vanuit Nederland toegankelijk is. Via de SSH tunnel bouw je je eigen tijdelijke proxy server. Dit is te bereiken met een simpel commando:
$ ssh -D 9999 -C gebruiker@server
In Firefox onder Edit > Preferences > Advanced > Settings kan je nu je proxy instellen.
Als je klaar bent, verbreek je de verbinding. Je kunt nu veilig het internet op!
Sshfs
We hebben gezien dat je via een veelvoud van manieren bestanden op de externe server kunt manipuleren. Je moet dan wel steeds ssh commando’s gebruiken of bestanden heen en weer kopiëren. Een interessant alternatief is om een map op de externe server lokaal te ‘mounten’, zoals je bijvoorbeeld via NFS zou doen.
$ mkdir voorbeeld
$ sshfs server:/home/linmag/voorbeeld voorbeeld
Je kunt nu lokale applicaties op bestanden in de voorbeeld map uitvoeren, terwijl die bestanden eigenlijk op de server zijn geïnstalleerd! Sshfs werkt via FUSE (zowel op BSD als Linux beschikbaar) en maakt het echt een fluitje van een cent.
Meer dan inloggen
Ssh is veel meer dan alleen maar een manier om veilig in te loggen. Het is bijna zonde dat veel gebruikers niet verder komen dan ‘ssh hostname’ en het daarmee moeten doen. Zoals wel blijkt uit het bovenstaande, kan je programma’s uitvoeren, bestanden kopiëren en grafische interfaces gebruiken. Je kunt ssh zelfs als FTP en NFS alternatief gebruiken of je bouwt een complete VPN of Proxy met een enkel commando. En dat allemaal volledig beveiligd via het SSH protocol!