· · 8 min leestijd Beginner

Pass: de unix password manager die gewoon werkt

Pass is een minimalistische password manager voor de command line. Leer hoe je snel aan de slag gaat en ontdek geavanceerde features zoals git sync en browserintegratie.

Een houten la met verzegelde enveloppen die ze met één touwtje opent naast de abonnementskluis van een wolk-wezen

TL;DR pass bewaart elk wachtwoord als een GPG-versleuteld bestand in een directory, en die directory ís het datamodel. pass -c email/gmail zet een wachtwoord vanuit elke terminal in je clipboard, pass git push maakt 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 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.

“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: