Inleiding
SSH, of secure shell, is een gecodeerd protocol dat wordt gebruikt om servers te beheren en ermee te communiceren. Wanneer u met een Linux-server werkt, is de kans groot dat u het grootste deel van uw tijd doorbrengt in een terminalsessie die via SSH met uw server is verbonden.
Hoewel er een aantal verschillende manieren zijn om in te loggen op een SSH-server, zullen we ons in deze gids richten op het instellen van SSH-sleutels. SSH keys bieden een gemakkelijke, maar zeer veilige manier om in te loggen op je server. Om deze reden is dit de methode die we aanbevelen voor alle gebruikers.
Hoe werken SSH sleutels?
Een SSH server kan clients op verschillende manieren authenticeren. De meest eenvoudige is wachtwoord authenticatie, wat makkelijk te gebruiken is, maar niet de meest veilige.
Hoewel wachtwoorden op een veilige manier naar de server worden gestuurd, zijn ze over het algemeen niet complex of lang genoeg om bestand te zijn tegen herhaalde, hardnekkige aanvallers. Moderne rekenkracht in combinatie met geautomatiseerde scripts maken brute forcing van een met een wachtwoord beveiligde account zeer goed mogelijk. Hoewel er andere methoden zijn om extra beveiliging toe te voegen (fail2ban
, etc.), blijken SSH-sleutels een betrouwbaar en veilig alternatief te zijn.
SSH-sleutelparen zijn twee cryptografisch beveiligde sleutels die kunnen worden gebruikt om een client te authenticeren bij een SSH-server. Elk sleutelpaar bestaat uit een publieke sleutel en een private sleutel.
De private sleutel wordt bewaard door de client en dient absoluut geheim te blijven. Als de privésleutel in gevaar komt, kan de aanvaller zonder extra authenticatie inloggen op servers die zijn geconfigureerd met de bijbehorende publieke sleutel. Als extra voorzorgsmaatregel kan de sleutel op schijf worden versleuteld met een passphrase.
De bijbehorende publieke sleutel kan vrijelijk worden gedeeld zonder negatieve gevolgen. De openbare sleutel kan worden gebruikt om berichten te versleutelen die alleen met de particuliere sleutel kunnen worden ontsleuteld. Deze eigenschap wordt gebruikt als een manier om te authenticeren met het sleutelpaar.
De publieke sleutel wordt geupload naar een server op afstand waarop u wilt kunnen inloggen met SSH. De sleutel wordt toegevoegd aan een speciaal bestand binnen de gebruikersaccount waarop u inlogt, genaamd ~/.ssh/authorized_keys
.
Als een client probeert te authenticeren met SSH-sleutels, kan de server de client testen of hij in het bezit is van de private sleutel. Als de client kan aantonen dat hij in het bezit is van de private key, wordt een shell sessie gestart of het gevraagde commando uitgevoerd.
Hoe SSH sleutels te maken
De eerste stap om SSH sleutel authenticatie naar uw server te configureren is het genereren van een SSH sleutelpaar op uw lokale computer.
Om dit te doen, kunnen we een speciaal hulpprogramma gebruiken genaamd ssh-keygen
, dat wordt meegeleverd met de standaard OpenSSH suite van tools. Standaard zal dit een 2048 bit RSA sleutelpaar maken, wat prima is voor de meeste toepassingen.
Op uw lokale computer genereert u een SSH sleutelpaar door te typen:
ssh-keygen
Generating public/private rsa key pair.Enter file in which to save the key (/home/username/.ssh/id_rsa):
Het hulpprogramma zal u vragen om een locatie te selecteren voor de sleutels die zullen worden gegenereerd. Standaard worden de sleutels opgeslagen in de ~/.ssh
directory in de home directory van uw gebruiker. De private sleutel heet id_rsa
en de bijbehorende publieke sleutel heet id_rsa.pub
.
In het algemeen is het het beste om in dit stadium de standaard locatie te behouden. Hierdoor zal uw SSH-client automatisch uw SSH-sleutels vinden wanneer hij probeert te authenticeren. Als u een niet-standaard pad wilt kiezen, typ dat dan nu in, druk anders op ENTER om de standaard te accepteren.
Als u eerder een SSH-sleutelpaar had gegenereerd, ziet u mogelijk een prompt die er als volgt uitziet:
/home/username/.ssh/id_rsa already exists.Overwrite (y/n)?
Als u ervoor kiest om de sleutel op schijf te overschrijven, zult u zich niet meer met de vorige sleutel kunnen authenticeren. Wees zeer voorzichtig als u ja kiest, want dit is een destructief proces dat niet ongedaan kan worden gemaakt.
Created directory '/home/username/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:
Volgende stappen zal u worden gevraagd om een passphrase voor de sleutel in te voeren. Dit is een optionele passphrase die kan worden gebruikt om het private key-bestand op schijf te versleutelen.
Je vraagt je misschien af welke voordelen een SSH-sleutel biedt als je toch een passphrase moet invoeren. Enkele van de voordelen zijn:
- De privé SSH-sleutel (het deel dat met een passphrase kan worden beveiligd), wordt nooit blootgesteld op het netwerk. De passphrase wordt alleen gebruikt om de sleutel op de lokale machine te ontcijferen. Dit betekent dat netwerk-gebaseerde brute forcing niet mogelijk is tegen de passphrase.
- De prive sleutel wordt bewaard in een afgeschermde directory. De SSH-client zal geen private sleutels herkennen die niet in restricted directories worden bewaard. De sleutel zelf moet ook beperkte rechten hebben (lezen en schrijven alleen beschikbaar voor de eigenaar). Dit betekent dat andere gebruikers op het systeem niet kunnen meekijken.
- Een aanvaller die hoopt de passphrase van de private SSH sleutel te kraken, moet al toegang tot het systeem hebben. Dit betekent dat ze al toegang hebben tot uw gebruikersaccount of het root account. Als u zich in deze positie bevindt, kan de passphrase voorkomen dat de aanvaller direct inlogt op uw andere servers. Dit geeft u hopelijk de tijd om een nieuw SSH sleutelpaar te maken en te implementeren en de toegang van de gecompromitteerde sleutel te verwijderen.
Omdat de private sleutel nooit wordt blootgesteld aan het netwerk en wordt beschermd door bestandspermissies, zou dit bestand nooit toegankelijk mogen zijn voor iemand anders dan u (en de root gebruiker). De passphrase dient als een extra beschermingslaag voor het geval deze voorwaarden worden gecompromitteerd.
Een passphrase is een optionele toevoeging. Als u er een invoert, zult u die iedere keer dat u deze sleutel gebruikt moeten opgeven (tenzij u SSH-agent software gebruikt die de gedecodeerde sleutel opslaat). We raden het gebruik van een passphrase aan, maar als u geen passphrase wilt instellen, kunt u gewoon op ENTER drukken om deze prompt te omzeilen.
Your identification has been saved in /home/username/.ssh/id_rsa.Your public key has been saved in /home/username/.ssh/id_rsa.pub.The key fingerprint is:a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_hostThe key's randomart image is:+------+| ..o || E o= . || o. o || .. || ..S || o o. || =o.+. ||. =++.. ||o=++. |+-----------------+
U heeft nu een publieke en private sleutel die u kunt gebruiken om te authenticeren. De volgende stap is het plaatsen van de publieke sleutel op uw server, zodat u SSH-sleutelauthenticatie kunt gebruiken om in te loggen.
Hoe u uw publieke sleutel kunt insluiten wanneer u uw server aanmaakt
Als u een nieuwe DigitalOcean-server opstart, kunt u uw SSH-publieke sleutel automatisch insluiten in het root-account van uw nieuwe server.
Aan de onderkant van de pagina voor het maken van een Droplet vindt u een optie om SSH-sleutels aan uw server toe te voegen:
Als u al een publiek sleutelbestand aan uw DigitalOcean-account hebt toegevoegd, ziet u dit hier als een selecteerbare optie (in het bovenstaande voorbeeld zijn er twee bestaande sleutels: “Werksleutel” en “Huissleutel”). Om een bestaande sleutel in te sluiten, klikt u er gewoon op en hij wordt gemarkeerd. U kunt meerdere sleutels op één server insluiten:
Als u nog geen openbare SSH-sleutel naar uw account hebt geüpload, of als u een nieuwe sleutel aan uw account wilt toevoegen, klikt u op de knop “+ SSH-sleutel toevoegen”. Er verschijnt een prompt:
In het vak “SSH-sleutelinhoud” moet u de inhoud van uw openbare SSH-sleutel plakken. Ervan uitgaande dat u uw sleutels met de bovenstaande methode hebt gegenereerd, kunt u de inhoud van uw openbare sleutel op uw lokale computer ophalen door te typen:
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD [email protected]
Plak deze waarde, in zijn geheel, in het grotere vak. In het vak “Commentaar (optioneel)” kunt u een label voor de sleutel kiezen. Dit wordt weergegeven als de naam van de sleutel in de DigitalOcean-interface:
Wanneer u uw Droplet aanmaakt, worden de openbare SSH-sleutels die u hebt geselecteerd in het ~/.ssh/authorized_keys
-bestand van het account van de root-gebruiker geplaatst. Hierdoor kunt u inloggen op de server vanaf de computer met uw private sleutel.
Hoe kopieert u een publieke sleutel naar uw server
Als u al een server beschikbaar heeft en geen sleutels heeft ingesloten bij de creatie, kunt u nog steeds uw publieke sleutel uploaden en gebruiken om te authenticeren op uw server.
De methode die u gebruikt hangt grotendeels af van de tools die u tot uw beschikking heeft en de details van uw huidige configuratie. De volgende methoden leveren allemaal hetzelfde eindresultaat op. De eenvoudigste, meest geautomatiseerde methode is de eerste en de volgende vereisen extra handmatige stappen als u de voorgaande methoden niet kunt gebruiken.
Kopiëren van uw publieke sleutel met SSH-Copy-ID
De eenvoudigste manier om uw publieke sleutel naar een bestaande server te kopiëren is door gebruik te maken van een hulpprogramma genaamd ssh-copy-id
. Vanwege zijn eenvoud wordt deze methode aanbevolen indien beschikbaar.
Het ssh-copy-id
hulpprogramma is opgenomen in de OpenSSH pakketten in veel distributies, dus het is mogelijk dat u het op uw lokale systeem beschikbaar heeft. Om deze methode te laten werken, moet u al wachtwoord-gebaseerde SSH toegang tot uw server hebben.
Om het hulpprogramma te gebruiken, hoeft u alleen maar de remote host op te geven waarmee u verbinding wilt maken en het gebruikersaccount waartoe u wachtwoord-SSH toegang heeft. Dit is het account waar uw publieke SSH sleutel zal worden gekopieerd.
De syntax is:
ssh-copy-id username@remote_host
U kunt een bericht als dit zien:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes
Dit betekent alleen dat uw lokale computer de host op afstand niet herkent. Dit gebeurt de eerste keer dat u verbinding maakt met een nieuwe host. Typ “yes” en druk op ENTER om verder te gaan.
Volgende, het hulpprogramma zal uw lokale account scannen voor de id_rsa.pub
sleutel die we eerder hebben gemaakt. Als de sleutel is gevonden, wordt u gevraagd om het wachtwoord van het account van de gebruiker op afstand:
/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 [email protected]'s password:
Typ het wachtwoord in (uw invoer wordt om veiligheidsredenen niet weergegeven) en druk op ENTER. Het hulpprogramma maakt verbinding met de account op de host op afstand met het wachtwoord dat u hebt opgegeven. Het zal dan de inhoud van uw ~/.ssh/id_rsa.pub
sleutel kopiëren naar een bestand in de home ~/.ssh
directory van de remote account genaamd authorized_keys
.
U zult uitvoer zien die er als volgt uitziet:
Number of key(s) added: 1Now try logging into the machine, with: "ssh '[email protected]'"and check to make sure that only the key(s) you wanted were added.
Op dit punt, is uw id_rsa.pub
sleutel geupload naar de externe account. U kunt verder gaan met de volgende sectie.
Kopiëren van uw publieke sleutel met behulp van SSH
Als u geen ssh-copy-id
beschikbaar heeft, maar u heeft op wachtwoord gebaseerde SSH toegang tot een account op uw server, dan kunt u uw sleutels uploaden met een conventionele SSH methode.
We kunnen dit doen door de inhoud van onze publieke SSH sleutel op onze lokale computer uit te voeren en deze via een SSH verbinding naar de remote server te pipen. Aan de andere kant kunnen we ervoor zorgen dat de ~/.ssh
directory bestaat onder de account die we gebruiken en dan de inhoud die we hebben gepijpt uitvoeren in een bestand genaamd authorized_keys
in deze directory.
We zullen het >>
redirect symbool gebruiken om de inhoud toe te voegen in plaats van deze te overschrijven. Hierdoor kunnen we sleutels toevoegen zonder eerder toegevoegde sleutels te vernietigen.
Het volledige commando ziet er als volgt uit:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
U ziet misschien een bericht als dit:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes
Dit betekent alleen dat uw lokale computer de host op afstand niet herkent. Dit gebeurt de eerste keer dat u verbinding maakt met een nieuwe host. Typ “yes” en druk op ENTER om verder te gaan.
Daarna wordt u gevraagd om het wachtwoord van het account waarmee u verbinding probeert te maken:
[email protected]'s password:
Na het invoeren van uw wachtwoord zal de inhoud van uw id_rsa.pub
sleutel worden gekopieerd naar het einde van het authorized_keys
bestand van het account van de gebruiker op afstand. Ga verder met de volgende sectie als dit gelukt is.
Het handmatig kopiëren van uw Public Key
Als u geen wachtwoord-gebaseerde SSH toegang tot uw server beschikbaar heeft, zult u het bovenstaande proces handmatig moeten uitvoeren.
De inhoud van uw id_rsa.pub
bestand zal op de een of andere manier moeten worden toegevoegd aan een bestand op ~/.ssh/authorized_keys
op uw machine op afstand.
Om de inhoud van uw id_rsa.pub
sleutel weer te geven, typt u dit in op uw lokale computer:
cat ~/.ssh/id_rsa.pub
U ziet de inhoud van de sleutel, die er ongeveer zo uit kan zien:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test
Toegang tot uw host op afstand met behulp van de methode die u tot uw beschikking hebt. Als uw server bijvoorbeeld een DigitalOcean Droplet is, kunt u inloggen via de webconsole in het configuratiescherm:
Als u eenmaal toegang heeft tot uw account op de externe server, moet u ervoor zorgen dat de ~/.ssh
directory is aangemaakt. Dit commando maakt de directory indien nodig, of doet niets als hij al bestaat:
mkdir -p ~/.ssh
Nu kunt u het authorized_keys
bestand in deze directory maken of wijzigen. U kunt de inhoud van uw id_rsa.pub
bestand toevoegen aan het einde van het authorized_keys
bestand, door het zo nodig aan te maken, met behulp van dit:
echo public_key_string >> ~/.ssh/authorized_keys
In het bovenstaande commando vervangt u de public_key_string
door de uitvoer van het cat ~/.ssh/id_rsa.pub
commando dat u op uw lokale systeem hebt uitgevoerd. Het moet beginnen met ssh-rsa AAAA...
.
Als dit werkt, kunt u verder gaan om te proberen te authenticeren zonder wachtwoord.
Authenticeer op uw server met behulp van SSH Keys
Als u met succes een van de bovenstaande procedures heeft doorlopen, zou u in staat moeten zijn om in te loggen op de host op afstand zonder het wachtwoord van het remote account.
Het basisproces is hetzelfde:
ssh username@remote_host
Als dit de eerste keer is dat u verbinding maakt met deze host (als u de laatste methode hierboven hebt gebruikt), ziet u misschien iets als dit:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes
Dit betekent alleen dat uw lokale computer de host op afstand niet herkent. Typ “yes” en druk dan op ENTER om verder te gaan.
Als u geen passphrase voor uw private key hebt opgegeven, wordt u onmiddellijk ingelogd. Als u een passphrase voor de private key hebt opgegeven toen u de key aanmaakte, moet u die nu invoeren. Daarna zou er een nieuwe shell sessie voor u moeten worden gestart met het account op het systeem op afstand.
Als dat lukt, ga dan verder om uit te vinden hoe u de server kunt afsluiten.
Authenticatie met wachtwoord op uw server uitschakelen
Als u zich met SSH zonder wachtwoord hebt kunnen aanmelden bij uw account, dan hebt u met succes SSH key-gebaseerde authenticatie voor uw account geconfigureerd. Uw wachtwoord-gebaseerde authenticatie mechanisme is echter nog steeds actief, wat betekent dat uw server nog steeds blootgesteld is aan brute-force aanvallen.
Voordat u de stappen in deze sectie uitvoert, moet u ervoor zorgen dat u ofwel SSH key-gebaseerde authenticatie geconfigureerd heeft voor de root account op deze server, of bij voorkeur, dat u SSH key-gebaseerde authenticatie geconfigureerd heeft voor een account op deze server met sudo
toegang. Deze stap zal wachtwoord-gebaseerde logins vergrendelen, dus ervoor zorgen dat u nog steeds administratieve toegang kunt krijgen is essentieel.
Als aan bovenstaande voorwaarden is voldaan, log dan in op uw remote server met SSH sleutels, ofwel als root of met een account met sudo
privileges. Open het configuratiebestand van de SSH daemon:
sudo nano /etc/ssh/sshd_config
In het bestand, zoek naar een directive genaamd PasswordAuthentication
. Deze kan uitgecommentarieerd zijn. Haal het commentaar weg en zet de waarde op “no”. Dit schakelt de mogelijkheid uit om in te loggen via SSH met account wachtwoorden:
PasswordAuthentication no
Bewaar en sluit het bestand als u klaar bent. Om de wijzigingen die we zojuist hebben aangebracht daadwerkelijk door te voeren, moet u de service opnieuw starten.
Op Ubuntu of Debian machines, kunt u dit commando uitvoeren:
sudo service ssh restart
Op CentOS/Fedora machines, heet de daemon sshd
:
sudo service sshd restart
Na het voltooien van deze stap, heeft u met succes uw SSH daemon omgeschakeld om alleen op SSH keys te reageren.
Conclusie
U zou nu SSH key-gebaseerde authenticatie moeten hebben geconfigureerd en draaien op uw server, waardoor u kunt inloggen zonder een account wachtwoord op te geven. Vanaf hier zijn er vele richtingen waarin u kunt gaan. Als u meer wilt leren over het werken met SSH, kijk dan eens naar onze SSH essentie gids.