TL;DR pass bewaart elk wachtwoord als een GPG-versleuteld bestand in een directory, en die directory ís het datamodel.
pass -c email/gmailzet een wachtwoord vanuit elke terminal in je clipboard,pass git pushmaakt de backup, en het fzf-script verderop is hoe ik elk wachtwoord dat ik heb opzoek. De prijs is GPG-keymanagement, en die prijs is echt.
Ik heb jarenlang KeePass gebruikt. Daarna 1Password. Daarna Bitwarden. Allemaal prima tools, en elk ervan was te veel voor wat ik ervan vroeg. Te veel UI, te veel features, en een wachtwoord zat altijd aan de andere kant van een app waar ik eerst naartoe moest alt-tabben. Een kleine onderbreking, en die telden op.
Toen vond ik pass. Het slaat wachtwoorden op. Dat is de hele featurelijst. Ik neem je mee zoals ik het zelf leerde, van het ene commando dat me overhaalde tot de setup die ik nu draai.
Bestanden in een directory, versleuteld
Pass noemt zichzelf de “standard unix password manager.” Onder de motorkap is het een shellscript van zo’n 700 regels dat elk wachtwoord opslaat als een GPG-versleuteld bestand in een directory. Geen database. Geen eigen bestandsformaat. Geen cloudsync eraan geplakt. Klein genoeg om op een middag helemaal door te lezen, en dat telt voor mij. Gaat er iets stuk, dan wil ik kunnen achterhalen waarom.
~/.password-store/
├── email/
│ ├── gmail.gpg
│ └── protonmail.gpg
├── social/
│ └── github.gpg
└── work/
├── gitlab.gpg
└── jira.gpg
Elk .gpg-bestand is een versleuteld tekstbestand met een wachtwoord en, als je wilt, wat extra regels. De directorystructuur is je indeling, en meer valt er niet te leren.
In vijf minuten werkend
Installeren
# macOS
brew install pass gnupg
# Debian/Ubuntu
sudo apt install pass gnupg
# Arch
sudo pacman -S pass gnupg
Een GPG-key
Pass versleutelt met GPG, dus je hebt een key nodig. Heb je er nog geen:
gpg --full-generate-key
Kies RSA, 4096 bits, en vul je naam en e-mail in. Onthoud die passphrase. Je typt ’m bij elk wachtwoord dat je ontsleutelt, en niemand kan ’m voor je terughalen.
De store aanmaken
# Gebruik je GPG key ID of email
pass init "tom@example.com"
Dit maakt ~/.password-store/ aan, met een .gpg-id-bestand dat vastlegt welke GPG-key in gebruik is.
Je eerste wachtwoord
# Genereer een nieuw wachtwoord
pass generate email/gmail 24
# Of voeg een bestaand wachtwoord toe
pass insert social/github
Dat is de hele setup. Je hebt een werkende password manager.
En weer terughalen
# Toon wachtwoord in terminal
pass email/gmail
# Kopieer naar clipboard (verdwijnt na 45 sec)
pass -c email/gmail
Dit was het moment dat het klikte. Geen app om te starten, geen extensie die wakker moet worden. Eén commando en het wachtwoord staat in m’n clipboard.
Waarom het in een terminal-dag past
Ik leef in een terminal, en pass vraagt me nooit om die te verlaten. Werkwachtwoord nodig:
pass -c work/gitlab
Klaar. Dertig seconden in m’n clipboard en dan is het weg.
Omdat de store gewoon bestanden in een directory is, krijg je een paar dingen gratis. Zoeken kan, met pass find gitlab of gewoon ls ~/.password-store/. Scripten kan, dus pass show -c $(pass find jira | head -1) werkt. En het hangt aan alles wat een commando kan draaien: dmenu, rofi, fzf, Alfred, je eigen scripts.
Een .gpg-bestand kan meer bevatten dan een wachtwoord. De afspraak is dat de eerste regel het wachtwoord is en alles daarna metadata.
pass edit email/gmail
SuperSecurePassword123!
---
username: tom@gmail.com
url: https://mail.google.com
otp: otpauth://totp/Gmail:tom@gmail.com?secret=JBSWY3DPEHPK3PXP
notes: recovery email is backup@proton.me
Ook TOTP-codes (2FA) haal je er zo uit:
# Met pass-otp extensie
pass otp email/gmail
Git-sync, het deel dat de doorslag gaf
Pass heeft git ingebouwd, en dit is waarom ik gestopt ben met naar andere password managers kijken.
# Initialiseer git repo
pass git init
# Elke wijziging wordt automatisch gecommit
pass generate new/password 20
# → [master 1a2b3c4] Add generated password for new/password.
# Push naar remote
pass git push
Je password store is nu een git-repository. Dat geeft je automatische backups naar je remote, sync tussen machines met een simpele pass git pull, een versiegeschiedenis van elk wachtwoord, en merge conflicts als je hetzelfde wachtwoord op twee machines wijzigt. Op die laatste kom ik terug.
De mijne staat in een private repo op m’n eigen Forgejo. Een nieuwe machine is één clone:
git clone git@forgejo.example.com:tom/password-store.git ~/.password-store
Elk wachtwoord, terug. Geen vendor die in die pull zit.
Browserintegratie
“Maar ik wil toch auto-fill in m’n browser.”
Dat kan. Er zijn extensies voor Firefox en Chrome:
- Browserpass - native messaging, werkt goed
- passff - alleen Firefox, ook solide
Browserpass leest je store, matcht de URL met je directorynamen en vult het formulier in. Werkt beter dan ik verwachtte.
~/.password-store/
├── github.com/
│ └── tom.gpg # auto-matched op github.com
├── gitlab.com/
│ └── work.gpg
└── mail.google.com/
└── personal.gpg
Fuzzy zoeken met fzf
Dit gebruik ik elke dag. Een klein script:
#!/bin/bash
# passfzf - fuzzy find and copy password
password=$(find ~/.password-store -name "*.gpg" | \
sed 's|.*/\.password-store/||; s|\.gpg$||' | \
fzf --height 40% --reverse)
[[ -n "$password" ]] && pass -c "$password"
Hang het aan een hotkey en je hebt fuzzy opzoeken in één toetsaanslag. Werk je liever in rofi, dan doet rofi-pass hetzelfde:
rofi-pass
Teams en extensies
Multi-key-encryptie
Wachtwoorden delen met een team? Pass slikt meer dan één GPG-key:
pass init key1@example.com key2@example.com
Nu kunnen beide keys alles ontsleutelen. Per directory andere keys kan ook:
# Alleen jij hebt toegang tot personal/
echo "your-key-id" > ~/.password-store/personal/.gpg-id
# Het hele team heeft toegang tot shared/
echo -e "key1\nkey2\nkey3" > ~/.password-store/shared/.gpg-id
pass init
Drie extensies die ik gebruik
Pass heeft een extensiesysteem. pass-otp voegt TOTP en HOTP toe:
# Voeg OTP toe
pass otp insert email/gmail
# Plak de otpauth:// URL
# Genereer code
pass otp email/gmail
# → 482193
pass-tomb wikkelt de hele store in een Tomb-container, voor als iemand fysiek bij je machine kan:
pass tomb open
# doe je ding
pass tomb close
pass-update roteert wachtwoorden in bulk:
pass update -l 32 work/*
Het nadeel heet GPG
Pass is simpel omdat het op GPG leunt, en GPG-keymanagement is allesbehalve simpel. Dat is de rekening voor een password store die van jou is, en die geef ik je liever nu dan dat je ’m later zelf vindt.
Key kwijt, alles kwijt
Verlies je je private GPG-key, dan gaat elk wachtwoord mee. Definitief. Geen “wachtwoord vergeten”-link, geen supportdesk die je eruit graaft.
Dus backup die key op meer dan één plek. Onthoud je passphrase, en op papier in een kluis is een prima zet. En overweeg een hardware-key zoals een YubiKey. Alle drie doe ik zelf, en m’n setup staat onderaan.
GPG werkt tegen
GPG is krachtig en berucht onvriendelijk. Deze fouten ga je tegenkomen:
gpg: decryption failed: No secret key
gpg: problem with the agent: No pinentry
gpg: public key not found
Heb je GPG nog nooit gebruikt, dan is de leercurve steil. Pinentry-popups die niet verschijnen, agents die hangen, keys die zoek raken. Ik heb er avonden aan verloren, en dat zeg ik je vooraf.
Geen officiële mobile app
Een officiële pass-app is er niet. Van derden wel. Op Android werkt Password Store goed en synct via git. Op iOS doet Pass for iOS ook git-sync. Geen van beide is zo gepolijst als 1Password of Bitwarden op een telefoon. Je moet eerst git-credentials instellen en je GPG-key importeren, en dat kost tijd.
Geen wachtwoord delen via een link
“Deel dit wachtwoord even met een collega” is geen feature. Multi-key-encryptie werkt, maar dan moet iedereen een GPG-key hebben. Voor een snelle share met iemand zonder technische achtergrond is pass de verkeerde tool.
Merge conflicts in versleutelde bestanden
Git-sync is geweldig tot je hetzelfde wachtwoord op twee machines wijzigt en een merge conflict krijgt in een bestand dat git niet kan lezen. Dat oplossen is geen pretje. Het gebeurt zelden als je pass git pull doet voordat je iets wijzigt, maar het kan.
Wanneer pass de juiste keuze is
Je zit graag in de terminal. Je gebruikt al GPG, of je wilt het wel leren. Je wilt je data in eigen hand, zonder cloud tenzij jij die kiest. Je wilt wachtwoorden in scripts kunnen gebruiken. En je wilt iets dat je kunt nalezen, zo’n 700 regels bash. Is dat jij, dan past pass.
Wanneer je iets anders moet kiezen
Je deelt wachtwoorden met familie of collega’s zonder GPG. Je wilt een gepolijste telefoon-app zonder setup. Je hebt geen zin in GPG-keymanagement, punt. Of je organisatie schrijft een password manager voor vanwege compliance. Dan Bitwarden of 1Password, en daar is niks mis mee.
Mijn setup
Wat ik nu draai:
# ~/.zshrc
export PASSWORD_STORE_DIR="$HOME/.password-store"
export PASSWORD_STORE_CLIP_TIME=30
# Fuzzy find alias
alias p='passfzf'
# Quick copy
alias pc='pass -c'
De store staat in een private repo op m’n eigen Forgejo, gesynct tussen laptop, desktop en telefoon met git. De GPG-key zit op een YubiKey, met een backup op een air-gapped machine.
Is het meer setup dan Bitwarden? Ja. Het koopt me een workflow die de terminal nooit verlaat, m’n data op m’n eigen schijf, en geen vendor die volgend kwartaal de prijs verhoogt of de tent verkoopt.
Na drie password managers
Pass past bij mensen die van de Unix-filosofie houden, één ding goed doen en aan de rest vastknopen. De GPG-afhankelijkheid alleen al sluit een hoop mensen uit, en dat zeg ik liever hardop dan dat ik het aan de verkeerde lezer verkoop.
Voor mij was het een verademing na elke overengineerde manager ervoor. Zo’n 700 regels bash, bestanden in een directory, git voor de sync. Drie password managers met een UI, en toen een shellscript. Op dat shellscript zit ik nog.
Meer lezen:
- passwordstore.org - officiële site
- pass git repo - broncode
- Browserpass - browserextensie
- Password Store (Android) - Android-app
