Nitrokey – Safety first!

About

Nitrokey – Safety first!

Veel mensen slaan sleutels voor ssh en pgp gewoon op hun PC op, maar dat is niet zo veilig. Een smartcard biedt extra veiligheid, maar dit is weer omslachtig, omdat je dan ook een smartcardlezer nodig hebt. De Nitrokey combineert dezelfde veiligheid als een smartcard met het gebruiksgemak van een usb-stick.

Auteur: Koen Vervloesem

Als je op een veilige manier wilt inloggen op een Linux-server, krijg je altijd het advies om geen wachtwoord te gebruiken, maar een publieke sleutel. Je creëert op je PC dan een geheime sleutel en bijbehorende publieke sleutel en uploadt die publieke sleutel naar je server. De geheime sleutel houd je op je PC. Daarna stel je de OpenSSH-server op je Linux-server zo in dat je gebruiker alleen nog maar kan inloggen als hij kan bewijzen dat hij de eigenaar is van de geheime sleutel.

Allemaal goed en wel, maar de veiligheid van dit systeem hangt af van het geheim houden van de geheime sleutel. En als je die op je PC aanmaakt en de hele tijd op de PC laat staan, dan hoeft er maar ergens malware of een (fysieke of virtuele) inbreker toegang te krijgen tot je sleutelbestand en dan ben je gecompromitteerd. Bovendien zou je op elke PC waarmee je op je server wilt inloggen je geheime sleutel moeten zetten. Dat is een groot risico.

Hardwaresleutel

De Nitrokey (https://www.nitrokey.com/) van het gelijknamige bedrijf uit Duitsland biedt een oplossing. Je slaat je geheime sleutels voor ssh, pgp, s/mime en zelfs de seeds voor eenmalige wachtwoorden in het kleine usb-stickje op en daar komen ze op geen enkel moment uit. Met een open interface en open source software kan je je bestaande authenticatiesoftware met de Nitrokey laten samenwerken. Het genereren van geheime sleutels en berekeningen ermee gaat in de Nitrokey zelf.

Het apparaatje is met een pincode beveiligd en is ook beschermd tegen brute-force aanvallen. Niet alleen de software, maar ook de firmware en de hardware zijn open source (op https://github.com/nitrokey vind je alle code en schema’s). Eén van de versies van de Nitrokey heeft ook een onafhankelijk beveiligingsassessment doorstaan. Wij hebben de Nitrokey Pro 2 (€49,-) op Ubuntu 19.04 getest. Er zijn ook nog andere modellen, bijvoorbeeld met versleutelde opslag erbij of met ondersteuning voor FIDO U2F.

Installatie

De Nitrokey is eigenlijk een OpenPGP-smartcard in het formaat van een usb-stick. Om toegang tot de smartcard te krijgen, dien je dus eerst het pakket libccid te installeren:

sudo apt install libccid

Installeer daarna de Nitrokey App:

sudo apt install nitrokey-app

Het pakket zit in de standaardrepository van Ubuntu vanaf versie 18.04. Kijk op https://www.nitrokey.com/download voor andere distributies of oudere versies van Ubuntu.

Steek dan de Nitrokey in je computer. Als alles goed is, start de Nitrokey App nu automatisch op en krijg je onderaan even de melding “Nitrokey Pro connected”.

Pincode

De Nitrokey kent twee pincodes. Met de User PIN ontgrendel je de Nitrokey en onderteken en versleutel je data. De dagelijkse taken zeg maar. De Admin PIN heb je nodig voor beheertaken, zoals het genereren van sleutels of het inladen van sleutels die je extern gegenereerd hebt. Als je drie keer de verkeerde User PIN intypt, wordt de interne smartcard van de Nitrokey geblokkeerd. Je kunt dan alleen een nieuwe pincode kiezen door de Admin PIN in te typen. En als de Admin PIN drie keer verkeerd intypt, wordt de smartcard onklaar gemaakt. Je Nitrokey is dan onbruikbaar en de erin opgeslagen sleutels zijn onbereikbaar.

De stick heeft standaard als User PIN 123456 en als Admin PIN 12345678. Het eerste wat je moet doen, is in het menu van Nitrokey App op Configure klikken en dan achtereenvolgens Change Admin PIN en Change User PIN kiezen. De Admin PIN dient minstens 8 cijfers lang te zijn (maximum 20) en de User PIN minstens 6 cijfers (eveneens maximum 20).

De pincodes voor de beheerder en gebruiker beschermen je Nitrokey tegen ongeoorloofd gebruik.

 

GnuPG

Overigens hoef je hiervoor niet de Nitrokey App te gebruiken. Je kunt het ook met GnuPG doen (na de installatie met sudo apt install gnupg2), omdat de Nitrokey zich als smartcard aanbiedt. Je kunt de status altijd opvragen met:

gpg --card-status

En de smartcard bewerken met:

gpg --card-edit

Daarna open je met de opdracht admin de beheermodus en met passwd kun je de User PIN of Admin PIN veranderen.

Met list krijg je enkele gegevens van je Nitrokey te zien. Je kunt er enkele instellen, bijvoorbeeld name, sex en lang. Met quit sla je de wijzigingen op.

GnuPG herkent de Nitrokey gewoon als een smartcard.

 

Sleutels genereren

Dan is het nu tijd om de eerste OpenPGP-sleutel te genereren. Start GnuPG weer op:

gpg --card-edit
admin
key-attr

De opdracht key-attr voeren we in, omdat GnuPG op onze Nitrokey standaard 2048-bits rsa-sleutels aanmaakt en we willen veilige 4096-bits rsa-sleutels. Kies daarom achtereenvolgens voor zowel de signature key, encryption key als authentication key.

Daarna genereren we onze sleutels met de zojuist ingestelde eigenschappen:

generate

 

Je krijgt eerst de vraag om een reservekopie te maken van de encryptiesleutel. Antwoord hier ‘nee’ op, want dit maakt alleen maar een reservekopie van de encryptiesleutel, maar niet van de ondertekeningssleutel en authenticatiesleutel. Wil je een reservekopie van alle sleutels, dan dien je ze op een (liefst offline) computer te genereren en dan in de Nitrokey te importeren. Instructies daarvoor vind je op https://www.nitrokey.com/documentation/openpgp-create-backup.

Daarna dien je je User PIN in te typen, waarna je de geldigheidsduur van de publieke sleutel dient te kiezen. Standaard verloopt je sleutel nooit, maar dat is niet aan te raden. Vul bijvoorbeeld 1y in voor een geldigheid van een jaar. Geen nood, je kunt de geldigheid op elk moment later uitbreiden.

Vul daarna je naam, e-mailadres en toelichting (van de sleutel) in. Na je bevestiging genereert de Nitrokey je sleutel. Dat duurde bij ons zeker tien minuten, omdat we voor 4096-bits sleutels kozen. Als dit voltooid is, krijg je de melding dat er een revocation certificate opgeslagen is voor als je ooit je sleutel wilt intrekken. Bewaar dit goed voor als dat ooit nodig is!

Sleutelparen

Als je nu de opdracht list uitvoert, krijg je meerdere sleutelparen te zien: een signature key, encryption key en authentication key. Je krijgt ook bij ‘General key info’ je key ID te zien. Dat is het ID waarmee je bijvoorbeeld je publieke sleutel naar een keyserver kunt uploaden, zoals:

gpg --keyserver pgp.surfnet.nl --send-key 5FD858A76F6B2C24

 

Zodra je publieke sleutel op een keyserver staat, kun je de URL van de keyserver ook in de Nitrokey opslaan:

gpg --card-edit
admin
url

 

Vul nu de URL van de keyserver in, bijvoorbeeld https://pgp.surfnet.nl/pks/lookup?op=get&search=0x5FD858A76F6B2C24 of de URL op je eigen server.

Als je daarna je Nitrokey voor het eerst op een andere computer gebruikt, dan kun je de publieke sleutel daar eenvoudig importeren met:

gpg --card-edit
fetch

 

Je kunt nu gewoon met GnuPG bestanden ondertekenen, verifiëren en versleutelen, allemaal met gebruik van de sleutels op je Nitrokey. Met gpg –list-keys verifieer je of je GnuPG-keyring je sleutels kent.

Inloggen met ssh

De Nitrokey is niet alleen handig voor GnuPG, maar ook als je via ssh op een server wilt inloggen. Dat doen we via GnuPG agent. Installeer dit eerst:

sudo apt install gnupg-agent

Voeg de volgende regel toe aan ~/.gnupg/gpg.conf:

use-agent

En voeg dan ssh-ondersteuning toe aan ~/.gnupg/gpg-agent.conf (dat bestand dien je wellicht nog aan te maken) met de volgende regel:

enable-ssh-support

Plaats daarna de volgende regels in je ~/.bashrc:

unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
  export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi

 

Sluit een draaiende GnuPG agent af met:

pkill gpg-agent

 

En open dan een nieuwe terminalsessie. Nadat je gpg –card-status uitgevoerd hebt, is de GnuPG agent weer opgestart. Exporteer dan de authenticatiesleutel van je Nitrokey in de vorm van een publieke ssh-sleutel:

gpg --export-ssh-key 5FD858A76F6B2C24

 

Log nu op je server in en plak de uitvoer van de vorige opdracht in het bestand ~/.ssh/authorized_keys. Log uit en als je nu opnieuw inlogt, krijg je de vraag om de pincode van je Nitrokey in te typen en word je daarna in ssh ingelogd via de geheime sleutel op je Nitrokey. Als dit werkt, kun je op je server in /etc/ssh/sshd_config de volgende regel zetten, zodat je alleen nog maar met de Nitrokey kunt inloggen en niet met een klassiek wachtwoord:

PasswordAuthentication No

Nog veel meer mogelijkheden

Naast GnuPG ondersteunt de Nitrokey via OpenSC ook PKCS#11. En dat is handig, omdat je daarmee ook S/MIME-gebaseerde e-mailencryptie in Thunderbird met Enigmail kunt doen en authenticatie via een clientcertificaat in Firefox.

Helaas werken OpenSC en GnuPG niet goed samen, wat tot moeilijk te debuggen problemen kan leiden. Bovendien werkt een Nitrokey die met OpenSC geïnitialiseerd is niet met GnuPG; wel andersom. Als je jouw Nitrokey dus zowel met GnuPG als met PKCS#11 wilt gebruiken, creëer dan eerst de sleutels met GnuPG zoals we in dit artikel hebben gedaan.

Op https://www.nitrokey.com/documentation/applications vind je alle mogelijke toepassingen waarmee je de Nitrokey kunt integreren. Zo kun je ook met LUKS, EncFS of Veracrypt versleutelde opslag met je Nitrokey ontgrendelen en via de PAM-module Poldi lokale aanmeldingen via je Nitrokey laten verlopen.

Nitrokey App

Tot slot komen we nog even terug op de Nitrokey App waarmee we in het begin van dit artikel de pincodes hebben aangepast. Hiermee kun je jouw Nitrokey als een apparaatje voor eenmalige wachtwoorden gebruiken volgens de standaarden HOTP en TOTP. Google, Microsoft, Nextcloud en talloze andere webdiensten maken hiervan gebruik. Je vult dan in het tabblad ‘OTP Slot Configuration’ de geheime sleutel in die je bij het opzetten van tweefactorauthenticatie krijgt, de naam van de website en eventueel enkele parameters voor het algoritme.

Als je nu op die website met tweefactorauthenticatie wilt inloggen en je de vraag om de eenmalige code krijgt, ga je in de Nitrokey App naar Menu / Passwords en klik je daar op de naam van de dienst. De eenmalige code wordt dan naar het klembord gekopieerd en plak je dan eenvoudigweg in het tekstveld van de website, waarna je ingelogd bent. En dat allemaal veel veiliger dan met een app op je smartphone. Standaard dien je bovendien eerst de User PIN in de Nitrokey App in te voeren, voordat je een eenmalige code krijgt. In het tabblad ‘OTP General’ pas je dat aan. Je kunt 15 TOTP-slots en 3 HOTP-slots opslaan en in het tabblad ‘Password Safe’ kun je 16 statische wachtwoorden opslaan die je op dezelfde manier benadert in het menu Menu / Passwords.

Je kunt ook geheime sleutels voor eenmalige codes opslaan in de Nitrokey.
Share
May 2024
June 2024
No event found!

Related Topics