Veilig aanmelden op server met SSH key authenticatie

Via SSH ook gekend als Secure Shell is een protocol waarmee het mogelijk om op een veilige manier machines te beheren over het internet. Het is al jaren de manier bij uitstek voor het beheren van Unix machines en is sinds kort ook beschikbaar op Windows.

Een gebruiker kan gewoon verbinden aan de hand van zijn gebruikersnaam en wachtwoord. Maar er is ook een oplossing die veiliger en handiger is: authenticatie aan de hand van SSH keys.

SSH bij Kinamo

Als Managed Service provider komen we bij Kinamo dagelijks in aanraking met beheer van servers, zowel interne machines als cloud servers welke wij beheren voor onze klanten. Het aantal keren dat wordt aangemeld op een server is haast niet bij te houden.

Het is dan ook van belang dat dit steeds op een veilige manier kan gebeuren. Dit is niet altijd even eenvoudig aangezien servers vaak – net zoals een toepassing of andere toestel – verwachten dat een gebruikersnaam en wachtwoord wordt ingegeven.

Het doorgeven van wachtwoorden, het bezorgen van authenticatie gegevens aan klanten, derde partijen enzovoort is een hekel punt als het op beveiliging aankomt en vormt meteen ook een zwakkere schakel in de hele beveiligingsketting.

We geven jullie dan ook graag mee wat bij ons een wel gesmaakte manier van authenticatie is op servers die wij beheren!

Voordelen van SSH

Werken met een SSH sleutel heeft een aantal voordelen:

  • Het is niet nodig om een wachtwoord te verzenden.
  • Het is mogelijk om “aanmelden met behulp van een wachtwoord” uit te schakelen op de server. Dit is een perfecte oplossing om zogenaamde “brute force” attacks tegen de gaan.
  • Het is mogelijk om je eigen sleutel (key) te gebruiken op verschillende servers. Je moet dus geen lijst van wachtwoorden bijhouden.
  • Je publieke sleutel (public key) kan zonder problemen gedeeld worden met anderen. Ze kunnen deze public key op een server installeren en je zo toegang geven. Zo raden wij web ontwikkelaars die op een server van een klant moeten werken aan om te authenticeren via een SSH key.

Iets dat voordelen heeft, heeft steeds ook minstens één nadeel. Het nadeel is dat je private SSH bewaard wordt op disk.

Als iemand deze key in handen krijgt dan heeft hij ook toegang tot al de machines waar jij toegang tot hebt.

Daarom wordt ten sterkste aangeraden om deze private key te beschermen met een wachtwoord. Door gebruik te maken van een sleutel met een wachtwoord heb je meteen authenticatie met twee factoren: je sleutel en het wachtwoord.

Het wachtwoord kan je eenvoudig instellen bij het aanmaken van de key.
Klinkt geweldig, maar hoe begin je er aan?

Aanmaken van een key

Voor het aanmaken van de SSH keys maken we gebruik van OpenSSH.

OpenSSH is – mogen we gerust stellen – in praktijk de standaard SSH client.
OpenSSH is altijd al beschikbaar geweest voor Mac OS en Linux besturingssystemen en bestaat sinds kort ook voor Windows 10 en Windows Server 2019.

Als je SSH op een Windows besturingssysteem wil gebruiken zal je de “OpenSSH Client” feature moeten activeren.

Je vindt dit terug onder “Apps > Apps and Features > Optional Features”.

Mac OS en Linux gebruikers hebben normaal gezien de SSH client reeds ter beschikking op hun systeem. Je kan dit testen met het volgende commando:

kinamo@debian:/# ssh -V
OpenSSH_7.9p1 Debian-10+deb10u1, OpenSSL 1.1.1d  10 Sep 2019

Als je OpenSSH geïnstalleerd hebt, dan is een eigen SSH key aanmaken een eenvoudig proces. Dit kan aan de hand van het commando ssh-keygen.

Je krijgt de vraag waar je de key wil opslaan en welk wachtwoord je wil instellen.
Om bij een vraag de standaard optie te kiezen druk je gewoon op enter.

kinamo@debian:/$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kinamo/.ssh/id_rsa):
Created directory ‘/home/kinamo/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/kinamo/.ssh/id_rsa.
Your public key has been saved in /home/kinamo/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:D7IyqOyoO+G8QbjE5RoCAdhMsTVM5IZPvxRlTMCY/M4 kinamo@debian
The key’s randomart image is:
+—[RSA 2048]—-+
|=+o*=+.++        |
|..o==..o.        |
|. o.+..          |
|+ o+ …         |
|o= ..o+ S        |
|=.o. .E+ o       |
|++. o o   .      |
|++.  o           |
|B*.              |
+—-[SHA256]—–+

Na het aanmaken van de keys kan je de publieke sleutel installeren op een machine.

In de uitvoer van ssh-keygen zie je “Your public key has been saved in /home/kinamo/.ssh/id_rsa.pub.”.

Jouw publieke sleutel is dus te vinden op die locatie in het bestand id_rsa.pub

Open het bestand op die locatie met notepad of een andere tekst editor.
Dit zou er ongeveer als volgt moeten uitzien:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC+qYhABkyQ39Bjdaw9Uscu5ca+9APZJyIcjz3fJZmhpTe2+AyIg3aj/la0iRrymMBd3l7x3FBmmaXfek52AS/jsRhTRDS5IQ/yNFocKjqDur36jByANFGOLVy6aHV2sXNXkVqF7UX9CgA2sxNIZd4K7qJte8lh5781zdMX3Vsdn0NyvXw30HmZfv79jhtgeEZe7ER6SCAEHJ5oAa3hiqClvU8f4Chy/NpsKmGIcloLBXBpV/nLSTcmw+8Rdk5R2ilO1Dl+6sz38FLTFBjigj++IvleF0W/tclqhFEneen0Jryb9zB43TmeZMAEfbnycCECywKO9/ok8F97urVbdGSF kinamo@debian

Installeren van jouw sleutel

De eenvoudigste manier om je sleutel te installeren op een machine is met ssh-copy-id.

Dit programma installeert jouw sleutel helemaal automatisch.

Je moet één keer verbinden met de server met behulp van je wachtwoord. In dit voorbeeld installeren we onze key op de server remote_server met het commando ssh-copy-id kinamo@remote_server.

kinamo@debian:/$ ssh-copy-id kinamo@remote_server
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/home/kinamo/.ssh/id_rsa.pub”
The authenticity of host ‘remote_server (xx.xx.xx.xx)’ can’t be established.
ECDSA key fingerprint is SHA256:.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
kinamo@remote_server’s password:

kinamo@debian:/$ ssh-copy-id kinamo@remote_server
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: “/home/kinamo/.ssh/id_rsa.pub”
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
kinamo@remote_server’s password:

Number of key(s) added: 1


Now try logging into the machine, with:   “ssh ‘kinamo@remote_server'”
and check to make sure that only the key(s) you wanted were added.

Als ssh-copy-id niet beschikbaar is op je systeem (helaas, Windows gebruikers) kan je de sleutel ook manueel installeren.

Je maakt dan verbinding met de server waar je jouw sleutel op wil plaatsen via SSH.

Eens aangemeld op de server maak je in de home folder een nieuwe folder genaamd .ssh met daarin het bestand authorized_keys.

Open dit bestand met een tekst editor en plaats er de inhoud van jouw id_rsa.pub in.

ssh kinamo@remote_server
kinamo@remote_server:~$ mkdir ~/.ssh
kinamo@remote_server:~$ vim ~/.ssh/authorized_keys

Als jouw sleutel geïnstalleerd is kan je de verbinding verbreken.

Wanneer je nu opnieuw verbinding maakt moet je het wachtwoord van je gebruiker niet meer ingeven.

Bonus: “inloggen met behulp van een wachtwoord” uitschakelen

Wanneer je kan verbinden aan de hand van je SSH key, dan kan je nog een extra stap nemen om je server te beveiligingen. Je kan namelijk “verbinden met behulp van een wachtwoord” uitschakelen.

Op die manier maken brute force attacks op je SSH server geen kans meer. Zeker te overwegen!

Open de configuratie van je SSH server:
vim /etc/ssh/sshd_config

Ga op zoek naar de optie PasswordAuthentication.

Standaard staat deze in commentaar en ingesteld op “yes“.
Haal de optie uit commentaar en stel ze in op “no“:

PasswordAuthentication no

Herstart nu de SSH service:
kinamo@remote_server:~$ sudo systemctl restart ssh
Aanmelden op je server verloopt nu voortaan enkel via je SSH key!