Werken met SSH

Paul Wiegmans (paul@bonhoeffer.nl)
laatst gewijzigd

Introductie

Dit hoofdstuk behandelt SSH en VNC voor werken op afstand.

SSH staat voor Secure SHell en biedt een methode voor het uitvoeren van commandos in een terminal op een computer op afstand via een beveiligde verbinding. Met SSH is het mogelijk om gevoelige gegevens zoals wachtwoorden over een netwerk (internet) versleuteld te versturen, zodat deze niet in verkeerde handen vallen.  Computers die aan het internet verbonden zijn, zijn in principe kwetsbaarder voor inbraak dan andere computers. Door uitsluitend beveiligde verbindingen zoals SSH te gebruiken wordt dit risico van inbraak verkleind. SSH heeft allerlei gebruikstoepassingen: ik noem hier shell op afstand, bestandsoverdracht, en tunneling voor andere toepassing zoals VNC

VNC staat voor Virtual Network Computing en is een manier om van afstand een computer te bedienen via een grafische gebruikersomgeving. VNC biedt de mogelijkheid om het bureaublad van de computer op afstand te zien en de muis en het toetsenbord op afstand te bedienen. VNC is een cross platform applicatie, dat wil zeggen dat de viewer en de server op verschillende besturingssystemen kunnen werken.

Toepassingen van SSH

De oudste methoden van computertoegang op afstand waren telnet en rsh  (Remote SHell). Al sinds vele jaren lang kan een gebruiker met Telnet en rsh op de commandoregel (shell) van een computer op afstand werken. Telnet en rsh versturen alle gegevens onversleuteld over het netwerk, dus ook het wachtwoord van de gebruiker die zich inlogt. Om deze en nog enkele andere zwakheden, is het tegenwoordig geen goed idee om telnet en rsh te gebruiken en is ssh nu de aanbevolen manier om shelltoegang op afstand te krijgen. Ssh vervangt telnet en rsh volledig.

Met SSH kunnen ook bestanden worden overgedragen. Op deze manier gedraagt het zich als FTP.  Sommige FTP-programma zijn hierop ingesteld en bieden naast FTP als transportprotoco ook SFTP over SSH (Secure File Transfer Protocol) . Dit maakt het gebruik van SSH om bestanden op een veilige manier te transporteren erg makkelijk. Ook is het veiliger dan een FTP-verbinding want net als bij telnet wordt hierbij het wachtwoord nog steeds onversleuteld verzonden.

Als derde belangrijke toepassing is er het tunnelen van verbindingen. Zo kan SSH versleutelde verbindingen worden opgebouwd die als een tunnel fungeren en waar andere programmas gebruik van maken, die zelf niet een beveiligde verbinding kunnen maken. Dit wordt bijvoorbeeld gedaan bij een webserver (HTTPS) , X of een VNC-server. Tunnels worden ook gebruikt bij VPNs (Virtual Private Network).

Op bijna elke Linuxdistributie is het pakket OpenSSH meegeinstalleerd. Dit is een vrije versie van het SSH-pakket en omvat o.a. de SSH-server sshd en een SSH-client ssh. Soms moet het pakket met de hand geinstalleerd worden. In Mandrake kunnen de pakketten openssh-server en openssh-clients vanaf de CD worden geinstalleerd met het Software Installatieprogramma (RPMDrake).

SSH protocol

De SSH-applicaties gebruiken eigen protocollen SSH1 en SSH2 om gegevens versleuteld over te dragen. Deze protocollen gebruiken en draaien bovenop TCP/IP. De SSH-server luistert standaard naar poort 22. Het is mogelijk om een firewall zo in te stellen , dat het alleen verkeer voor poort 22 doorlaat.

Gebruik van SSH

Met het commando ssh kan een verbinding worden opgebouwd met een andere computer. Om een verbinding te maken kan bijvoorbeeld dit worden gebruikt

[paul@deimos paul]$ ssh 172.18.10

Men kan ook een DNS-naam gebruiken , bijvoorbeeld

[paul@deimos paul]$ ssh amber.bonhoeffer.nl 

Vanzelf wordt ingelogd op de andere machine met de zelfde gebruikersnaam als op de computer waar de gebruiker op werkt. Het kan nodig zijn om een gebruikersnaam te geven.

[paul@deimos paul]$ ssh -l student amber.bonhoeffer.nl

maar dit mag ook:

[paul@deimos paul]$ ssh student@amber.bonhoeffer.nl

Een sessie ziet er bijvoorbeeld zo uit.

[paul@deimos paul]$ ssh -l student amber.bonhoeffer.nl
student@amber.bonhoeffer.nl's password:
_____________________
[* *]
[ Welkom bij Amber ]
[*___________________*]
[student@amber student]$ ls
public_html/ tmp/
[student@amber student]$ exit
logout


Connection to amber.bonhoeffer.nl closed.
[paul@deimos paul]$

Hier zit je dat de gebruiker paul op deimos verbinding maakt met amber als de gebruiker cursist. Hij geeft het wachtwoord van de gebruiker cursist en krijgt daarna de commandoregel op de amber computer. Alle commandos die daarna worden uitgevoerd, zoals ls, worden op amber uitgevoerd, totdat hij exit intikt. Na het intikken van het commando exit wordt de verbinding verbroken. Door op Ctrl-D te drukken kan de verbinding ook worden verbroken. Daarna is aan de prompt te zien dat hij weer op deimos terug is.

Commandos uitvoeren

SSH is ook een programma om commando uit te voeren op de andere computer. Men gebruikt dat als volgt.

[paul@deimos paul]$ ssh student@amber.bonhoeffer.nl ls -al
student@amber.bonhoeffer.nl's password:
total 44
drwx--x--x 4 student student 4096 Apr 18 20:00 .
drwxr-xr-x 20 root root 4096 Apr 17 17:12 ..
-rw------- 1 student student 260 Apr 18 20:00 .Xauthority
-rw------- 1 student student 8 Apr 17 17:22 .bash_history
-rw-r--r-- 1 student student 24 Sep 30 2004 .bash_logout
-rw-r--r-- 1 student student 191 Sep 30 2004 .bash_profile
-rw-r--r-- 1 student student 124 Sep 30 2004 .bashrc
-rw-r--r-- 1 student student 141 Sep 30 2004 .mailcap
-rw-r--r-- 1 student student 3722 Sep 30 2004 .screenrc
drwxr-xr-x 2 student student 4096 Sep 30 2004 public_html
drwx------ 2 student student 4096 Sep 30 2004 tmp
[paul@deimos paul]$

Ook hier vraagt ssh voor een wachtwoord, voert het commando uit op de andere computer, en laat vervolgens de uitvoer zien op het scherm. Ook zaken zoals omleiding zijn op deze manier mogelijk. Het is ook met een paar trucjes mogelijk om complete directories te backuppen naar een andere computer via een SSH-verbinding. Een voorbeeld:

$ ls | ssh student@amber.bonhoeffer.nl "cat > lijstje"

of een nog beter voorbeeld

$ echo Dit is een bestand op amber | ssh student@amber.bonhoeffer.nl "cat > lijstje"

Let op: De dubbele quotes zijn nodig om het commando "cat > lijstje"

goed te laten uitvoeren. Ander denkt de shell dat hier bedoeld wordt :
"ssh student@amber.bonhoeffer.nl cat > lijstje"

en dat is een heel andere commando. Dankzij de quotes wordt de uitvoer van het cat commando omgeleid, en niet de uitvoer van het ssh commando. Het Lijstje op amber kan met het volgende commando worden getoond op de lokale terminal.

$ ssh student@amber.bonhoeffer.nl cat lijstje

20051223

De volgende regel geeft weer hoe met behulp van SSH en het tar programma een hele map met bestanden wordt gekopieerd. en op de lokale computer wordt ge'untar'd. Op de remote machine wordt de map met tar ingepakt en naar de standaard uitvoer geleid, welke via SSH naar de lokale computer wordt overgebracht en hier met tar wordt uitgepakt. De bestanden worden onderweg niet in een bestand opgeslagen en worden rechtstreeks naar de andere computer overgebracht.

ssh paul@172.17.0.21 "tar zcvf - /data2" | tar zxvf -

Als de computers verbonden zijn via een LAN, dan is het in dit geval nog beter om geen compressie te gebruiken. De processors worden zo minder belast en het kopieren is dan sneller klaar.

ssh paul@172.17.0.21 "tar cvf - /data2" | tar xvf -

Bestandsoverdracht met SSH

Via het hulpprogramma scp kunnen bestanden overgedragen worden naar een
andere computer. ...

SSH laat het ook toe om bestands over te dragen naar de andere computer net zoals FTP. Grafische X-Programmas zoals gFTP op Mandrake 9.2 kunnen zo verbinding maken met SSH-servers precies zoals een FTP-server. Er wordt slechts een andere keuze voor het protocol gemaakt.  In gFTP wordt dan SSH2 gekozen in plaats van FTP. Het is mogelijk om op die manier computers te bereiken die door een firewall worden afgeschermd. Er is slechts een open toegang tot de SSH-poort 22 nodig.

VNC

VNC kan worden gebruikt om het beeldscherm, toetsenbord en muis van een andere computer over te nemen. In de Mandrake-distributie is tightvnc bijgevoegd. Installeer met Software Installatieprogramma de pakketten tightvnc en tightvnc-server om gebruik te kunnen maken van VNC in Mandrake.

Wanneer je met VNC contact maakt met een windowserver neem je het echte  beeldscherm over. Wanneer je verbinding maakt met Linux, dan is de desktop die je met VNC ziet is een andere dan die zichtbaar is op het beeldscherm. Anders gezegd: er wordt een extra grafische omgeving gestart.


Windows bekeken met VNC vanaf Linux

Deze grafische omgeving start je met het vncserver script. Start dit commando op de andere computer waarvan je een grafische omgeving op afstand wilt gebruiken. De syntax is als volgt.

[cursist@PB115A cursist]$ vncserver :1
You will require a password to access your desktops.
Password:
Verify:

New 'X' desktop is PB115A:1

Creating default startup script /home/cursist/.vnc/xstartup
Starting applications specified in /home/cursist/.vnc/xstartup
Log file is /home/cursist/.vnc/PB115A:1.log

Dit start een vncserver met een standaard grafische omgeving binnen een gebruikersomgeving. Merk op dat dit een gebruikerscommando is en dat je geen root hoeft te zijn. De parameter :1 duidt aan dat deze desktop nummer 1 heeft. Als je wilt kan een andere gebruiker desktop :2 starten. Het aantal is in principe onbeperkt. Het vraagt om een wachtwoord en nogmaals hetzelfde wachtwoord. Dit wachtwoord is nodig om straks verbinding te maken met deze vncserver. Je hebt dan de vncserver gestart.

TIP: Op de vncserver op de andere computer te starten, is het nodig om eerst in te loggen met SSH. Je kunt natuurlijk ook achterwege laten en de vncserver direct op de andere computer starten door het ssh commando te combineren met het vncserver commando.


[dezecomputer]$ ssh cursist@anderecomputer vncserver ....

Technische opmerking: de vncserver luistert naar poort 5800 + de desktopnummer. Je kunt de actieve verbindingen en servers opvragen met netstat -a .

Bij het verbinden met deze vncserver wordt om eerder gegeven het wachtwoord gevraagd. Standaard wordt dan de windowmanager Icewm gestart. Het is goed dat dit niet KDE of Gnome is, want dat vraagt veel meer van de computer in termen van geheugenbelasting, schijfbelasting en processorbelasting. Vanaf een andere computer kan dan met het volgende commando een VNC-sessie worden opgebouwd.

$ vncviewer 172.18.10.15:1 

of start alleen vncviewer. Het programma vraagt dan vervolgens voor een IP-adres. Dit kan ook vanaf een Windows computer.





Als de resolutie niet geschikt is , dan kan de resolutie opgegeven worden op de commandoregel. Het is wel eerst nodig om de draaiende vncserver et stoppen voordat deze opnieuw kan worden gestart. Dat kan zo:

$ vncserver -kill :1

Dan kan de vncserver opnieuw gestart worden. Hierbij wordt aangegven dat de desktop 640x480 pixels groot moet worden, en dat de kleurdiepte 8 bits is. Door de kleurdiepte te verlagen van 16, 24 of 32 bits naar 8 bits wordt de bandbreedte veel kleiner, en de connectie verloopt  sneller. Daardoor reageert de desktop op afstand vlotter.

[cursist@PB115A cursist]$ vncserver -geometry 640x480 -depth 8 :1

New 'X' desktop is PB115A:1

Starting applications specified in /home/cursist/.vnc/xstartup
Log file is /home/cursist/.vnc/PB115A:1.log

Omdat de eerste keer al om een wachtwoord is gevraagd, wordt dat nu niet meer gedaan. Om het wachtwoord later te veranderen, gebruik het commando vncpasswd .

Test de vncserver nu uit. Maak met vncviewer verbinding vanaf deze computer naar de andere computer.

VNC over SSH

VNC zoals hierboven wordt gebruikt biedt een snelle en eenvoudige manier om verbinding te maken met Linux of Windows computer met een grafische omgeving. Deze verbinding is niet veilig, want tijdens het opbouwen van de verbinding wordt het wachtwoord in klare taal onversleuteld over het netwerk gestuurd en andere mensen kunnen dat onderscheppen. Dit geldt ook voor alle toetsaanslagen die tijdens de sessie worden gestuurd. Ook het wachtwoord mechanisme van VNC zelf is niet supersterk.

Om VNC veiliger te maken is het nodig om de comunicatie te versleutelen. Dit kan  door de verbinding tussen vncviewer en vncserver door een SSH-tunnel te laten lopen. Hierdoorheen worden alle gegevens versleuteld getransporteerd van de ene computer naar de andere, en dit kan ook over internet.

Nu wordt een VNC-over-SSH verbinding opgezet van PB115A naar PB114 (172.18.10.210).

In venster 1:

[cursist@PB115A cursist]$ ssh -L 5901:localhost:5901 172.18.10.210
cursist@172.18.10.210's password:
[cursist@PB114 cursist]$ vncserver -geometry 640x480 -depth 8 :1

New 'X' desktop is PB114:1

Starting applications specified in /home/cursist/.vnc/xstartup
Log file is /home/cursist/.vnc/PB114:1.log

[cursist@PB114 cursist]$

In venster 2:

[cursist@PB115A cursist]$ vncviewer localhost:1

Je krijgt nu de bureaublad van PB114 te zien. De verbinding is veilig. Om te stoppen, sluit vncviewer, en ga naar venster 1.

[cursist@PB114 cursist]$ vncserver -kill :1
Killing Xvnc process ID 2452
[cursist@PB114 cursist]$ exit

Klaar.

Maak SSH extra veilig (extra)

In hlds_linux mailinglist wordt melding gemaakt van een aantal SSH attacks,waarbij loginpogingen worden gedaan vanaf hosts in China, Taiwan en Singapore op SSH, met usernamen root, admin, guest en test. Op Uranus zijn ook een aantal mislukte loginpogingen gedaan vanaf enkele hosts in Taiwain (.tw). Er wordt geadviseerd om root-login op SSH uit te schakelen. Dit doen ik als volgt:

(van: deze link  )
1. SSH into your server as 'admin' and gain root access by su

2. Copy and paste this line to edit the file for SSH logins
pico -w /etc/ssh/sshd_config

3. Find the line
Protocol 2, 1

4. Uncomment it and change it to look like
Protocol 2

5. Next, find the line
PermitRootLogin yes

6. Uncomment it and make it look like PermitRootLogin no

7. Save the file Ctrl+X then Y then enter

8. Now you can restart SSH
/etc/rc.d/init.d/sshd restart

Now, no one will be able to login to root with out first loggin in as admin and 'su -' to root, and you will be forcing the use of a more secure protocol. Just make sure you remember both passwords!

SSH op andere poort

Een andere maatregel is het instellen van de SSH-daemon op een niet-standaard poort. Normaliter wordt sshd aktief op poort 22. Door sshd op een andere poort in te stellen wordt het aantal inlogpogingen door geautomatiseerde tools verlaagd. Om dit te doen, wijzig als root /etc/ssh/ssh_config en wijzig de regel

port 22 

in bijvoorbeeld

port 2200

of voeg de laatste regel toe als port ontbreekt. Herstart de SSH-daemon om de configuratie te aktualiseren, als volgt.

service sshd restart

Vanaf de client moet nu wel de poort opgegeven worden om in te loggen. Bijvoorbeeld: 

ssh -p 2200 paul@andin.bonhoeffer.nl

het maken van key pairs (extra)

Het automatische inloggen op een ander systeem gaat door middel van het uitwisselen van key pairs. Op systeem 1 wordt een key aangemaakt.
[csadmin@uranus diversen]$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/csadmin/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Passphrases do not match. Try again.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/csadmin/.ssh/id_dsa.
Your public key has been saved in /home/csadmin/.ssh/id_dsa.pub.
The key fingerprint is:
fe:56:83:ea:aa:82:gg:8e:10:52:db:6c:60:e5:38:67 csadmin@uranus.lan
[csadmin@uranus diversen]$

Dit maakt een sleutelpaar (key pair) aan: een privesleutel (private key) en een publieke sleutel (public key). Nu wordt de publieke sleutel in ~/.ssh/id_dsa.pub overgebracht naar systeem 2 waarop je wilt inloggen.
[csadmin@uranus csadmin]$ scp ~/.ssh/id_dsa.pub paul@andin.bonhoeffer.nl:/home/paul
paul@amber.bonhoeffer.nl's password:
id_dsa.pub                                                       100%  608     0.6KB/s   00:00

Voeg op systeem 2 de inhoud van id_dsa.pub toe aan het bestand ~/.ssh/autohorized_keys2 .

[paul@andin paul]$ cat id_dsa.pub >> ~/.ssh/authorized_keys2

Je kunt dit ook direct doen.

[csadmin@uranus csadmin]$ cat ~/.ssh/id_dsa.pub | ssh paul@andin.bonhoeffer.nl "cat >> ~/.ssh/authorized_keys2"
paul@andin.bonhoeffer.nl's password:
[csadmin@uranus csadmin]$ ssh paul@andin.bonhoeffer.nl

keychain

Om automatische in te loggen op een systeem op afstand is het handig om key pairs aan te maken. Bij het inloggen wordt nu gevraagd om een passphrase (Het gebruik van versleutelde communicatie met een lege passphrase is onveilig en wordt afgeraden). De ssh-agent maakt het mogelijk om vervolgens in te loggen zonder om een wachtwoord of passphrase te worden gevraagd, maar heeft een aantal nadelen, zoals het starten van diverse instanties van ssh-agent. Keychain geeft hier de oplossing en maakt het mogelijk om 1 instantie van ssh-agent per systeem te gebruiken.

Installeer keychain vanaf hier . Lees eventueel de uitstekende introductie in het gebruik van keychain.

download keychain met bijvoorbeeld Lynx

[paul@andin paul]$ lynx http://dev.gentoo.org/~agriffis/keychain

Installeer Keychain RPM

[root@andin software]# rpm -ivf keychain-2.5.3.1-1.noarch.rpm
warning: keychain-2.5.3.1-1.noarch.rpm: V3 DSA signature: NOKEY, key ID 20104eb0
Preparing packages for installation...
keychain-2.5.3.1-1

Keychain werkt als volgt. De eerste keer dat keychain start, controleert het of ssh-agent al draait. Wanneer ssh-agent nog niet draait, dan start het ssh-agent en leidt de uitvoer van ssh-agent in .ssh_agent . Dit stelt de variabelen SSH_AUTH_SOCK en SSH_AGENT_PID in. Volgende instanties van keychain starten niet meer ssh-agent, maar voeren slechts het script .ssh-agent uit waardoor de bestaande en reeds draaiende ssh-agent wordt gebruikt.

Voeg het volgende toe aan .bash_profile :

#!/bin/bash
#example ~/.bash_profile file
/usr/bin/keychain ~/.ssh/id_rsa
#redirect ~/.ssh-agent output to /dev/null to zap the annoying
#"Agent PID" message
source ~/.ssh-agent > /dev/null

Ook in cronjobs is de ssh-agent nu bereikbaar. Zorg ervoor dat cronjobs starten met

source ~/.ssh-agent

Links

RSH

Telnet

SSH

VNC

VNC over SSH-tunnel

Diverse links