Passwörter mit Gopass im Team verwalten

1 Kommentar

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.

Gopass Logo und Teaser

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).

mkdir some-dir
cd some-dir
git init
touch foo
git add foo
git 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:

  

  1. Alle Secrets auflisten – gopass
  2. Secret ausgeben – gopass my/first/secret
  3. Wert des Secrets in die Zwischenablage legen – gopass -c my/first/secret
  4. Secret bearbeiten – gopass edit my/first/secret
  5. Secret löschen – gopass rm my/first/secret
  6. Secret verschieben – gopass mv my/first/secret my/first/secret-moved
  7. 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:

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.

# einen Wegwerf-Store in beliebigem Verzeichnis erstellen
mkdir /Users/jonas/playground/some-temporary-directory
gopass init --path /Users/jonas/playground/some-temporary-directory
cd /Users/jonas/playground/some-temporary-directory
 
# Git-Repository initialisieren, Remote Origin hinzufügen und pushen
git init && git add --all && git commit -m "store creation"
git remote add origin git@github.name/repo.git && git push -u origin master
 
# Den Store nun wieder aus dem erstellten Git-Repository klonen und somit in Gopass mounten
gopass clone git@github.com:name/repo.git store-name
 
# Den angelegten Mount anzeigen, ein Secret hinzufügen und alle Secrets anzeigen
gopass mounts
echo "secret-value" | gopass insert store-name/first-secret
gopass 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:

# synchronisieren und auflisten aller Recipients, einschließlich des Neuen
gopass sync && gopass recipients
 
# den GPG-Schlüssel des neuen Mitgliedes in die Zwischenablage kopieren und ihm vertrauen
gpg --edit-key <the-gpg-key>
lsign
trust
save
quit
 
# Den Recipient entfernen, neu hinzufügen und die synchronisieren
gopass recipients rm <the-gpg-key> --store store-name
gopass recipients add <the-gpg-key> --store store-name
gopass 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.

#!/usr/bin/env bash
set -e
[[ `uname` = "Linux" ]] && ENCODE="base64 --wrap=0" || ENCODE="base64"
 
# apply via: generate-credentials-secret.sh | kubectl apply -f -
 
# Zugangsdaten f. Datenbank
DB_USERNAME=`gopass store-name/infrastructure/database/prod/username | $ENCODE`
DB_PASSWORD=`gopass store-name/infrastructure/database/prod/password | $ENCODE`
DB_HOSTNAME=`gopass store-name/infrastructure/database/prod/hostname | $ENCODE`
 
cat <<EOL
kind: Secret
apiVersion: v1
type: Opaque
metadata:
  name: application-database-credentials
  namespace: prod
data:
  db-username: $DB_USERNAME
  db-password: $DB_PASSWORD
  db-hostname: $DB_HOSTNAME
EOL

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:

import { exec } from 'child_process'
import driver from 'my-db-driver'
import myTestData from './testData'
 
export default class Gopass {
    public static async show(key: string): Promise {
        return new Promise((resolve, reject) => {
            exec(`gopass show ${key}`, (err: Error | null, stdout: string, stderr: string) => {
                if (err) {
                    reject(err)
                } else {
                    resolve(stdout)
                }
            })
        })
    }
}
 
const insertTestData = async (rows: any[]) => {
    const hostname = await Gopass.show('store-name/infrastructure/database/prod/hostname')
    const username = await Gopass.show('store-name/infrastructure/database/prod/username')
    const password = await Gopass.show('store-name/infrastructure/database/prod/password')
 
    const connection = driver.createConnection(hostname, username, password)
    connection.insertRows('my_table', rows)
}
await 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.

Gopass UI Beispiel-Screenshot

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!

Jonas Verhoelen

Jonas brennt dafür, im Team Geschäftswert durch gute Software zu schaffen. Er entwickelt am liebsten in Type- oder JavaScript sowie verschiedenen JVM-Sprachen und arbeitet dabei gerne full-stack. Zudem steht er dem Kunden mit Expertenwissen, Tools und Methoden zur Beratung rund um Distributed Ledger Technology und IT Security zur Verfügung. Teamwork, Selbstorganisation und ein agiles Mindset sind die Basis seiner täglichen Arbeit.

Kommentare

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.