In Entwicklungsteams muss oft eine große Menge an Passwörtern und Secrets geteilt werden. Die Art und Weise, wie dies geschieht, ist entscheidend für die Sicherheit, da öffentlich gewordene oder abgefangene Secrets einfache Angriffsvektoren darstellen. Personen sollten Passwortmanager und komplex generierte Passwörter verwenden – aber auch in Software-Entwicklungsteams. Gopass ist ein einfaches, robustes und leicht zu erlernendes Tool und bietet schlechter Passwortsicherheit in Teams eine passende Antwort.
Passwortmanager für Teams
Datenbanken, Cloud-Provider, Plattformen und SaaS-Provider sind nur einige wenige Fälle, in denen Zugangsdaten sicher gespeichert und in Software-Entwicklungsteams gemeinsam genutzt werden sollten. Und genau wie beim persönlichen Gebrauch müssen diese Zugangsdaten komplex und lang genug sein und sicher aufbewahrt werden. Es sollte nicht der Fall sein, dass Zugangsdaten per Messenger oder E-Mail verschickt oder gar direkt im Quellcode gespeichert werden. Daher sollte auch so wenig manuelle Interaktion wie möglich mit Passwörtern nötig sein. Das alles ist manuell nicht leicht zu bewerkstelligen. Deswegen sollte man sich von einem geeigneten Tool helfen lassen.
Hier kommen Passwortmanager für Teams zum Einsatz. Die Idee ist, dass Teammitglieder nur Zugang zu den Zugangsdaten haben, wenn sie technisch identifiziert werden können. Dazu dient ein Identitätsnachweis in Form eines Public Keys. Wo es einen Public Key gibt, gibt es auch einen Private Key zum Entschlüsseln und Signieren von Daten. Ein Public- und Private-Schlüsselpaar ermöglicht die Verschlüsselung und Entschlüsselung von Zugangsdaten für alle mit dem Team verknüpften Identitäten. Es ist auch möglich, einzelnen Identitäten ihre Rechte zum Zugriff auf die Zugangsdaten wieder zu entziehen, z.B. wenn ein Teammitglied das Team verlassen hat. Aber worum genau handelt es sich bei Pass und dem daraus inspirierten Gopass und wie funktioniert es?
Vorstellung von Pass und Gopass
Zuerst einmal, was ist Pass? Pass behauptet von sich, „der Standard Passwort Manager für Unix“ zu sein und gänzlich der Unix-Philosophie zu folgen. Es ist ein einfaches Command Line Tool zum Ver- und Entschlüsseln von Passwörtern mittels GPG . Zusätzlich bietet Pass auch Git-Funktionalität an, so dass Passwortspeicher lokal und remote versioniert, gesichert und freigegeben werden können. Es ist auch möglich, das Verzeichnis des Passwortspeichers mit Cloud-Speichern wie Google Drive oder Dropbox zu synchronisieren. Pass bietet alle grundlegenden Funktionen eines Passwortmanagers und kann somit sogar sinnvoll im Team eingesetzt werden. Bevor gar kein Passwortmanager verwendet wird, ist Pass in allen Belangen schon eine gute Wahl.
user@computer ~ $ pass
Password Store
├── Business
│ ├── codecentric.de
│ ├── mail.google.com
│ └── xing.de
├── Private
│ ├── ebay.de
│ └── twitter.com
└── Finance
├── bank-account
├── mobile-phone-provider
└── not-so-smart-home
Gopass behauptet von sich, „der etwas bessere Standard-Unix-Passwortmanager für Teams“ zu sein. Es ist in Go geschrieben, um plattformübergreifend eingesetzt werden zu können. Dies ist nützlich, da in Teams oft unterschiedliche Betriebssysteme zum Einsatz kommen. Es ist außerdem besonders darauf ausgelegt, in Teams eingesetzt zu werden. Gopass ist zu 100% API-kompatibel mit Pass, da es ebenfalls auf GPG-Verschlüsselung setzt und die Daten im gleichen Format ablegt. Beide Passwortmanager pflegen eine einfache Verzeichnisstruktur, in denen Secrets nur als verschlüsselte Dateien mit Dateinamen im Klartext in Ordnern liegen. Daher kann ein Gopass-Eintrag mit seinem Dateipfad angesprochen werden (z.B. /my-store/some-database/production/password
). Zusätzlich bietet Gopass eine enge Integration mit Git, falls dies als Ansatz zur Synchronisation gewünscht ist. Die Synchronisierung mit jeglichen Cloud-Speichern ist ebenso möglich, indem der Sync-Mechanismus auf „noop“ gesetzt wird und man das Verzeichnis mit dem Cloud-Speicher synchronisiert. Einen Passwort-Store in Gopass zu synchronisieren, bedeutet nur Änderungen zu pushen und zu pullen. Das Hinzufügen und Editieren von Secrets löst ebenfalls einen Push aus.
Was Gopass speziell für Teams besonders macht, ist die Tatsache, dass es „Recipients“ in Passwortstores kennt. Jedes Mitglied eines Teams ist nach der Einrichtung als Recipient im Passwortspeicher des Teams vertreten. Um ein neues Mitglied einzuladen, muss ein Mitglied nur den Public Key des Mitarbeiters im Store registrieren (im Dateisystem hinterlegen). Recipients (und vorzugsweise nur diese) benötigen ebenfalls Zugriff auf das Remote-Git-Repository, um für die Synchronisation pushen und pullen zu können. Wenn ein neuer Recipient hinzugefügt wird, entschlüsselt Gopass zuerst alle Secrets um sie anschließend wieder so zu verschlüsseln, dass auch das neue Mitglied mit einbezogen wird. Das Hinzufügen eines neuen Recipients zum Store bedeutet, dass alle vorherigen Recipients nun dem neuen Mitglied (bzw seinem Key) vertrauen. Mit diesem Mechanismus ist es auch möglich, den Zugriff von Recipients auf den Store zu widerrufen. Wenn Personen das Team verlassen, ihre Hardware verlieren oder Opfer von Computer-Viren und gezielten Angriffen werden, ist dies unverzichtbar.
Gopass installieren und konfigurieren
Die Abhängigkeiten von Gopass sind GPG, Git und ein erzeugtes GPG Schlüsselpaar. Zuerst sollte anhand der „Pre-Installation Steps“ überprüft werden, ob die Abhängigkeiten erfüllt sind. Um Gopass selbst zu installieren, ist eine direkte Installation über Go empfohlen: go get github.com/gopasspw/gopass
. Falls Go nicht im PATH
verfügbar ist oder eine andere Variante bevorzugt wird, gibt es hier die nötige Übersicht der Alternativen. Die beliebtesten Linux Packetmanager sowie Homebrew für MacOS bieten ebenfalls die aktuellen Gopass-Versionen an. Für Debian und Ubuntu sollte man sich selbst das .deb-Paket herunterladen, da die offiziellen Debian Repositories ein anderes Programm unter „gopass“ kennen. Natürlich gibt es auch Auto Completions für bash, zshell und fish .
Für die erfolgreiche Installation ist das Zusammenspiel zwischen Git und GPG wichtig. Dies kann getestet werden, indem ein leeres Repository initialisiert und anschließend versucht wird, einen GPG-signierten Commit zu erstellen (mittels der -S
Flag).
1mkdir some-dir 2cd some-dir 3git init 4touch foo 5git add foo 6git commit -S -m "test"
Wenn das funktioniert, kann anschließend die Kombination mit Gopass getestet werden. Wenn es noch Probleme gibt, gilt es diese Stellen nochmal zu überprüfen:
- Funktioniert GPG-Verschlüsselung grundsätzlich?
echo "test" | gpg ---clearsign
- Probleme mit GPG und TTY:
GPG_TTY=$(tty) && export GPG_TTY
in der Bash-Konfiguration hilft
Die Basisfunktionalität von Gopass lernen
Wenn Gopass zuerst geöffnet wird, ist es sinnvoll den Onboarding-Wizard mittels gopass
zu starten. Es führt den Nutzer durch das Initialisieren seines ersten Stores. Dabei ist es egal ob ein neuer lokaler oder Teamstore angelegt werden soll oder ob man einem existierenden Teamstore beitreten möchte. Zum Lernen fängt man am besten mit dem lokalen Store an. Nachdem dies dem Onboarding-Wizard bekannt gemacht wurde, kann mit gopass insert my/first/secret
das erste Secret erstellt werden.
Mit dem erstellten Secret können einige grundlegende Dinge getan werden:
- Alle Secrets auflisten –
gopass
- Secret ausgeben –
gopass my/first/secret
- Wert des Secrets in die Zwischenablage legen –
gopass -c my/first/secret
- Secret bearbeiten –
gopass edit my/first/secret
- Secret löschen –
gopass rm my/first/secret
- Secret verschieben –
gopass mv my/first/secret my/first/secret-moved
- Neues Secret als Kopie anlegen –
gopass mv my/first/secret-moved my/first/secret-copy
Funktioniert etwas noch nicht, obwohl das Zusammenspiel von GPG und Git erfolgreich getestet wurde? Diese Punkte sind einen Blick wert:
- Stimmen der Name und die E-Mail-Adresse des Git-Clients mit den Angaben des GPG-Keys überein?
- Gopass Docs – Etwas beim Setup vergessen? Schon in die FAQ geschaut?
Um Zugangsdaten aus Password Stores im Browser zu verwenden, gibt es sogar eine Gopass JSON API, die einfach konfiguriert werden kann. Die Browser-Erweiterung „Gopass Bridge“ ist für Firefox, Chrome und Chromium verfügbar und kann nach der Konfiguration mit Gopass kommunizieren. Wie das geht, kann hier nachgelesen werden .
Team Stores mit Gopass aufsetzen und verwenden
Um einen frischen Password Store für ein Team aufzusetzen, ist zuerst ein Git-Repository (mit Zugriff ausschließlich für die geplanten Team-Mitglieder) erforderlich. Wie ein Team Store erzeugt wird, ist am Ende der Einrichtungs-Dokumentation zu erfahren. Leider mag es Gopass nicht, dass wir zuerst einen lokalen Store angelegt haben. Bis dieses Problem der CLI behoben ist, kann aber „der manuelle Weg“ genutzt werden um den Team Store anzulegen. Dadurch versteht man gleichzeitig auch besser, wie simpel Gopass ist und wie es funktioniert.
1# einen Wegwerf-Store in beliebigem Verzeichnis erstellen 2mkdir /Users/jonas/playground/some-temporary-directory 3gopass init --path /Users/jonas/playground/some-temporary-directory 4cd /Users/jonas/playground/some-temporary-directory 5 6# Git-Repository initialisieren, Remote Origin hinzufügen und pushen 7git init && git add --all && git commit -m "store creation" 8git remote add origin git@github.name/repo.git && git push -u origin master 9 10# Den Store nun wieder aus dem erstellten Git-Repository klonen und somit in Gopass mounten 11gopass clone git@github.com:name/repo.git store-name 12 13# Den angelegten Mount anzeigen, ein Secret hinzufügen und alle Secrets anzeigen 14gopass mounts 15echo "secret-value" | gopass insert store-name/first-secret 16gopass list store-name
Von nun an werden alle geänderten und hinzugefügten Secrets automatisch mit dem Git-Repository synchronisiert.
Team-Mitglieder in den Password Store einladen
Neue Mitglieder müssen nun, wie eben selbst, den Store aus Git in Gopass hinein klonen: gopass clone git@github.com:name/repo.git store-name
. Danach müssen sie sich selbst als Recipient hinzufügen und die Änderung synchronisieren: gopass recipients add && gopass sync
. Nun kennt der Store zwar den neuen Key, das neue Mitglied kann aber noch keine Secrets entschlüsseln und das Team vertraut dem Key noch nicht. Das können wir ändern, indem ein Vertreter des Teams sein Vertrauen für den neuen GPG-Schlüssel ausspricht und alle Secrets in Folge dessen neu verschlüsselt. Ein bereits verifiziertes Mitglied muss dafür folgendes tun:
1# synchronisieren und auflisten aller Recipients, einschließlich des Neuen 2gopass sync && gopass recipients 3 4# den GPG-Schlüssel des neuen Mitgliedes in die Zwischenablage kopieren und ihm vertrauen 5gpg --edit-key <the-gpg-key> 6lsign 7trust 8save 9quit 10 11# Den Recipient entfernen, neu hinzufügen und die synchronisieren 12gopass recipients rm <the-gpg-key> --store store-name 13gopass recipients add <the-gpg-key> --store store-name 14gopass sync
Nachdem das neue Mitglied gopass sync
ausgeführt hat, erhält es die neu verschlüsselten Secrets und erhält Zugriff zu diesen.
Gopass in bestehende Anwendungen integrieren
Da alle Secrets und Zugangsdaten des Teams nun in Gopass liegen und über die CLI von jedem Mitglied darauf zugegriffen werden kann, können Secrets für Anwendungen generiert werden ohne dass sie jemals im Klartext auf der Festplatte lagen. Das folgende Beispiel zeigt, wie Kubernetes Secrets aus Gopass Secrets generiert und direkt auf den Cluster angewandt werden können.
1#!/usr/bin/env bash 2set -e 3[[ `uname` = "Linux" ]] && ENCODE="base64 --wrap=0" || ENCODE="base64" 4 5# apply via: generate-credentials-secret.sh | kubectl apply -f - 6 7# Zugangsdaten f. Datenbank 8DB_USERNAME=`gopass store-name/infrastructure/database/prod/username | $ENCODE` 9DB_PASSWORD=`gopass store-name/infrastructure/database/prod/password | $ENCODE` 10DB_HOSTNAME=`gopass store-name/infrastructure/database/prod/hostname | $ENCODE` 11 12cat <<EOL 13kind: Secret 14apiVersion: v1 15type: Opaque 16metadata: 17 name: application-database-credentials 18 namespace: prod 19data: 20 db-username: $DB_USERNAME 21 db-password: $DB_PASSWORD 22 db-hostname: $DB_HOSTNAME 23EOL
Ebenfalls bei der Erstellung von benötigten Skripten gegen unsere Infrastruktur ist Gopass nützlich. Beispielsweise beim Generieren und Einspielen von Testdaten in unsere Datenbank, können Secrets direkt aus Gopass abgeholt werden. Es folgt ein fiktives Beispiel in TypeScript mit Node.js:
1import { exec } from 'child_process'
2import driver from 'my-db-driver'
3import myTestData from './testData'
4
5export default class Gopass {
6 public static async show(key: string): Promise {
7 return new Promise((resolve, reject) => {
8 exec(`gopass show ${key}`, (err: Error | null, stdout: string, stderr: string) => {
9 if (err) {
10 reject(err)
11 } else {
12 resolve(stdout)
13 }
14 })
15 })
16 }
17}
18
19const insertTestData = async (rows: any[]) => {
20 const hostname = await Gopass.show('store-name/infrastructure/database/prod/hostname')
21 const username = await Gopass.show('store-name/infrastructure/database/prod/username')
22 const password = await Gopass.show('store-name/infrastructure/database/prod/password')
23
24 const connection = driver.createConnection(hostname, username, password)
25 connection.insertRows('my_table', rows)
26}
27await insertTestData(myTestData)
Gopass außerhalb des Terminals mit Gopass UI nutzen
Auf der Suche nach einer grafischen Benutzeroberfläche für Gopass fanden sich für uns keine zufriedenstellenden Lösungen. Besonders in cross-funktionalen Teams ist es wichtig, auch „nicht-so-technischen“ Personen einen einfachen und sicheren Zugriff auf Zugangsdaten zu gewährleisten. Deswegen entschieden wir uns bei der codecentric dazu, eine intuitive und simple GUI für Gopass zu bauen und zu veröffentlichen. Das Kind wurde Gopass UI getauft und kann auf Github gefunden und kostenlos heruntergeladen werden .
Fazit
Teams sollten in jedem Fall einen Passwortmanager benutzen. Es ist nicht empfehlenswert, händisch zu viel mit wichtigen Secrets unserer Infrastruktur-Landschaft zu hantieren, weil dabei oft Spuren hinterlassen werden, die uns verwundbarer machen können. Dazu zählt ebenfalls das (Achtung Ironie) altbewährte Passwort-Dokument, das in vielen Teams noch Alltag ist. Es verleitet auch dazu, Zugangsdaten über Messenger und Mail zu versenden. Damit sollte Schluss sein.
Es ist nicht schwierig oder aufwendig grundlegende Sicherheitsregeln und Mechanismen in Software-Entwicklungsteams einzuführen. Ein simpler aber mächtiger Passwortmanager wie Gopass oder Pass ist ein bedeutender Anfang. Trotz eventuellen Schwierigkeiten beim Konfigurieren von Gopass (die sich mit den richtigen Suchbegriffen lösen lassen), lohnt es sich, direkt Gopass zu verwenden um von den hilfreichen und plattformübergreifenden Features Gebraucht zu machen Es kostet nichts, ist vielseitig, einfach zu lernen und bewirkt schon eine ganze Menge. Mit den genannten Programmen ist man ebenfalls nicht an einen Anbieter gebunden sondern kann prinzipiell alles nutzen, was Dateien versteht. Viel Spaß mit der Einführung eures Passwortmanagers im Team!
Weitere Beiträge
von Jonas Verhoelen
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Weitere Artikel in diesem Themenbereich
Entdecke spannende weiterführende Themen und lass dich von der codecentric Welt inspirieren.
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Jonas Verhoelen
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.