Workshop: Raspberry Pi met Bitwarden als wachtwoordkluis

Noud van Kruysbergen
0

Inhoudsopgave

    Het bedenken en onthouden van een uniek en veilig wachtwoord voor elk account is een vrijwel onmogelijke taak, maar in deze workshop laten we zien hoe Bitwarden met de Raspberry Pi dienst doet als wachtwoordkluis en -server. Hij synchroniseert toegangs­gegevens tussen meerdere apparaten zonder dat je je database in vreemde handen hoeft te geven.

    Voor veel internetgebruikers stapelen de toegangsgegevens tot portals en diensten zich op tot een gevaarlijke berg. Het bedenken en onthouden van een uniek en veilig wachtwoord voor elk account is een vrijwel onmogelijke taak.

    De beloftes van wachtwoordmanagers

    Wachtwoordmanagers beloven je te helpen, maar die hangen meestal aan hun eigen cloud en synchroniseren de wachtwoordverzameling tussen meerdere apparaten vaak alleen als je daar een maandelijks bedrag voor betaalt. Bovendien moet je een hoge mate van vertrouwen hebben in de betreffende aanbieder, de virtuele bos sleutels wordt namelijk bewaard in een kluisje van een ­externe ­derde partij.

    workshop bitwarden raspberry wachtwoordkluis

    Opensource wachtwoordmanager Bitwarden

    De opensource wachtwoordmanager Bitwarden kun je in ieder geval zelf hosten. Bitwarden bestaat uit twee delen:

    1. de server, die de wachtwoorden beheert en verstrekt
    2. de clients, die ze opvragen.

    Het communityproject Bitwarden_RS heeft een afgeslankte versie van de officiële Bitwarden-­server gemaakt die de Bitwarden-API implementeert.

    Daarmee kan een Raspberry Pi de rol van wachtwoordserver op zich nemen terwijl hij compatibel blijft met de officiële Bitwarden-applicaties.

    Minimaal Raspberry Pi 3 & toegang tot commandline nodig

    Je hebt daar minstens een Raspberry Pi 3 voor nodig. Of je Raspberry Pi OS gebruikt met een grafische gebruikersinterface voor een monitor met muis en toetsenbord, of verbinding maakt via SSH vanaf een andere computer, mag je zelf bepalen. Voor het installeren heb je alleen toegang nodig tot de commandline.

    Configuratie via Vault en admin-panel

    Na het installeren kun je met meerdere accounts via Bitwarden-clients of een webinterface (web-vault) toegang krijgen tot de server en Bitwarden vanaf elk apparaat met een browser configureren. De ­webinterface omvat een webtoepassing (Vault) waarmee gebruikers hun account kunnen beheren en biedt beheertools via een admin-panel.


    workshop bitwarden raspberry wachtwoordkluis

    Het inlogscherm van de Bitwarden-webinterface). Na het installeren van Bitwarden_RS heb je alleen een browser nodig om op elk moment toegang te hebben tot je wachtwoorden.


    Advies van Bitwarden: Docker-container

    De ontwikkelaars van Bitwarden_RS raden aan om de server op te zetten als een Docker-container. Die oplossing heeft het voordeel dat de wachtwoordmanager niet in de weg zit van andere diensten op de Raspberry Pi.

    Ingrediënten: Reverse-proxy & containerized edgerouter Traefik

    Als ingrediënten voor zo’n installatie hebben de volgende componenten zich bewezen. Om te beginnen is een reverse-proxy de handigste manier om de webinterface en API versleuteld op internet te krijgen.

    De proxy ontvangt verzoeken en levert de gegevens af via een HTTPS-pagina. Bij de volgende voorbeelden gaan we ervan uit dat de TCP-poorten 80 en 443 op de Raspberry Pi nog niet bezet zijn. Daar is de containerized edgerouter Traefik geschikt voor, die de benodigde TLS-certificaten zelf ophaalt en automatisch vernieuwt.

    Voorbeeldbestanden; downloadlinks & naslag

    Docker-compose bespaart je lange docker run-commando’s. De configuraties van de containers worden daarbij in een compose-bestand samen­gevoegd, dat door een .env-bestand met omgevingsvariabelen wordt aangevuld.

    We stellen voorbeeldbestanden beschikbaar in een GitHub-­repository.

    Om ervoor te zorgen dat browsers en clients de Raspberry Pi kunnen aansturen, heb je een vaste hostnaam nodig die naar het WAN-IPv4-adres van de router verwijst. Daar kun je een DynDNS-service voor gebruiken. Die stuurt verzoeken die bij de geconfigureerde DynDNS-hostnaam aankomen door naar het betreffende WAN-IPv4-adres van de router. Het maakt verder niet uit welke DynDNS-service je gebruikt.

    In deze tutorial dient het adres bitwarden.example.com als voorbeeld.


    Blijf op de hoogte van de nieuwste informatie en tips!
    Schrijf je in voor de nieuwsbrief:


    Fase 1: Raspberry Pi OS met Bitwarden voorbereiden

    De eerste stap is om het systeem up-to-date te brengen en met een script de Docker-engine voor de container-runtime-omgeving te installeren. Als het een nieuw systeem is, herstart de Raspberry Pi dan na het toepassen van de updates alvorens Docker te installeren.

    sudo apt upgrade

    sudo reboot

    curl -fsSL https://get.docker.com -o get-docker.sh

    sudo sh get-docker.sh

    Als de Apache2-utilities en de versiebeheertool Git niet op je systeem staan, installeer die pakketten dan ook.

    sudo apt install apache2-utils

    sudo apt install git

    Docker-compose kun je het beste installeren met de Python-pakketmanager ‘pip’.

    sudo apt install python3-pip

    sudo pip3 install docker-compose

    Voor interactie met de Docker-daemon heb je wel systeembeheerdersrechten nodig. Als je daarbij Docker-­commando’s wilt gebruiken zonder daar sudo voor te zetten, moet je gebruiker pi toevoegen aan de groep docker en opnieuw inloggen. Als dat nog niet gebeurd is, is het nu ook een mooi moment om het standaard wachtwoord van de gebruiker pi te veranderen.

    sudo usermod -aG docker pi

    passwd

    De benodigde software is dan geïnstalleerd en ­Docker is klaar voor gebruik.


    Alvorens de containers op te zetten, moet je er echter voor zorgen dat de Rasp­berry Pi – en dus de webinterface en API – bereikbaar zijn vanaf internet.

    Netwerkverkeer dirigeren, vast IP adres

    Om ervoor te zorgen dat de verzoeken betrouwbaar aankomen bij de Raspberry Pi en niet bij een ander netwerkapparaat, moet je een vast IP-adres toe­wijzen. Voer het IP-adres voor de actieve netwerkinterface in bij het bestand /etc/dhcpcd.conf met behulp van een teksteditor. Als de Pi via ethernet met het netwerk verbonden is, selecteer dan de interface eth0 (of wlan0 voor wifi).

    Pas de volgende vier regels in het bestand aan je lokale netwerk aan, bijvoorbeeld zo:

    interface eth0

    static ip_address=192.168.0.184/24

    static routers=192.168.0.1

    static domain_name_servers=192.168.0.1

    • Start het systeem opnieuw op met sudo reboot zodat de wijzigingen toegepast worden.
    • Stel dan portforwarding in de webinterface van je router in.
    • Verzoeken van buitenaf die binnenkomen op TCP-poort 80 en 443 moeten worden doorgestuurd naar de Raspberry Pi en eindigen bij de reverse-proxy Traefik.
    • Selecteer TCP als protocol en voer poort 80 in.
    • Je kunt de service een willekeurige naam geven. Die is vervolgens hetzelfde voor poort 443.

    DynDNS-service naar het huidige WAN-IPv4-adres

    Om de gewenste DynDNS-service naar het huidige WAN-IPv4-adres van de router te kunnen laten ­wijzen, heeft die een bron nodig die hem de ­betreffende informatie verschaft. De meeste moderne routers kunnen die taak op zich nemen.

    Selecteer je provider in het corresponderende menu en voer de gevraagde gegevens, meestal de inlog­gegevens en een update-url, bij het formulier in. Als je DynDNS-provider daar niet bij staat, stel er dan zelf een in.


    Fase 2: de containerarchitectuur

    Transportversleuteling met Traefik

    Na die voorbereidingen is het tijd voor de container­architectuur. Als opslaglocatie voor de containerconfiguraties en compose-bestanden op het Linux-­bestandssysteem ligt de directory /srv voor de hand. Als je daar bestanden naartoe wilt schrijven, moet je werken met sudo of jezelf rootrechten toekennen. Kloon de GitHub-repository naar /srv en ga er dan in.

    sudo git clone https://github.com/ndi-ct/raspi-pwm /srv/raspi-pwm

    cd /srv/raspi-pwm

    Als container-blueprint staat er in de gedownloade repository een YAML-bestand klaar. Dat specificeert welke containerimages uit de Docker Hub geladen moeten worden en worden geconfigureerd.

    Om­gevingsvariabelen worden opgeslagen in het bijbehorende .env-bestand, dat standaard niet wordt weergegeven. Zo nodig kun je daar met ls -a een overzicht van krijgen.

    De reverse-proxy heeft daarnaast nog de bestanden traefik.toml en dynamic.yml nodig, waarin instructies staan voor het verkrijgen van certificaten en het regelen van het netwerkverkeer.


    Open traefik.toml met je favoriete teksteditor en voer een geldig e-mailadres in op de regel mail = “mail@example.com” (de aanhalingstekens moeten blijven staan). Let’s Encrypt stuurt waarschuwingen naar dat mailadres als er problemen zijn met het uitgegeven certificaat.

    Traefik slaat de certificaten, die het automatisch ophaalt met het ACME-­protocol, op in het bestand acme.json. Dat bestand mag alleen voor root leesbaar zijn. Maak een leeg bestand aan met de naam acme.json in de directory config-files en pas de rechten aan.

    sudo touch acme.json

    sudo chmod 600 acme.json

    Maak vervolgens een virtueel netwerk voor de reverse-proxy aan.

    sudo docker network create

    traefik_reverse_proxy


    workshop bitwarden raspberry wachtwoordkluis

    Welkom in je eigen kluis. In de webapp kun je je wachtwoorden beheren en instellingen aanpassen, bijvoorbeeld om tweefactorauthenticatie te activeren.


    Fase 3: beveiligingsinstellingen - kluis dichtmaken

    Ga naar de directory /srv/raspi-pwm. Om een overzicht te krijgen van de containerstructuur, kun je de inhoud van het composebestand laten weergeven met het commando:

    cat docker-compose.yaml

    De images ‘bitwarden_rs/server’ en ‘traefik’ zijn gelabeld met versienummers om je voor onaangename verrassingen te behoeden. Zonder die tag zal Docker altijd de laatste image downloaden van Docker Hub. Dat kan ertoe leiden dat de container plotseling niet meer start omdat de nieuwe versie wijzigingen in de configuratiebestanden vereist.

    Controleer regelmatig op updates voor images

    Controleer regelmatig of er (beveiligings)updates zijn voor je images. Zo ja, vervang dan de oude image door een nieuwe.
    De parameter restart: unless-stopped zorgt ervoor dat de containers ook na een reboot van de Raspberry Pi opnieuw starten – tenzij je een container voordien handmatig gestopt hebt.

    Gegevens opslaan – locatie

    De sectie volu­mes specificeert waar de Bitwarden-container persistente gegevens opslaat:

    volumes:

    – /var/docker/bitwarden:/data

    De directory /data in het containerbestandssysteem komt overeen met /var/docker/bitwarden in het hostbestandssysteem. Daar bevindt zich ook het SQLite-­databasebestand db.sqlite3.

    Regelmatig back-up

    Zorg dat je regelmatig een back-up maakt van de directory /var/docker/bitwarden.

    In het composebestand staan de variabelen ${BITWARDEN_URL}, ${WEBSOCKET_ENABLED} en ${ADMIN_TOKEN}. Docker-compose haalt de waarden uit het .env-bestand. Open het bestand met een teksteditor.

    BITWARDEN_URL=bitwarden.example.com

    WEBSOCKET_ENABLED=true

    ADMIN_TOKEN=

    Zet je DynDNS-adres achter BITWARDEN_URL=. Het adres wordt als host aan Traefik doorgegeven. De regel WEBSOCKET_ENABLED=true zorgt ervoor dat de wachtwoorden en andere items in de kluis gesynchroniseerd worden telkens als ze gewijzigd worden – als de betreffende client dat ondersteunt (LiveSync).


    bitwarden admin panel

    Het adminpanel is het controlecentrum van Bitwarden_RS. Daar heb je toegang tot belangrijke instellingen en kun je de gebruikers beheren.


    Configureren via het admingedeelte

    Het is raadzaam Bitwarden_RS te configureren via het admingedeelte van de webinterface. Om het adminpanel te activeren, voeg je een token toe achter ADMIN_TOKEN=. Daarvoor maak je op de ­commandline een lange string aan met het volgende commando:

    openssl rand -base64 48 | tr -d /=

    Je kunt de ingevoerde token gebruiken om jezelf ­later te authenticeren in het adminpanel van de web­interface. De instellingen die het admin­panel biedt kun je handmatig aanpassen door extra omgevingsvariabelen in te stellen in het .env-bestand en daar naar te verwijzen in het bestand docker-compose.yaml

    De ontwikkelaars van Bitwarden_RS bieden een uitgebreid voorbeeldbestand op de GitHub-wiki van het project, die je via de link kunt vinden. Verwijder in dit geval de regel ­ADMIN_TOKEN= uit het .env-bestand en de betreffende referentie uit het composebestand.


    Extra beveiligd met een basisauthenticatie

    In dit voorbeeld hebben we het adminpanel extra beveiligd met een basisauthenticatie, bestaande uit een gebruikersnaam met een wachtwoord. Daarvoor dient een middleware van de ­reverse-proxyTraefik, die al in het composebestand aangemaakt is. Als je in je browser naar bitwarden.example.com/admin gaat, moet je eerst de inloggegevens invoeren om de pagina te zien en kun je je pas bij de tweede stap met de token als admin authen­ticeren. Je kunt de benodigde inlog­gegevens genereren met het volgende commando:

    htpasswd -nb user password | sed -e s/\$/\$/g

    Dat commando genereert het inlogdatapaar ‘user:password’, waarbij ‘password’ wordt uitgevoerd als een hash. Vervang user en password door veilige inloggegevens. Open daarna het bestand docker-compose.yaml met een teksteditor en vervang ‘user:password’ in de onderstaande regel door de uitvoer van het commando.

    – “traefik.http.middlewares.admin-auth.basicauth.users=user:password”

    Sla tot slot het bestand docker-compose.yaml op en start de beide containers:

    sudo docker-compose up -d

    Docker laadt dan eerst de images uit de container-­registry. De reverse-proxy zorgt voor het certificaat van Let’s Encrypt en levert de webvault en het admin­panel van Bitwarden via het geconfigureerde DynDNS-adres. Geef de containers wat tijd om op te starten. Op een RaspberryPi 4 met 4 GB geheugen neemt de eerste keer opstarten een paar minuten om beslag. Je kunt de status van de containers controleren met het commando docker ps. Zodra de Bitwarden-container de status ‘up x minutes (healthy)’ toont, kun je de webvault oproepen in een browser op bitwarden.example.com. Voor het adminpanel voeg je /admin toe aan de url. Als je ergens een fout hebt gemaakt, zal het commando docker logs gevolgd door de naam van de container helpen bij de diagnose.

    Fase 4: vergrendelen - masterwachtwoord maken

    Registreer een nieuwe gebruiker en maak daar een veilig masterwachtwoord voor aan. Dan kun je ­inloggen in de webvault en je gebruikersaccount instellen. Als je al eerder een andere wachtwoordmanager hebt gebruikt, zul je de weg snel kunnen vinden.

    De categorie ‘Mijn kluis’ bevat items zoals opgeslagen inloggegevens en beveiligde notities, die je kunt markeren als favorieten of sorteren in mappen.

    Onder Hulpmiddelen vind je een wachtwoordgenerator, rapportages over zwakke of gelekte wachtwoorden en de functies om wachtwoordverzamelingen te importeren en exporteren.

    Bitwarden kan overweg met de meest voorkomende formaten (.csv, .json, .xml, .txt). Daar kun je ook je eigen wachtwoorddatabase exporteren. Kies daarvoor bij voorkeur het formaat ‘.json (Encrypted)’, anders exporteert Bitwarden je inloggegevens als leesbare tekst.

    Tweefactor­authenticatie instellen

    Voor het inloggen moet je absoluut tweefactor­authenticatie instellen. Anders zouden aanvallers er eventueel in kunnen slagen om met brute-force toegang te krijgen tot je wachtwoorddata­base. Je kunt de nodige wijzigingen aanbrengen bij de instellingen in het submenu Tweestapsaanmelding.

    Bitwarden_RS biedt tweefactorauthenticatie via 2FA-apps zoals Authy, Duo en Microsoft Authenti­cator, via e-mail en met FIDO-compatibele hardware­matige beveiligingssleutels.

    Menu Tweestapsaanmelding – een herstel­code

    Zodra tweefactorauthenticatie ingesteld is, kun je in het menu Tweestapsaanmelding een herstel­code laten weergeven. Als je bijvoorbeeld je mobiele telefoon verliest en geen toegang meer hebt tot de tweede factor, is de herstelcode de laatste mogelijkheid om nog toegang te krijgen tot je kluis.

    Noteer de code en bewaar hem op een veilige plaats. Als dat scenario zich voordoet, roep dan het adres bitwarden.example.com/#/recover-2fa/ op in de browser en volg de instructies. Als je meteen verschillende methoden voor tweefactorauthenticatie instelt, zul je nooit in die situatie terechtkomen.

    URL staat nog open - nieuwe registraties deactiveren

    Op dat moment kan nog steeds iedereen die de url van je Bitwarden-instantie weet een account aanmaken. Als je dus niet van plan bent een gratis wachtwoordmanager op internet aan te bieden, doe je er goed aan nieuwe registraties te deactiveren.

    Roep het adminpanel op in je browser op bitwarden.example.com/admin.

    We raden je aan enkele instellingen bij het adminpanel te wijzigen om de aanvalsmogelijkheden op je wachtwoordserver te verkleinen:

    • Bij de sectie General moet je de juiste waarde invoeren in het veld ‘Domain URL’, zodat automatisch verzonden e-mails de juiste links bevatten.
    • Verhinder inschrijvingen op de hoofdpagina door het vinkje bij ‘Allow new signups’ weg te halen. De knop en het formulier zullen wel zichtbaar blijven, maar registreren zal niet langer mogelijk zijn.
    • Bij het gedeelte ‘SMTP E-mail Settings’ moet je een uitgaande SMTP-mailserver configureren, zodat Bitwarden mails kan versturen om bijvoorbeeld accounts te verifiëren of om je te informeren als er is ingelogd op je account vanaf een voorheen onbekend apparaat.
    • In het adminpanel kun je andere gebruikers nog steeds via e-mail uitnodigen, ook als het registreren op de hoofdpagina uitgeschakeld is. Wanneer je de wachtwoordserver bijvoorbeeld met vrienden deelt, kun je het beste verhinderen dat zij nog meer gebruikers uitnodigen. Daarvoor verwijder je bij de sectie General het vinkje bij ‘Allow Invitations’.
    • Als dat niet genoeg is, kun je de webvault deactiveren met de omgevingsvariabele WEB_VAULT_ENABLED=false of Bitwarden_RS uitsluitend in het lokale netwerk gebruiken met zelf gegenereerde certificaten. Om dan toch van buitenaf toegang te krijgen tot de wachtwoordserver, zou je een VPN-oplossing moeten gebruiken.

    De ontwikkelaars raden het gebruik van de geïntegreerde ROCKET_TLS-methode voor HTTPS af. In plaats daarvan raden zij aan om privé-instanties te beveiligen met de reverse-proxy Caddy en Let’s Encrypt-certificaten. Een handleiding voor die niet erg simpele procedure is beschikbaar op GitHub in de wiki van het ­project.

    De Pi-kluis met Bitwarden is klaar voor gebruik

    De Pi-wachtwoordserver is dan klaar voor gebruik. Bitwarden_RS biedt veel functies waarvoor je normaal gesproken een Premium-account van Bit­warden nodig hebt. Sommige functies ontbreken echter, zoals LiveSync en pushnotificaties voor iOS en Android, Single-Sign-On en Emergency Access. De ontwikkelaars hebben een lijst van de verschillen met de officiële Bitwarden-server in de wiki van het project gezet.


    bitwarden clients verschillende platformen

    Er bestaan Bitwarden-clients voor verschillende platformen, hier zie je bijvoorbeeld de browser-add-on in Chromium. Om de client toegang te geven tot de wachtwoordserver, heeft hij de url van de server nodig.


    Naast de webvault kun je ook gebruik maken van de Bitwarden-browserextensies en de apps voor Android en iOS om wachtwoorden op te slaan, beheren en synchroniseren. Er zijn desktopclients voor Windows, Linux, macOS, en zelfs tools voor de commandline. Een lijst van alle clients staat op de Bitwarden-­website.

    Verborgen optie

    Om de applicaties te laten communiceren met de server-API op de Raspberry Pi, moet je de url van je Bitwarden-instantie invoeren. De optie daarvoor zit verborgen achter het tandwiel in de linker bovenhoek van het inlogvenster.

    Voorzichtig! Uitlogknop is uitloggen van de server

    Maar wees voorzichtig: de knop ‘uitloggen’ in de clients is misleidend en betekent ‘uitloggen van de server’. Als je je volledig uitlogt en de server-API niet toegankelijk is, zal Bitwarden een nieuwe aanmelding weigeren.

    Om opnieuw in te loggen, moet je verbonden zijn met de server. Kies daarom altijd de optie ‘Nu vergrendelen’ om je gebruikersaccount te vergrendelen, tenzij je van plan bent van gebruikersaccount te wisselen of de client op een andere server aan te melden.

    Dan kun je aan de slag met Bitwarden en de wachtwoordkluis vullen. Wanneer je in de toekomst bijvoorbeeld een inlogpagina op een website bezoekt en inloggegevens invoert, biedt de ­browserextensie aan de inloggegevens in de kluis op te slaan.

    Voor nieuwe aanmeldingen kan de geïntegreerde wachtwoordgenerator willekeurige, veilige wachtwoorden aanmaken. Als de inlog­gegevens al zijn opgeslagen in je kluis, kan Bit­warden auto­matisch inlogformulieren invullen. Je kunt het auto-­fill-gedrag aan je wensen voor verschillende websites aanpassen. Opgeslagen wachtwoorden worden voortaan automatisch gesynchroniseerd.

    Conclusie Raspberry Pi met Bitwarden als wachtwoordserver

    Met Bitwarden_RS kun je je Raspberry Pi veranderen in een wachtwoordkluis met cloudfunctionaliteit, je hoeft je wachtwoordverzameling daar niet voor in vreemde handen te geven.

    Maar het voordeel van vrijheid gaat gepaard met grotere verantwoordelijkheid. Maak dus regelmatig back-ups en controleer de containerimages op beveiligings­updates.

    Als je Bitwarden_RS op de juiste manier gebruikt, vervangt het een betaalde wachtwoordmanager. Bitwarden_RS is ideaal voor gebruik in kleine teams of samen met vrienden of familie.


    Deze informatie is afkomstig uit het artikel van Niklas Dierking en Noud van Kruysbergen, en verscheen eerder in c’t 7, 2021, p42


    Volg meer workshops in c't magazine nov/2021

    Deel dit artikel

    Lees ook

    Netwerken testen met een Raspberry Pi en de tool c’t-net-tester

    Deelt de router geen ip-adressen meer uit of is er een netwerkkabel kapot? Doet de smartphone moeilijk of is er echt geen wifi? Met onze tool c't-net-...

    Raspberry Pi 4 koeling: koeler, behuizing en andere opties

    De Raspberry Pi 4 wordt onder belasting heet en verlaagt zijn snelheid. Met koeling kan hij langer op topsnelheid werken. We testen verschillende oplo...

    Interessant voor jou

    0 Praat mee
    avatar
      Abonneer  
    Laat het mij weten wanneer er