Passbolt – ein Open Source Passwort-Manager

Bei NeuroForge, wie auch in jeder anderen Firma, haben wir viele verschiedene Passwörter für diverse Services, die dann intern im Team geteilt werden müssen. Deshalb haben wir uns dafür entschieden einen Team-Passwortmanager für die Verwaltung dieser Passwörter zu verwenden. Außerdem war eine Anforderung, dass die Daten, wenn möglich, alle auf unseren eigenen Servern gespeichert werden sollen.

Letztendlich haben wir uns für die Open-Source Lösung Passbolt entschieden. Ein großer Pluspunkt ist hier die verwendete Standardtechnologie: Passbolt setzt auf den Verschlüsselungsstandard OpenPGP zum verschlüsseln der Passwörter die dann wiederum nur in der verschlüsselten Form in einer MySQL/MariaDB Datenbank abgelegt werden.

Benutzt wird Passbolt mithilfe eines Browser Plugins (für Google Chrome, für Mozilla Firefox). Dieses Plugin dient zum sicheren Ver- & Entschlüsseln der Passwörter, denn der PGP Schlüssel des jeweiligen Nutzers wird nur dort hinterlegt und ist durch die Containerisierung der Plugins in modernen Browsern von unberechtigten Zugriffen weitestgehend geschützt. Zur zusätzlichen Sicherheit erzwingt Passbolt beim Erstellen von neuen Accounts die Vergabe einer Passphrase für den Key, sodass der Key alleine noch keinen Zugang zum System erlaubt. Mobile Applikationen für Android und iOS sind für Q3 2019 angekündigt.

Installation von Passbolt

Die Installation von Passbolt ist nicht kompliziert, erfordert aber trotzdem einige manuelle Schritte, die mithilfe von Automatisierung schneller erledigt sind (Das System muss z.B. auch geupdated werden). Bei NeuroForge benutzen wir für diesen Zweck Ansible. Ansible ist ein von RedHat entwickeltes Tool zur IT Automatisierung das es uns erlaubt gewollte Konfigurationen von Servern zu definieren. Die Ansible runtime kümmert sich dann darum die gewollte Konfiguration auf dem Server herzustellen.

Um Passbolt mit Ansible zu installieren haben wir bei NeuroForge Ansible Skripte geschrieben, die wir auf unserem GitHub unter https://github.com/neuroforgede/passbolt_ansible veröffentlicht haben.

Im Folgenden beschreiben wir, wie diese Skripte verwendet werden können, um eine sichere Passbolt Installation aufzusetzen.

Voraussetzungen

Server

Im Folgenden wird davon ausgegangen, dass der Server auf einem neu aufgesetzten (v)Server Ubuntu 18.04 LTS und öffentlicher IP aufgesetzt wird. Dieser Server sollte zudem einen SSH key für den root Zugang eingerichtet haben – diesen benötigen wir um mit Ansible automatisiert den Server aufzusetzen.*

Außerdem sollte der Server über eine Domain erreichbar sein. Kostenlose Domains erhält man z.B. bei DuckDNS.

Lokal

Auf dem lokalen Rechner, mit dem der Server aufgesetzt werden soll, wird folgende Software benötigt:

  • Ubuntu 16.04/18.04 oder anderes modernes Linux (sollte mit Windows auch funktionieren, aber noch nicht getestet)
  • Installiertes und konfiguriertes Ansible mit Hilfe der folgenden Kommandos:
sudo apt install python3
sudo apt install python3-pip
pip3 install ansible==2.7.10
ansible-galaxy install geerlingguy.docker,v2.5.1 geerlingguy.mysql,v2.9.4 

Konfiguration der Ansible Skripte

Bevor wir die Ansible Skripte benutzen können, müssen wir sie erst einmal herunterladen und dann konfigurieren.

Zuerst laden wir die Skripte herunter, entpacken das zip Archiv und wechseln in das Repository:

wget https://github.com/neuroforgede/passbolt_ansible/archive/master.zip
unzip master.zip
cd passbolt_ansible-master/

Jetzt müssen die sicherheitsrelevanten Dateien angepasst werden.

ACHTUNG: Dieser Schritt ist sehr wichtig und sollte nicht übersprungen werden. Im veröffentlichten Repository sind alle sicherheitsrelevanten Passwörter mit Beispielspasswörtern voreingestellt. Diese müssen auf jeden Fall geändert werden, sonst benutzt die resultierende Installation die im GitHub Repository einsichtbaren Standardeinstellungen.

Hinterlegen der root SSH keys

Um das Playbook zu benutzen, müssen die root SSH Keys für den Server im Unterordner ssh_keys eingepflegt werden. Hierfür einfach den private Key nach ssh_keys/root_rsa und den public key nach ssh_keys/root_rsa.pub kopieren.

Anpassen der SSL Zertifikate für den Datenbankserver

Die Ansible Skripte verwenden selbstsignierte SSL Zertifikate zur Konfiguration von SSL Kommunikation zwischen dem Passbolt Server und der MariaDB Instanz. Dies ist zwar ansich nicht nötig, da beide Programme auf dem selben Host laufen werden, es ist jedoch eine gute Sicherheitsvorkehrung, sollte der Passbolt Server später einmal getrennt von der Datenbank laufen sollen.

Zuallererst gilt es, die Skripte zur Generierung der SSL Zertifikate anzupassen. Diese liegen in unserem Fall unter passbolt_ansible-master/files/certs/passbolt_server. In den Dateien files/certs/passbolt_server/gen_root_cert.sh sowie files/certs/passbolt_server/gen_server_cert.sh müssen die Zeilen für die SSL Zertifikatausstellung an die eigene Organisation angepasst werden. Die relevanten Zeilen können mit einer einfachen Suche nach ” emailAddress=test@your-domain.de” gefunden werden. Die einzustellenden Konfigurationsoptionen sind selbstbeschreibend.

Anschließend sollten die Passwörter und IPs in files/certs/passbolt_server/recreate_server_certs.sh für die Platzhalter in <your-root-ca-password>, <your-server-ip>, <your-passbolt-ssl-password>, <your-mariadb-ssl-password> eingetragen werden. Wenn das alles getan ist, können die Zertifikate generiert werden:

cd passbolt_ansible-master/files/certs/passbolt_server
bash recreate_server_certs.sh

Konfigurieren der Passbolt Einstellungen

Die Konfiguration für den Passbolt Server liegt unter inventories/passbolt/group_vars/all/all_config.yml
Folgende Einstellungen sind mindestens zu ändern:

# the main domain of your infrastructure (passbolt is never hosted on the root domain with this playbook)
infrastructure_base_domain: "neuroforge-test.duckdns.org"
# the actual domain to use for passbolt, only change the part before the first dot
passbolt_domain: "vault.{{ infrastructure_base_domain }}"

# which passbolt version to use, see https://hub.docker.com/r/passbolt/passbolt/tags
passbolt_version: "2.10.0-debian"
# the password to the passbolt database
passbolt_db_passwd: "UJ2nsUjgCgQX7PeMzeU9gCV6sbnmEScs"
# the salt to use in passbolts CakePHP, see https://api.wordpress.org/secret-key/1.1/salt/ (and use one of the keys/salts)
passbolt_salt: "SGx.ngspO-d#WFqobx<>Dy^g9zX+aj$Yz4FMt+pbWYl}`?zBPj|DiHf$,iFTlG08"

# the name of your default user, admin should be fine
passbolt_default_user: "admin"
# the email of your default user
passbolt_default_user_mail: "admin@neuroforge.de"

# the email for your email notifications (other settings are set up for gmail)
passbolt_email_from: "your-email@gmail.com"
# the email password
passbolt_email_password: "<your-email-password>"

Außerdem muss noch in der Datei inventories/passbolt/hosts.yml die richtige IP für die Variable ansible_host eingetragen werden. Diese ist im Stand des Repositories noch auf eine Test IP eingestellt:

all:
  children:
    nginx:
      hosts:
        passbolt_server:
          ansible_host: 95.217.11.108
          host_ip: "{{ ansible_host }}"

          certbot_base_domains_singular:
            - name: "{{ infrastructure_base_domain }}"
          
          certbot_domains_singular:
            - name: "{{ passbolt_domain }}"
          
          certbot_base_domains: "{{ certbot_base_domains_singular }}"
          certbot_domains: "{{ certbot_domains_singular }}"
    passbolt:
      hosts:
        passbolt_server:
          ansible_host: 95.217.11.108
          host_ip: "{{ ansible_host }}"
    mariadb:
      hosts:
        passbolt_server:
          ansible_host: 95.217.11.108
          host_ip: "{{ ansible_host }}"

Deployment des Servers

Um den Server mit den oben eingestellten Einstellungen aufzusetzen, gilt es nun nur noch, die Ansible Skripte auszuführen. Hierfür muss man nur noch in das Hauptverzeichnis der Skripte wechseln und folgenden Befehl ausführen:

ansible-playbook -i inventories/passbolt_sever/hosts.yml full_setup.yml

Nach Ausführen dieses Skriptes ist folgendes passiert:

  • python wurde installiert (für Ansible)
  • ufw Firewall wurde installiert und konfiguriert
  • mariadb Datenbankserver wurde installiert und mit passbolt Datenbank konfiguriert
  • passbolt wurde als Docker container installiert und konfiguriert
  • nginx wurde installiert und für Passbolt als Reverse Proxy inklusive letsencrypt SSL Zertifikat konfiguriert

Jetzt sollte der Server unter der vorher konfigurierten Domain per https erreichbar sein:

Initiale Nutzerkonfiguration und Login/Setup des Plugins

Um die initiale Nutzerkonfiguration durchzuführen wird eine direkte Verbindung zum passbolt docker auf dem neu provisionierten Server benötigt. Das Repository stellt hierfür das kleine Bashscript passbolt_shell.sh bereit. Um damit auf den Server zu gelangen startet man dieses mit:

bash passbolt_shell.sh <your-server-ip>

Um den ersten Admin Nutzer zu erstellen führt man nun folgendes Kommando (angepasst mit den gewünschten Einstellungen) in der Passbolt Container Shell aus:

su -c "./bin/cake passbolt register_user -u admin@yourorg.com -f Admin -l Adminson -r admin" -s /bin/bash www-data

Wenn alles richtig gelaufen ist, sieht man dann folgenden Output:

Mit der URL die hier angezeigt wird, kann man sich nun im Browser (in welchem man das Passbolt Plugin noch nicht installiert und noch nicht weiter konfiguriert hat, sowie noch nicht auf der passbolt.com Seite war – sonst erkennt das Plugin die URL nicht) registrieren. Nachdem man den Link in den Browser seiner Wahl (Chrome, Chromium oder Firefox) eingegeben hat, wird folgende Seite angezeigt:

Hier folgt man dem Link zur Extension im jeweiligen Extension Store und installiert das Plugin. Sobald das Plugin installiert ist, lädt man die Seite neu und man sieht die folgende Seite:

Wenn alles passt, setzt man den Haken und klickt auf Next anschließend gelangt man zu dieser Seite:

Nachdem man alles relevante ausgefüllt hat, klickt man wieder auf Next und man gelangt zur Seite auf der man seine Passphrase für seinen GPG Key einstellen kann:

Nachem man eine Passphrase eingestellt hat, klickt man wieder auf Next. Es wird nun ein Key generiert den man auf der folgenden Seite herunterladen kann:

Diesen Key sollte man an einem sicheren Ort sichern, da man diesen benötigt um sich von anderen Geräten aus einzuloggen. Wenn man ihn an einem sicheren Ort abgelegt hat, klickt man wieder auf Next.

Hier wählt man einen Security Token aus, der dabei helfen soll, phishing vorzubeugen. Dieser Token (der Text und die Farbe) wird beim Einloggen in Passbolt angezeigt sodass man die Identität des Servers überprüfen kann. Wenn man zufrieden ist, klickt man wieder auf Next und man ist bereit sich einzuloggen:

Nach einem erfolgreichen Login wird man von der Passbolt Hauptseite begrüßt:

Final kann man sich noch davon überzeugen, dass alles richtig gelaufen ist, in dem man auf die Healthcheckseite unter https://your-passbolt.domain.org/healthcheck geht:

Sicherung des Servers

Natürlich sollte man sich auch Gedanken um die Sicherung der Datenbank auf dem Server machen. Hier ist es eine gute Idee regelmäßig Dumps der MySQL Datenbank auf dem Server zu machen, und diese dann zusammen mit den aus dem Passbolt Container herausgemounteten Ordnern (hier liegt auch der Server PGP Key) zu sichern. Für diesen Zweck liegt im passbolt_ansible Repository das Skript manual_backup.sh:

#!/bin/bash

old_pwd=$(pwd)

DATE=`date +"%m-%d-%y"`
BASE_DIR=passbolt_backup_$1_$DATE
mkdir -p $BASE_DIR

cd $BASE_DIR
ssh -t -i "${old_pwd}/ssh_keys/root_rsa" root@$1 mysqldump --all-databases > "mariadb-$1-$DATE.sql"
mkdir -p all_ansible_data_backup
scp -i "${old_pwd}/ssh_keys/root_rsa" -r root@$1:/data/ansible all_ansible_data_backup

Ein einfacher Aufruf von

bash manual_backup.sh <your-ip>

ist genug, und ein Backup der ganzen MariaDB Datenbank (alle Tables, nicht nur Passbolt) sowie aller zu sichernden Dateien von Passbolt wurde im Ordner passbolt_backup_<your-ip>_<datum> erstellt. Dieser Backup Mechanismus ist aber nur als Minimalausprägung eines Backupsystems anzusehen welches baldmöglichst durch ein automatisches Backup (regelmäßige Datenbank Dumps die dann z.B. per cronjob und rdiff-backup vom Passbolt Server zusammen mit den restlichen Daten auf einen SFTP Server übertragen werden) erweitert werden sollte.

Zusammenfassung

In diesem Beitrag haben wir gesehen, wie einfach es ist einen modernen Passwortmanager selbst aufzusetzen. Mithilfe der auf GitHub bereitgestellten Skripte kann in unter einer Stunde die komplette Infrastruktur einer Passbolt Instanz, sicher und wartbar, selbst-gehostet und auch geupdated werden.

Bei weiteren Fragen zu diesem Thema können Sie uns natürlich jederzeit entweder auf GitHub oder einfach direkt kontaktieren.

Anmerkungen

*Die Ansible Skripte sollten zwar auch auf bereits eingerichteten Servern funktionieren, hier sei aber erwähnt, dass die NeuroForge GmbH & Co. KG keinerlei Haftung für die Skripte übernimmt – vor allem unter dem Hintergrund, dass die Ansible Skripte keine speziellen Checks zur Überprüfung, ob Software bereits installiert oder anderweitig konfiguriert ist, beinhalten.