15.10. OpenSSH
Terug | Hoofdstuk 15. Beveiliging | Volgende

## 15.10. OpenSSH

Bijgedragen door Chern Lee.

OpenSSH is een groep netwerkverbindingsprogramma's waarmee computers via het netwerk veilig benaderd kunnen worden. Het kan ingezet worden als een directe vervanger van `rlogin`, `rsh`, `rcp` en `telnet`. Daarnaast kunnen TCP/IP-verbindingen veilig getunneld of geforward worden door SSH. OpenSSH versleutelt al het verkeer om afluisteren, het stelen van een verbinding en andere netwerkaanvallen effectief te voorkomen.

OpenSSH wordt onderhouden door het OpenBSD project en is gebaseerd op SSH v1.2.12 met alle recente bugfixes en updates. Het is compatibel met beide protocollen SSH 1 en 2.

### 15.10.1. Voordelen van gebruik van OpenSSH

Als gewoonlijk telnet(1) of rlogin(1) wordt gebruikt, wordt de data in platte tekst en niet versleuteld verzonden. Netwerksnuffelaars die ergens tussen de cliënt en de server meeluisteren, kunnen een gebruikersnaam en wachtwoord stelen en zien welke gegevens er worden overgezonden tijdens een sessie. OpenSSH biedt een verscheidenheid aan autenticatie en versleutelingsmethoden die het voorgaande voorkomen.

### 15.10.2. sshd inschakelen

De sshd is een optie die wordt aangeboden tijdens een `Standard`-installatie van FreeBSD. sshd is ingeschakeld als de volgende regel voorkomt in `rc.conf`:

    sshd_enable="YES"

Hierdoor wordt sshd(8) geladen, het daemonprogramma voor OpenSSH, als het systeem de volgende keer opstart. Als alternatief is het mogelijk om rc(8) te gebruiken om OpenSSH te starten:

    # service sshd start

### 15.10.3. SSH-cliënt

ssh(1) werkt net zoals rlogin(1).

    # ssh user@example.com
    Host key not found from the list of known hosts.
    Are you sure you want to continue connecting (yes/no)? yes
    Host 'example.com' added to the list of known hosts.
    user@example.com's password: *******

Het aanmelden gaat nu net zoals het zou gaan als wanneer er een sessie gestart zou worden met `rlogin` of `telnet`. SSH maakt gebruik van een systeem met vingerafdrukken als sleutels voor het vaststellen met welke server verbinding wordt gemaakt op het moment dat de cliënt verbinding zoekt. De gebruiker krijgt alleen de eerste keer dat verbinding wordt gezocht met de server een vraag waarop `yes` geantwoord dient te worden. Bij volgende pogingen om aan te melden wordt de vingerafdruksleutel vergeleken met de sleutel die is opgeslagen. De SSH-cliënt alarmeert de gebruiker als de opgeslagen vingerafdruk sleutel anders is dan de sleutel die de server meldt. De vingerafdrukken worden opgeslagen in `~/.ssh/known_hosts` of in `~/.ssh/known_hosts2` voor SSH v2 vingerafdrukken.

Recente OpenSSH servers staan standaard ingesteld om alleen SSH v2 connecties toe te staan. De cliënt gebruikt versie 2 als dat mogelijk is en valt anders terug op versie 1. De cliënt kan ook gedwongen worden om een van de twee protocollen te gebruiken door de optie `-1` of `-2` voor respectievelijk versie 1 en versie 2 aan te geven. De mogelijkheid versie 1 te gebruiken blijft in de cliënt bestaan om compatibiliteit met oudere versies te behouden.

### 15.10.4. Veilig kopiëren

Het commando scp(1) (secure copy) werkt gelijk aan rcp(1). Het kopieert een bestand van of naar een andere machine, maar doet dat veilig.

    #  scp user@example.com:/COPYRIGHT COPYRIGHT
    user@example.com's password: *******
    COPYRIGHT            100% |*****************************|  4735
    00:00
    #

Omdat de vingerafdruk al is opgeslagen voor deze host in het vorige voorbeeld, is die al geverifieerd als scp(1) gebruik wordt.

De argumenten die aan scp(1) gegeven worden zijn vrijwel gelijk aan die voor cp(1) met het bestand of de bestanden als het eerste argument en de bestemming als het tweede. Omdat het bestand over het netwerk gaat, door SSH, hebben een of meer van de bestandsargumenten de vorm `user@host:<path_to_remote_file>`.

### 15.10.5. Instellen

Het instellingenbestand dat voor het hele systeem geldt voor zowel de OpenSSH daemon als cliënt staat in de map `/etc/ssh`.

`ssh_config` bevat de instellingen voor de cliënt en `sshd_config` bevat ze voor de daemon.

Daarnaast bieden het `sshd_program` (standaard `/usr/sbin/sshd`) en `sshd_flags` `rc.conf` opties nog meer mogelijkheden voor instellingen.

### 15.10.6. ssh-keygen

In plaats van het gebruik van wachtwoorden kan ssh-keygen(1) gebruikt worden om DSA en RSA sleutels te maken om een gebruiker te autenticeren:

    % ssh-keygen -t dsa
    Generating public/private dsa key pair.
    Enter file in which to save the key (/home/user/.ssh/id_dsa):
    Created directory '/home/user/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/user/.ssh/id_dsa.
    Your public key has been saved in /home/user/.ssh/id_dsa.pub.
    The key fingerprint is:
    bb:48:db:f2:93:57:80:b6:aa:bc:f5:d5:ba:8f:79:17 user@host.example.com

ssh-keygen(1) maakt een publiek en privaat sleutelpaar aan dat gebruikt kan worden voor autenticatie. De private sleutel staat opgeslagen in `~/.ssh/id_dsa` of `~/.ssh/id_rsa` en de publieke sleutel staat in `~/.ssh/id_dsa.pub` of `~/.ssh/id_rsa.pub` voor respectievelijk sleuteltypen DSA en RSA. De publieke sleutel moet voor beide RSA- of DSA-sleutels in het bestand `~/.ssh/authorized_keys` van de andere machine staan om dit te laten werken.

Nu is het mogelijk een verbinding te maken met een andere machine die gebaseerd is op SSH sleutels in plaats van op wachtwoorden.

Als er een wachtwoordzin is gebruikt bij ssh-keygen(1) dan wordt de gebruiker iedere keer dat de private sleutel wordt gebruikt een wachtwoord gevraagd. ssh-agent(1) kan het ongemak van steeds opnieuw een lange wachtwoordzin moeten ingeven verlichten en wordt beschreven in het onderdeel Paragraaf 15.10.7, “ssh-agent en ssh-add”.

### Waarschuwing:

Afhankelijk van de gebruikte versie van OpenSSH kunnen opties en bestanden verschillen. Het is verstandig de handleiding ssh-keygen(1) te raadplegen.

### 15.10.7. ssh-agent en ssh-add

De hulpprogramma's ssh-agent(1) en ssh-add(1) bieden de mogelijkheid om SSH in het geheugen te laden zodat niet iedere keer de wachtwoordzin ingegeven hoeft te worden.

Het hulpprogramma ssh-agent(1) handelt de autenticatie af voor de geheime sleutels die erin geladen zijn. ssh-agent(1) wordt gebruikt om andere programma's te starten. Bij eenvoudig gebruik kan er een shell mee gestart worden of meer complex een schermbeheerprogramma.

Voordat ssh-agent(1) in een shell gebruikt kan worden dient het eerst gestart te worden met een shell als argument. Daarna kan de identiteit toegevoegd worden daar ssh-add(1) aan te roepen en de wachtwoordzin voor de geheime sleutel op te geven. Als deze stappen zijn voltooid kan een gebruiker met ssh(1) naar iedere host waar de corresponderende publieke sleutel is geïnstalleerd:

    % ssh-agent csh
    % ssh-add
    Enter passphrase for /home/user/.ssh/id_dsa:
    Identity added: /home/user/.ssh/id_dsa (/home/user/.ssh/id_dsa)
    %

Om ssh-agent(1) te gebruiken in X11 dient er een verwijzing naar ssh-agent(1) in `~/.xinitrc` te staan. Dan zijn de diensten van ssh-agent(1) beschikbaar voor alle programma's die in X11 gestart worden. Een `~/.xinitrc` zou er als volgt uit kunnen zien:

    exec ssh-agent startxfce4

Hiermee wordt ssh-agent(1) gestart die op zijn beurt XFCE start, iedere keer dat X11 start. Als dat is gebeurd en X11 is herstart zodat de wijzigingen actief zijn, dan kan eenvoudigweg ssh-add(1) gestart worden om alle beschikbare SSH sleutels te laden.

### 15.10.8. SSH tunnels

OpenSSH kan een tunnel maken waarin een ander protocol ingepakt kan worden zodat er een versleutelde sessie ontstaat.

Het volgende commando geeft ssh(1) aan dat er een tunnel voor telnet gemaakt moet worden:

    % ssh -2 -N -f -L 5023:localhost:23 user@foo.example.com
    %

Aan het `ssh` commando worden de volgende opties meegegeven:

`-2`

  Dit dwingt `ssh` om versie 2 van het protocol te gebruiken. Gebruik van deze optie wordt afgeraden als er verbinding wordt gemaakt met oudere SSH servers.

`-N`

  Dit geeft aan dat er geen commando volgt, maar dat er een tunnel opgezet moet worden. Als deze optie niet aanwezig was, zou `ssh` een normale sessie starten.

`-f`

  Dit dwingt `ssh` om in de achtergrond te draaien.

`-L`

  Dit geeft aan dat de lokaal een tunnel wordt gemaakt in de vorm `lokale_poort:netwerk_host:netwerk_poort`.

`user@foo.example.com`

  Wijst naar een gebruiker op de SSH server op het netwerk.

Een SSH tunnel werkt doordat een luistersocket wordt gemaakt op `localhost` op de aangegeven poort. Die stuurt dan iedere ontvangen verbinding op de lokale host/poort via de SSH verbinding door naar de aangegeven host en poort op het netwerk.

In het voorbeeld wordt poort `5023` op `localhost` doorgestuurd naar poort `23` op `localhost` van de machine op het netwerk. Omdat `23` telnet is, zou dit een veilige telnet verbinding opleveren door een SSH tunnel.

Dit kan gebruikt worden om ieder willekeurig onveilig TCP protocol in te pakken als SMTP, POP3, FTP, etc.

Voorbeeld 15.1. SSH gebruiken om een veilige tunnel te maken voor SMTP

    % ssh -2 -N -f -L 5025:localhost:25 user@mailserver.example.com
    user@mailserver.example.com's password: *****
    % telnet localhost 5025
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 mailserver.example.com ESMTP

Dit kan samen met een ssh-keygen(1) en extra gebruikersaccounts gebruikt worden om een min of meer naadloze en eenvoudige SSH tunnelomgeving te maken. In plaats van wachtwoorden kunnen sleutels gebruikt worden en de tunnels kunnen in de omgeving van een aparte gebruiker draaien.

#### 15.10.8.1. Praktische voorbeelden van een SSH tunnel

##### 15.10.8.1.1. Veilige toegang tot een POP3 server

Op het werk staat een SSH server die verbindingen van buitenaf toestaat. Op hetzelfde netwerk op kantoor staat een mailserver waarop POP3 draait. Het netwerk of het netwerkpad tussen de locatie op Internet en kantoor is wellicht niet helemaal te vertrouwen. Om deze reden dient de mailserver op een veilige manier benaderd te worden. De oplossing is een SSH verbinding opzetten naar de SSH server op kantoor en dan door de tunnel heen een verbinding opzetten met de mailserver.

    % ssh -2 -N -f -L 2110:mail.example.com:110 user@ssh-server.example.com
    user@ssh-server.example.com's password: ******

Als de tunnel eenmaal draait, dan kan de mailcliënt naar `localhost` poort 2110 gewezen worden. Alle verbinding naar die poort worden veilig doorgestuurd door de tunnel naar `mail.example.com`.

##### 15.10.8.1.2. Een draconische firewall omzeilen

Sommige netwerkbeheerders stellen draconische firewallregels op en filteren niet alleen inkomende verbindingen, maar ook uitgaande. Meestal mag dan alleen maar verbinding gemaakt worden met andere machines op poorten 22 en 80 voor SSH en websurfen.

Soms wil een gebruiker dan toch toegang krijgen tot andere (wellicht niet netwerkgerelateerde) diensten, zoals een Ogg Vorbis server om muziek te streamen. Als die Ogg Vorbis server streamt op een andere poort dan 22 of 80, dan kan deze niet bereikt worden.

De oplossing ligt in het opzetten van een SSH verbinding naar een machine buiten de firewall en die tunnel te gebruiken om bij de Ogg Vorbis server te komen.

    % ssh -2 -N -f -L 8888:music.example.com:8000 user@unfirewalled-system.example.org
    user@unfirewalled-system.example.org's password: *******

De streamingcliënt kan nu gewezen worden naar `localhost` poort 8888 vanwaar er wordt doorverwezen naar `music.example.com` poort 8000 en zo wordt de firewall succesvol ontwerken.

### 15.10.9. De optie `AllowUsers`

Vaak is het verstandig om beperkingen aan te brengen op het gebied van welke gebruikers kunnen aanmelden en van waar. De optie `AllowUsers` biedt deze mogelijkheid. Om bijvoorbeeld alleen `root` toe te staan zich aan te melden van `192.168.1.32`, kan iets als de volgende regel worden opgenomen in het bestand `/etc/ssh/sshd_config`:

    AllowUsers root@192.168.1.32

Om de gebruiker `admin` het recht te geven zich van overal aan te melden hoeft alleen de gebruikersnaam vermeld te worden:

    AllowUsers admin

Meerdere gebruikers met rechten of beperkingen horen op dezelfde regel te staan:

    AllowUsers root@192.168.1.32 admin

### Opmerking:

Het is van belang dat iedere gebruiker die zich moet kunnen aanmelden wordt genoemd. De overige gebruikers worden buitengesloten.

Nadat er wijzigingen zijn gemaakt aan `/etc/ssh/sshd_config` dienen de bestanden in sshd(8) geladen te worden:

    # service sshd reload

### 15.10.10. Meer informatie

OpenSSH

ssh(1) scp(1) ssh-keygen(1) ssh-agent(1) ssh-add(1) ssh_config(5)

sshd(8) sftp-server(8) sshd_config(5)

Terug | Omhoog | Volgende
15.9. VPN via IPsec | Begin | 15.11. Bestandssysteem toegangscontrolelijsten (ACLs)