Der Passwortmanager#

Das Netz ist voll mit verschiedenen Lösungen zum Passwortmanagement. Das ist Nachvollziehbar, denn wir haben immer mehr Accounts und niemand merkt sich eine dreistellige Anzahl an Passwörtern freiwillig. Kommen wir also gleich zur Sache:

Ich habe mir aus dem ganzen Wust drei Passwortmanager nach meinen Kriterien (Sicher, komfortabel, quelloffen, selbstverwaltbar) angesehen und wollte hieraus eine Wahl treffen:

Kein Firefox Password manager#

Firefox schied aus, da ich zum Entsperren meinen Hardware Security Key verwenden und mir kein langes Hauptpasswort merken möchte. Dafür sprachen hingegen die sehr einfache Verwendung, das automatische Ausfüllen von Passwortfeldern und die Möglichkeit der Synchronisation, wenn auch über eine fremde Infrastruktur.

Kein Vaultwarden#

Vaultwarden hatte ich lange im Visier. Es benötigt für den Betrieb im lokalen Netzwerk viele Vorbedingungen und Software drum herum, Stichworte HTTPS im LAN, ACME-Challenge. Daher ist im LAN ein eigener kleiner Rechner vorzusehen und idealerweise verfügt man sogar über einen virtuellen pricaten Server, der den HTTPS-Verkehr terminieren kann.

Dafür unterstützt Vaultwarden dann sogar die super bequeme Anmeldung per Passkey und kann die Passwortdatenbank zwischen allen Geräten im Netzwerk synchronisieren.

Doch am Ende scheute ich die aufwendige Einrichtung und die neuen Abhängigkeiten und Softwarepakete, die ich alle hätte zusätzlich warten müssen.

KeePassXC#

Ich habe mit verschiedenen Varianten von KeePass herumgespielt und mich am Ende für KeePassXC entschieden. Das Gesamtpaket fühlt sich einfach runder und moderner an, ich kann die Software betriebssystemunabhängig nutzen und die benötigten Erweiterungen zur Verwendung mit HSKs sind auch gleich dabei.

Einrichtung von KeePassXC mit einem HSK#

Image: KeePassXC create new database screen. There is a main password field, a security key field to protect with a local/remote key file, and a Challenge-response field to work with Hardware Security Keys.
KeePass verwendet das keyed-hash message authentication code oder HMAC-Verfahren zum Entsperren der Passwortdatenbank unter Verwendung von Hardware Security Keys. Es basiert auf einem gemeinsamen geheimen Schlüssel, der bei beiden Parteien vorliegen muss, aber nicht zwischen den Parteien ausgetauscht wird.

Üblicherweise erstellt man den geheimen Schlüssel auf dem Hardware Security Key und kopiert ihn dann in die Eingabemaske von KeePassXC - aber der Reihe nach, denn der Vorgang hängt ein wenig vom verwendeten HSK ab.

Yubikey#

Yubico hat eine Anleitung eigens für die Verwendung mit KeePass vorbereitet. Ein Yubikey hat zwei variabel verwendbare Slots, welche verschiedene kryptografische Funktionen unterstützen. In der Funktionsauswahl ist Challenge-response: program a challenge-response credential anzuwählen. Anschließend erzeugt der Yubikey einen 20-byte HEX code, welcher anschließend nach KeePassXC kopiert werden kann.

Wichtig dabei ist, dass der angezeigte Code später nicht mehr extrahiert werden kann. Soll die Datenbank also einen Zweitschlüssel bekommen (was anzuraten ist), so muss der Code notiert und anschließend ebenfalls im Zweitschlüssel hinterlegt werden.

Ich empfehle beim Yubikey, das Häkchen bei requires touch wegzulassen. Ansonsten muss man bei jeder Verwendung eines Passwortes den Yubikey berühren. Viel nerviger noch ist, dass für das Hinzufügen oder Ändern eines Passworteintrages ebenfalls ein Berühren des Schlüssels notwendig wird.

Nitrokey#

Nitrokey sieht die Erzeugung des Geheimnisses als 20-byte base32 code vor. Er kann genau ein HMAC-Geheimnis aufbewahren. Auch Nitrokey hat eine Anleitung zum Hinterlegen des HMAC-Secrets für die Verwendung mit KeePassXC online. Wie bei Yubikey auch basiert diese Anleitung auf der Verwendung der App.

Kompatibilität Yubikey - Nitrokey#

Idealerweise würde ich nun den auf dem Yubikey erzeugten Schlüssel auf dem Nitrokey hinterlegen oder umgekehrt. So hätte ich einen Zweitschlüssel und könnte mit beiden auf die KeePassXC-Datenbank zugreifen.

Doch oh weh, der Nitrokey akzeptiert das Geheimnis des Yubikey nicht:

Image: The Nitrokey app, being confronted with a Yubikey HMAC secret, returns the error message 'Secret is not in base32.' and cannot save the key

Genau so verhält es sich, wenn ich ein mit dem Nitrokey erzeugtes Geheimnis auf dem Yubikey hinterlegen will:

Image: The Yubikey app, being confronted with a Nitrokey HMAC secret, returns the error message 'Invalid format, allowed characters: 0123456789abcdef' and cannot save the key

Hierfür benötige ich Abhilfe. Ich erstelle also ganz pragmatisch eine zweite Passwortdatenbank. Beide sollen denselben Inhalt haben, verwenden aber verschiedene Schlüssel zum Öffnen. Später lerne ich, dass das gar nicht nötig ist; dennoch hier erstmal meine provisorischen Lösungen.

Holzweg A: Einträge aus der Datenbank klonen#

Ich befülle die erste Datenbank mit Passwörtern, welche ich in Gruppen sortiere. Anschließend klone ich die Gruppe, öffne die zweite Datenbank und ziehe den Klon per drag-and-drop herüber.

Nachteile: Ich muss den Vorgang für jede Gruppe wiederholen, denn drag-und-drop für die root-Gruppe ist nicht vorgesehen. Bei jeder Änderung in Datenbank_yubikey muss ich Datenbank_nitrokey ebenfalls anpassen.

Das ist sehr anstrengend, wenn die Datenbank sich noch im Aufbau befindet.

Holzweg B: Die ganze Datenbank kopieren und HMAC updaten#

Hierfür speichert man die HMAC-Secrets der beiden Hardware Security Keys im Passwortmanager ab. Bei einer Änderung der Datenbank fertigt man eine Kopie der Datenbankdatei an, öffnet sie und kopiert sich das Secret des jeweils anderen HSK. Nun klickt man auf Database->Database Security->Change Challenge-Response und gibt das Secret dort ein. Schon funktioniert die Datenbank mit dem anderen Schlüssel.

Nachteil: Manuelle Aktualisierung beider Datenbanken erforderlich. Jedes mal ist challenge-response neu einzurichten.

Lösung: Konvertieren des HMAC-Secrets#

Ich fragte mich, ob ich für den Nitrokey zur Speicherung des HMAC-Geheimnisses für meinen Nitrokey auch die Kommandozeile statt der App verwenden kann. Kommanodzeilenanwendungen wie nitropy verfügen meist über mehr Optionen als ihr GUI-App-Pendant. Vielleicht kann ich damit das Kompatibilitätsproblem lösen. Hier der Link zur Installation von nitropy.

Auf der Suche nach einer geeigneten Dokumentation stoße ich auf diesen interessanten Post zum Thema challenge-response. Dort wird mir klar, was softwareaffine Leute schon lange wissen. Zumindest, falls sie entweder mal das Thema Kryptografie gestreift haben oder nahe an der Hardware unterwegs sind:

Daten der Größe von 20 Byte lassen sich in hex mit 40 Zeichen UND in base32 mit 32 Zeichen darstellen.

Folglich lässt sich ein HMAC-Geheimnis konvertieren und damit sowohl auf dem Yubikey als auch auf dem Nitrokey ablegen. Dafür verwende ich das kleine Werkzeug xxd und lasse mir aus dem Hexcode des Yubikey eine base32-Phrase für meinen Nitrokey erzeugen.

# open a new terminal
# make sure the secrets are not saved to history (command for zsh)
history -p 
# c0ffee = secret hex key
# xxd convert input to binary (-r), output as plain hexdump (-p)
# interpret as base32 string
echo -n 'c0ffee' | xxd -r -p | base32
YD764===
# close terminal

Alternativ funktioniert auch der Rückweg:

# open a new terminal
# make sure the secrets are not saved to history (command for zsh)
history -p 
# YD764=== = secret base32 key
echo -n 'YD764===' | base32 -d | xxd -p
c0ffee
# close terminal

KeePassXC: Passwörter schön geordnet hinterlegen#

Verzichtet man wie ich auf Dialoge wie “mit Google einloggen” bei Drittanbietern, so sammeln sich im Laufe des Lebens unter Umständen eine Menge Passwörter an. Zum vereinfachten Finden und verwenden der Passwörter sowohl mobil als auch auf dem Desktop bietet es sich an, sinnvolle Gruppen zu erstellen.

Passwortfamilien#

Nach ein paar Experimenten hat sich folgendes Schema für Titel bewährt, wenn ich mehrere verwandte Passwörter speichern möchte:

baseapp.attribute.specialization

So würde aus den Zugängen für mein gehärtetes Gitea-setup:

gitea.login.schallbert
gitea.login.testuser
gitea.runner.registration
gitea.recoverykey

Auf diese Weise bleiben verwandte Passwörter schön beisammen.

Gruppierung#

Ich halte folgende Gruppen von Passwörtern für sinnvoll:

GroupDescription
DevicesComputer, phone, router, keys
FinanceBanks, credit cards, insurances, payment
IdentityEmail, identity providers, single sign-in
ShoppingOnline stores, streaming, subscriptions
GamesPlatforms, launchers, servers
SocialForums, Messengers, Social networks
BackupRecovery keys, licenses, passphrases

Dabei achte ich darauf, nicht zu viele Untergruppen zu erstellen. Gerade in der Mobilansicht ist man sonst schnell verwirrt.

Image: KeePassXC app with unlocked database. We see different groups of passwords and single entries, each arranged nicely with a logo/symbol image.

Icons 🔑#

KeePassXC bietet die wunderbare Möglichkeit, Favicons der Zielwebsite herunterzuladen und als Symbol zu verwenden. Damit gelingt die Navigation im Passwortmanager noch einfacher.

Die Favicons sind allerdings alles Bitmaps. Möchte man hochqualitative Vektorgrafiken verwenden bietet sich an, unter “Choose Icon” den Pfad eines Icon Packs anzugeben. Ich habe mir dafür die Aegis icons heruntergeladen und bin damit sehr zufrieden.