Overview
Wat is SSH?
Voor we beginnen met de uitleg hoe je SSH Login zonder wachtwoord kunt gebruiken, even snel kijken wat SSH really en wanneer je het gebruikt.
Persoonlijk gebruik ik SSH om Shell toegang te krijgen tot een andere computer bijvoorbeeld mijn web server, mijn QNAP NAS, of mijn Raspberry Pi welke LibreElec (KODI) draait.
Vaak om bepaalde commando’s uit te voeren, zoals het wijzigen van wat instellingen of de installatie of verwijdering van iets op de betreffende computer.
Zie het als een Shell/Terminal/Command Prompt venster, welke op de andere computer draait.
Op de meeste platformen (macOS, Linux, Windows) lijkt het alsof je lokaal bezig bent, maar in plaats daarvan ben je aan het prullen op een andere machine.
Merk op: Voor macOS en Linux gebruikers zullen de commando’s sterke overeenkomst tonen met wat ze al gewend zijn in een Shell of in Terminal.
Windows gebruikers zullen misschien een beetje onwennig beginnen, omdat de Linux commano’s net even anders zijn dan wat Windows normaal gesproken op de Command prompt doet.
Ad Blocking Gedetecteerd Vriendelijk verzoek om te overwegen Ad Blocking uit te zetten voor onze website.
We zijn afhankelijk van inkomen uit Advertenties om de website te kunnen draaien.
Je kunt ons ook op andere manieren ondersteunen (zie Ondersteun ons links bovenin).
SSH Login zonder Wachtwoord – Hoe werkt dat?
Zeker in het begin, zullen gebruikers een username en password gebruiken bij SSH toegang.
Dit werkt prima natuurlijk, maar het is minder veilig dan met SSH-keys. Een wachtwoord is eenvoudiger te breken, dan het breken van een SSH-key.
Het alternatief, SSH-keys, maakt het wachtwoord niet alleen moeilijker te raden, maar maakt het wachtwoord ook significant langer.
Uiteraard zouden we hier uren over kunnen discussiëren, maar in dit artikel wil ik het juist simpel houden.
Public Key vs Private Key
Wanneer we naar encryptie kijken, dan zien we al snel termen zoals “Public Key” en “Private Key” – iets wat we hier gaan gebruiken.
Wat zijn die Keys dan en hoe werkt het?
Private Key
Een Private Key wordt gebruikt om berichten te ontsleutelen (decrypt).
Deze moet je altijd privé houden en met niemand delen.
Public Key
De Public Key wordt gebruikt om berichten te versleutelen (encrypt), het kan dus met anderen gedeeld worden.
Deze key kan nooit gebruikt worden om een bericht te ontsleutelen (decrypt).
Merk op: Dit soort sleutels maken we over het algemeen met OpenSSL tools, meer hierover later.
Het basis idee is:
We maken twee keys;
Een voor “encode” en een voor “decode” van berichten;
Een “Private Key” voor decode (encrypt) van berichten,
Een “Public Key” voor encode” (decrypt) van berichten.
Een simpel voorbeeld:
Stel Max wil dat Bram hem een geheim bericht stuurt, maar Max wil zeker weten dat niemand anders het bericht kan lezen.
Om dit te doen, geeft Max een zijn “Public Key” en vraagt Bram om met die key het bericht te versleutelen.
Na encryptie kan zelfs Bram het bericht niet meer decrypten en stuurt dit versleutelde bericht naar Max.
Max heeft natuurlijk zijn eigen “Private key”, waarmee hij het geheime bericht van ontsleutelen.
Voorbeeld van Private en Public Keys voor encryptie
SSH Login met SSH-keys
Hoe gaan we dit nu werkende krijgen voor onze SSH verbindingen?
De procedure bestaat uit 3 stappen.
Stap 1 – Maak een Public en een Private Key set
We moeten natuurlijk eerste beide keys hebben en zullen ze dus moeten genereren.
Merk op dat dezelfde set keys gebruikt kan worden voor meerdere verschillende servers.
Dit hoeft niet perse, je kunt ook een set per server maken, maar dat komt met de nodige uitdagingen die we in dit artikel over gaan slaan.
Stap 2 – Geef de server jouw Public Key – Dit hoeft maar 1 keer.
De tweede stap is dat we onze Public Key aan de server (de andere computer) moeten geven – dit hoeven we maar 1 keer te doen.
Op deze manier weet de server nu welke Username en Public Key combinatie eventueel SSH toegang zou mogen hebben.
In deze stap moeten we een verbinding opzetten met de server, met onze standaard username en password login, zodat we onze “Public Key” kunnen afgeven.
De Public Key wordt op betreffende machine in een specifieke locatie opgeslagen, inde home directory van betreffende gebruiker (~/.ssh/authorized_keys
).
Stap 3 – Voor elke SSH Login – Geef de server onze Username en Public Key
Elke keer dat we een SSH login doen, moeten de volgende stappen worden doorlopen.
Als gebruiker merk je hier niets van, het gebeurt allemaal automatisch op de achtergrond.
- Stuur username en onze public key (meestal “id_rsa.pub“) naar de server.
- De server kijkt dan of het de betreffende combinatie kent (staat in “authorized_keys“).
- Indien gevonden, dan zal de server een uniek bericht genereren en deze vervolgens versleutelen met de Public Key.
- Onze computer ontvangt dit bericht en kan het met de Private Key ontsleutelen en het ontsleutelde bericht dan terug sturen naar de server.
- De server kan het ontvangen bericht nu vergelijken met wat het originele bericht was en als het matched SSH toegang geven.
In een vergelijkbare flow, zoals in het simpele voorbeeld van eerder:
SSH Login met Public en Private Keys
SSH Login zonder Wachtwoord – In Praktijk Toepassen
Nu we weten hoe dit in de achtergrond werkt, tijd om dit in de praktijk te gaan toepassen.
Ik hanteer hier bewust de meest eenvoudige methode, er zijn nogal wat opties die dit verhaal misschien onnodig moeilijk zouden kunnen maken.
Je kunt bijvoorbeeld jouw keys beveiligen met een wachtwoord, of complexere encryptie algoritmen gebruiken (ik gebruik hier RSA voor encryptie).
Stap 1 – Aanmaken van een Public en een Private Key (eenmalig)
Uiteraard hebben we een setje keys nodig en die gaan we nu genereren.
Dit werkt voor zowel macOS, Linux als Windows.
Na deze stap hebben we 2 bestanden: De Private Key (id_rsa) en de Public Key (id_rsa.pub).
Beiden worden opgeslagen in onze home directory (Linux/macOS: ~/.ssh/
en Windows: C:\Users\<username>\.ssh\
.
Het lijkt erop dat de directory .ssh
onder macOS en Linux already vaak al bestaat of automatisch wordt aangemaakt.
Mocht je een foutmelding krijgen, dan kan het zijn dat je betreffende directory moet aanmaken (zeker onder Windows het geval).
Ik heb wat extra parameters toegevoegd om het e.e.a. makkelijker te maken, maar de korte versie kan ook werken: ssh-keygen
.
De extra parameters zorgen ervoor dat we weten waar de key bestanden staan (-f) en dat we ze niet met een wachtwoord willen beveiligen (-P).
macOS/Linux:
ssh-keygen -f ~/.ssh/id_rsa -t rsa -P ""
Let op: Onder macOS en Linux zijn bestandsnamen en directory namen (zoals .ssh) die met een punt beginnen onzichtbaar.
Windows:
Windows moeten eerst de .ssh directory aanmaken …
Ik he dit enkel onder Windows 10 getest en het lijkt erop dat delen van OpenSSL al geinstalleerd staan.
Voor de opslag van de SSH-keys moeten we echter zelf een directory aanmaken.
In Command Prompt: mkdir C:\Users\<username>\.ssh
Uiteraard moet je “<username>” vervangen door jouw username (kijk eens met dir C:\Users\
waar je misschien kunt achterhalen wat dit zou moeten zijn).
ssh-keygen -f C:\Users\<username>\.ssh\id_rsa -t rsa -P ""
Merk op: vervang “<username>” door jouw username of user directory naam (kijk eens met: dir C:\Users\
).
De output ziet er ongeveer zo uit:
Generating public/private rsa key pair.
Your identification has been saved in \Users\Hans\.ssh\id_rsa.
Your public key has been saved in \Users\Hans\.ssh\id_rsa.pub.
The key fingerprint is:
SHA256:N0k/xd1qAAX77qoG8HAfIUGmU1Co4Y72kWSJ+GqabHg hans@MAC
The key's randomart image is:
+---[RSA 2048]----+
| .=* .|
| . .+ . . +.|
| . o +o o . + +|
| . . * o + = ..|
| . = .S = + +. |
| + + * o + .|
| . o . . o . .|
|+ E . . . . |
|*+ o..oo|
+----[SHA256]-----+
Stap 2 – Give de Server onze Public Key (eenmalig)
Waarschwuing: Als je nieuwe keys genereert, dan zul je die nieuwe keys weer aan de server moeten doorgeven omdat ze anders zullen zijn.
Er zijn een aantal methoden, waarvan 2 de meest gangbare; de oude methode en de methode die gebruik maakt van ssh-copy-id.
Helaas voor de Windows gebruikers, ssh-copy-id lijkt niet te bestaan onder Windows (Ik vond deze op GitHub voor wie interesse heeft).
Vervang “<username>” met de login username voor deze server, en vervang “<server-ip-address>” met het IP adres van de server.
De optie “-o StrictHostKeyChecking=No” zorgt er alleen maar voor dat je een vraag kunt overslaan – SSH zal de server automatisch toevoegen aan de “known hosts” .
Je moet jouw login wachtwoord deze ene keer nog wel invoeren!
macOS en Linux – De makkelijke methode met ssh-copy-id
ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<server-ip-address> -o StrictHostKeyChecking=No
ssh-copy-id -i ~/.ssh/id_rsa.pub admin@192.168.1.100 -o StrictHostKeyChecking=N
macOS en Linux – De oudere methode met cat
cat ~/.ssh/id_rsa.pub | ssh <username>@<server-ip-address> 'mkdir -p .ssh; cat >> .ssh/authorized_keys'
cat ~/.ssh/id_rsa.pub | ssh admin@192.168.1.100 'mkdir -p .ssh; cat >> .ssh/authorized_keys'
Windows – De lastige methode omdat ssh-copy-id niet bestaat
Vervange “<userdirectory>” met de juiste gebruikers directory naam op jouw PC (zoek met: dir C:\Users\
).
type C:\Users\<userdirectory>\.ssh\id_rsa.pub | ssh <username>@<server-ip-address> -o StrictHostKeyChecking=No "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1;"
type C:\Users\Hans\.ssh\id_rsa.pub | ssh admin@192.168.1.100 -o StrictHostKeyChecking=No "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1;"
Stap 3 – Test of SSH Login zonder Wachtwoord ook werkt
Dit is wel de eenvoudigste stap, en de methode waarmee je in de toekomst een SSH sessie kunt starten (werkt hetzelfde voor macOS, Linux en Windows);
ssh <username>@<server-ip-address>
Ad Blocking Gedetecteerd Vriendelijk verzoek om te overwegen Ad Blocking uit te zetten voor onze website.
We zijn afhankelijk van inkomen uit Advertenties om de website te kunnen draaien.
Je kunt ons ook op andere manieren ondersteunen (zie Ondersteun ons links bovenin).
Extra: Commando’s in een enkele regel op afstand uitvoeren
Nu we kunnen inloggen zonder wachtwoord, hier nog een paar eenvoudige voorbeelden hoe je snel en eenvoudig in een enkele regel commando’s op de doel server kunnen uitvoeren.
Merk op:
In deze voorbeelden moet je user vervangen door jouw gebruikersnaam, en server vervangen door de doel server/computer naam of IP adres.
Bij deze voorbeelden zie je aan het einde het volgende staan: ” || exit 1;
” wat wil zo veel wil zeggen als “sluit de SSH verbinding/shell” en “return succes” (=1).
Onderstaande commando’s zijn voor Linux/macOS. Windows voor Windows zal dit in een vergelijkbare manier werken.
Voorbeeld 1: Geef directory inhoud weer
Het commando om een directory weer te geven is “ ls
“.
Alles rondom “ls” kan worden hergebruikt voor andere commando’s.
ssh -t user@server "ls || exit 1;"
Hier een voorbeeld waarin je ziet dat je ook parameters kunt gebruiken;
ssh -t user@server "ls -al / || exit 1;"
Voorbeeld 3: WOL fix voor macOS – Scherm wakker maken met Caffeinate
In dit voorbeeld gebruiken we het Caffeinate commando onder macOS (standaard aanwezig), om het scherm wakker te maken via SSH.
Het commando is is: caffeinate -u -t 1
Dit wil zeggen: -u
zet het scherm aan (user “actief”), en -t 1
zet de timeout, zodat we het kort kunnen houden.
Ik gebruik dit om mijn Mac op afstand wakker te maken (inclusief scherm).
In mijn specifieke geval, wilde een MacBook Pro het scherm niet aanzetten na het sturen van een WOL (Wake On LAN) bericht.
Na veel zoek en experimenteer werk ontdekte ik het volgende:
Als een Mac laptop op het stopcontact is aangesloten, en verbonden met WiFi voor de laptop in slaapstand ging, en de WiFi chipset van de laptop WOL ondersteund, dan heb je niet eens Wake On LAN nodig. (dit werkt NIET met een USB Ethernet dongle!)
De WiFi verbinding blijft namelijk actief, zelfs als de Mac slaapt.
Zodra je dit naar de slapende MacBook stuurt, dan wordt de Mac wakker en gaat het scherm aan.
ssh user@server "caffeinate -u -t 1 || exit 1;"
Reacties
Er zijn 3 reacties welke je hieronder kunt lezen.
Je kunt jouw eigen opmerkingen plaatsen m.b.v. dit formulier, of een reactie op een bestaande opmerking plaatsen door op de "Beantwoorden" knop te klikken.
[…] Meer diepgang vind je in dit artikel: SSH Login zonder Wachtwoord […]
Zeer goed uitgelegd. Dankuwel !
Er staat volgens mij wel een fout in (tenzij je het daarboven verkeerd zou uitgelegd hebben):
FOUT:
GOED:
Marc
Hoi Marc,
Dank je wel voor het compliment en … je hebt helemaal gelijk – nice catch!
Ik ga het meteen verbeteren!
hans