Die Python-Schlüsselbundbibliothek bietet eine einfache Möglichkeit, über Python auf den Systemschlüsselbunddienst zuzugreifen. Es kann in jeder Anwendung verwendet werden, die eine sichere Passwortspeicherung benötigt.
Diese empfohlenen Schlüsselbund-Backends werden unterstützt:
Andere Schlüsselbundimplementierungen sind über Drittanbieter-Backends verfügbar.
Unter Linux basiert das KWallet-Backend auf dbus-python, das bei Verwendung von pip nicht immer korrekt installiert wird (Kompilierung ist erforderlich). Um optimale Ergebnisse zu erzielen, installieren Sie dbus-python als Systempaket.
Der macOS-Schlüsselbund unterstützt macOS 11 (Big Sur) und erfordert Python 3.8.7 oder höher mit der Binärdatei „universal2“. Weitere Informationen finden Sie unter Nr. 525.
Die grundlegende Verwendung von keyring ist ziemlich einfach: Rufen Sie einfach keyring.set_password
und keyring.get_password
auf:
>>> Schlüsselbund importieren >>> keyring.set_password("system", "username", "password") >>> keyring.get_password("system", "username") 'Passwort'
Keyring stellt einen keyring
bereit, der mit dem Paket installiert wird. Nach der Installation des Schlüsselbunds sollte der Befehl in den meisten Umgebungen zum Festlegen, Abrufen und Löschen von Kennwörtern verfügbar sein. Für weitere Nutzungsinformationen rufen Sie ohne Argumente oder mit --help
Folgendes auf:
$ Schlüsselbund --help $ Schlüsselbund Systembenutzernamen festlegen Passwort für „Benutzername“ in „System“: $ Schlüsselbund Systembenutzernamen abrufen Passwort
Die Befehlszeilenfunktionalität wird auch als ausführbares Paket bereitgestellt, das zum Aufrufen aus Python wie folgt geeignet ist:
$ python -m Schlüsselbund --help $ python -m keyring legt den Systembenutzernamen fest Passwort für „Benutzername“ in „System“: $ python -m keyring Systembenutzernamen abrufen Passwort
Bei der Installation über einen Paketmanager (apt, pacman, nix, homebrew usw.) wurden diese Shell-Vervollständigungen möglicherweise bereits mit dem Paket verteilt (keine Aktion erforderlich).
Keyring bietet Tab-Vervollständigung, wenn das completion
Extra installiert ist:
$ pip install 'keyring[completion]'
Generieren Sie dann Shell-Vervollständigungen, etwa so:
$ keyring --print-completion bash | sudo tee /usr/share/bash-completion/completions/keyring $ keyring --print-completion zsh | sudo tee /usr/share/zsh/site-functions/_keyring $ keyring --print-completion tcsh | sudo tee /etc/profile.d/keyring.csh
Hinweis : Der Pfad von /usr/share gilt hauptsächlich für GNU/Linux. Berücksichtigen Sie für andere Betriebssysteme Folgendes:
Nachdem Sie die Shell-Vervollständigungen installiert haben, aktivieren Sie sie gemäß den empfohlenen Anweisungen Ihrer Shell. z.B:
. /usr/share/bash-completion/bash_completion
in ~/.bashrc
.autoload -Uz compinit && compinit
in ~/.zshrc
erscheint, dann grep -w keyring ~/.zcompdump
um zu überprüfen, ob der Schlüsselring erscheint, was anzeigt, dass er korrekt installiert wurde. Die Python-Schlüsselbundbibliothek enthält Implementierungen für mehrere Backends. Die Bibliothek versucht, automatisch das am besten geeignete Backend für die aktuelle Umgebung auszuwählen. Benutzer können den bevorzugten Schlüsselbund auch in einer Konfigurationsdatei oder durch Aufrufen der Funktion set_keyring()
angeben.
Die Konfiguration wird in einer Datei mit dem Namen „keyringrc.cfg“ gespeichert, die sich an einem plattformspezifischen Speicherort befindet. Um festzustellen, wo die Konfigurationsdatei gespeichert ist, führen Sie keyring diagnose
aus.
Um ein Schlüsselbund-Backend anzugeben, legen Sie die Option „default-keyring“ auf den vollständigen Pfad der Klasse für dieses Backend fest, z. B. keyring.backends.macOS.Keyring
.
Wenn keyring-path angegeben ist, fügt keyring diesen Pfad dem Suchpfad des Python-Moduls hinzu, bevor das Backend geladen wird.
Diese Konfiguration könnte beispielsweise verwendet werden, um SimpleKeyring
aus dem simplekeyring
-Modul im Verzeichnis ./demo
zu laden (nicht implementiert):
[Backend] default-keyring=simplekeyring.SimpleKeyring keyring-path=demo
Zusätzlich zu den Backends, die das Kernschlüsselbundpaket für die gängigsten und sichersten Anwendungsfälle bereitstellt, stehen für andere Anwendungsfälle zusätzliche Schlüsselring-Backend-Implementierungen zur Verfügung. Installieren Sie sie einfach, um sie verfügbar zu machen:
keyring<24
). Die Schnittstelle für das Backend wird durch keyring.backend.KeyringBackend
definiert. Jedes Backend sollte von dieser Basisklasse abgeleitet sein und ein priority
und drei Funktionen definieren: get_password()
, set_password()
und delete_password()
. Die Funktion get_credential()
kann bei Bedarf definiert werden.
Weitere Einzelheiten zur Schnittstelle dieser Klasse finden Sie im backend
-Modul.
Keyring verwendet Einstiegspunkte, um es jedem Paket von Drittanbietern zu ermöglichen, Backends zu implementieren, ohne dass Änderungen am Schlüsselring selbst erforderlich sind. Diejenigen, die an der Erstellung neuer Backends interessiert sind, werden aufgefordert, neue Pakete von Drittanbietern im Namensraum keyrings
zu erstellen, und zwar nach dem Vorbild des Pakets „keyrings.alt“. Hinweise zum Erstellen der erforderlichen Einstiegspunkte finden Sie in der Datei setup.cfg
in diesem Projekt. Backends, die sich als wesentlich erweisen, können für die Aufnahme in die Kernbibliothek in Betracht gezogen werden, obwohl die einfache Installation dieser Pakete von Drittanbietern bedeuten sollte, dass Erweiterungen möglicherweise leicht verfügbar sind.
Um eine Erweiterung für Keyring zu erstellen, senden Sie bitte eine Pull-Anfrage, damit Ihre Erweiterung als verfügbare Erweiterung erwähnt wird.
Keyring ermöglicht außerdem die programmgesteuerte Konfiguration des Backends, indem die API set_keyring()
aufgerufen wird. Anschließend wird das angegebene Backend zum Speichern und Abrufen von Passwörtern verwendet.
So rufen Sie set_keyring
auf:
# Definieren Sie eine neue Schlüsselbundklasse, die das KeyringBackend erweitert keyring.backend importieren Klasse TestKeyring(keyring.backend.KeyringBackend): """Ein Testschlüsselbund, der immer das gleiche Passwort ausgibt „““ Priorität = 1 def set_password(selbst, Dienstname, Benutzername, Passwort): passieren def get_password(self, servicename, username): „Passwort von TestKeyring“ zurückgeben def delete_password(self, servicename, username): passieren # Setze den Schlüsselbund für die Schlüsselbundbibliothek keyring.set_keyring(TestKeyring()) # Rufen Sie die Schlüsselbundbibliothek auf versuchen: keyring.set_password("demo-service", "tarek", "passexample") print("Passwort erfolgreich gespeichert") außer keyring.errors.PasswordSetError: print("Passwort konnte nicht gespeichert werden") print("password", keyring.get_password("demo-service", "tarek"))
In vielen Fällen ist eine Deinstallation des Schlüsselbunds nie erforderlich. Insbesondere unter Windows und macOS ist das Verhalten des Schlüsselbunds normalerweise degeneriert, was bedeutet, dass er leere Werte an den Aufrufer zurückgibt, sodass dieser auf ein anderes Verhalten zurückgreifen kann.
In einigen Fällen ist das Standardverhalten des Schlüsselbunds unerwünscht und es wäre vorzuziehen, das Schlüsselbundverhalten vollständig zu deaktivieren. Es gibt mehrere Mechanismen zum Deaktivieren des Schlüsselbunds:
PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
in der Umgebung fest, und das Null
-Backend (degeneriert) wird verwendet. Dieser Ansatz betrifft alle Verwendungen von Keyring, bei denen diese Variable festgelegt ist.keyring --disable
oder python -m keyring --disable
ausführen. Dieser Ansatz wirkt sich auf alle Verwendungen des Schlüsselbunds für diesen Benutzer aus. Keyring bietet einen Mechanismus zum Ändern des Verhaltens des Schlüsselrings durch Umgebungsvariablen. Jedes Backend implementiert ein KeyringBackend.set_properties_from_env
, das bei Aufruf alle Umgebungsvariablen findet, die mit KEYRING_PROPERTY_{NAME}
beginnen, und eine Eigenschaft für jedes {NAME.lower()}
im Schlüsselbund festlegt. Diese Methode wird während der Initialisierung für den standardmäßigen/konfigurierten Schlüsselbund aufgerufen.
Dieser Mechanismus kann verwendet werden, um einige nützliche Werte für verschiedene Schlüsselbunde festzulegen, darunter:
Im Folgenden finden Sie eine vollständige Abschrift für die Installation von Keyring in einer virtuellen Umgebung unter Ubuntu 16.04. Es wurde keine Konfigurationsdatei verwendet:
$ sudo apt install python3-venv libdbus-glib-1-dev $ cd /tmp $ pyvenv py3 $ Quelle py3/bin/activate $ pip install -U pip $ pip installiere Secretstorage dbus-python $ pip Schlüsselring installieren $ Python >>> Schlüsselbund importieren >>> keyring.get_keyring() <keyring.backends.SecretService.Keyring-Objekt unter 0x7f9b9c971ba8> >>> keyring.set_password("system", "username", "password") >>> keyring.get_password("system", "username") 'Passwort'
Es ist möglich, das SecretService-Backend auf Linux-Systemen ohne verfügbaren X11-Server zu verwenden (nur D-Bus ist erforderlich). In diesem Fall:
Installieren Sie den GNOME Keyring-Daemon.
Starten Sie eine D-Bus-Sitzung, führen Sie beispielsweise dbus-run-session -- sh
aus und führen Sie die folgenden Befehle in dieser Shell aus.
Führen Sie gnome-keyring-daemon
mit der Option --unlock
aus. In der Beschreibung dieser Option heißt es:
Lesen Sie ein Kennwort aus stdin und entsperren Sie damit den Anmeldeschlüsselbund oder erstellen Sie es, wenn der Anmeldeschlüsselbund nicht vorhanden ist.
Wenn dieser Befehl gestartet wird, geben Sie ein Passwort in stdin ein und drücken Sie Strg+D (Ende der Daten). Danach tritt der Daemon in den Hintergrund (verwenden Sie zum Blockieren die Option --foreground
).
Jetzt können Sie das SecretService-Backend von Keyring verwenden. Denken Sie daran, Ihre Anwendung in derselben D-Bus-Sitzung wie den Daemon auszuführen.
Es ist auch möglich, den Schlüsselbund mit dem SecretService-Backend in Docker-Containern zu verwenden. Sie müssen lediglich die erforderlichen Abhängigkeiten installieren und das Flag --privileged hinzufügen, um beim Versuch, den Schlüsselbund des Systems zu entsperren, Fehler „Vorgang nicht zulässig“ zu vermeiden.
Das Folgende ist ein vollständiges Transkript für die Installation von Keyring auf einem Ubuntu 18:04-Container:
docker run -it -d --privileged ubuntu:18.04 $ apt-get update $ apt install -y gnome-keyring python3-venv python3-dev $ python3 -m venv venv $ source venv/bin/activate # source eine virtuelle Umgebung, um eine Verschmutzung Ihres Systems zu vermeiden $ pip3 install --upgrade pip $ pip3 Schlüsselring installieren $ dbus-run-session -- sh # Dadurch gelangen Sie in eine neue D-Bus-Shell $ echo 'somecredstorepass' | gnome-keyring-daemon --unlock # Entsperren Sie den Schlüsselbund des Systems $ Python >>> Schlüsselbund importieren >>> keyring.get_keyring() <keyring.backends.SecretService.Keyring-Objekt unter 0x7f9b9c971ba8> >>> keyring.set_password("system", "username", "password") >>> keyring.get_password("system", "username") 'Passwort'
Die Schlüsselbundbibliothek hat einige Funktionen:
get_keyring()
: Gibt die aktuell geladene Schlüsselringimplementierung zurück.get_password(service, username)
: Gibt das im aktiven Schlüsselbund gespeicherte Passwort zurück. Wenn das Passwort nicht existiert, wird „None“ zurückgegeben.get_credential(service, username)
: Gibt ein im aktiven Schlüsselbund gespeichertes Anmeldeinformationsobjekt zurück. Dieses Objekt enthält mindestens username
und password
für den angegebenen Dienst, wobei der zurückgegebene username
vom Argument abweichen kann.set_password(service, username, password)
: Speichern Sie das Passwort im Schlüsselbund.delete_password(service, username)
: Löschen Sie das im Schlüsselbund gespeicherte Passwort. Wenn das Passwort nicht vorhanden ist, wird eine Ausnahme ausgelöst. In allen Fällen sollten die Parameter ( service
, username
, password
) Unicode-Text sein.
Die Schlüsselbundbibliothek löst die folgenden Ausnahmen aus:
keyring.errors.KeyringError
: Basisfehlerklasse für alle Ausnahmen in der Schlüsselringbibliothek.keyring.errors.InitError
: Wird ausgelöst, wenn der Schlüsselbund nicht initialisiert werden kann.keyring.errors.PasswordSetError
: Wird ausgelöst, wenn das Passwort nicht im Schlüsselbund festgelegt werden kann.keyring.errors.PasswordDeleteError
: Wird ausgelöst, wenn das Passwort im Schlüsselbund nicht gelöscht werden kann. Python Keyring Lib ist ein offenes Community-Projekt und heißt Mitwirkende herzlich willkommen.
Für jedes integrierte Backend müssen möglicherweise Sicherheitsaspekte berücksichtigt werden, bevor diese Bibliothek verwendet wird. Autoren von Tools oder Bibliotheken, die keyring
verwenden, werden aufgefordert, diese Bedenken zu berücksichtigen.
Wie jede Liste bekannter Sicherheitsbedenken erhebt diese Liste keinen Anspruch auf Vollständigkeit. Bei Bedarf können weitere Probleme hinzugefügt werden.
keyring
derselben ausführbaren Python-Datei erstellt wurden, ohne dass das Betriebssystem den Benutzer zur Eingabe eines Kennworts auffordert. Um zu veranlassen, dass bei jedem Zugriff auf ein bestimmtes Geheimnis ein Kennwort abgefragt wird, suchen Sie die Anmeldeinformationen mit der Anwendung Keychain Access
und entfernen Sie Python
in den Einstellungen Access Control
aus der Liste der zulässigen Anwendungen.Dieses Projekt nutzt automatisierte Releases und kontinuierliche Integration. Der einfache Arbeitsablauf besteht darin, einen Commit zu markieren und ihn an Github zu übertragen. Wenn es die CI-Tests besteht, wird es automatisch auf PyPI bereitgestellt.
Weitere Dinge, die Sie bei einer Veröffentlichung beachten sollten:
Tests werden kontinuierlich in Github Actions ausgeführt.
Um die Tests lokal auszuführen, installieren Sie tox und rufen Sie es auf.
Das Projekt basierte auf der Idee von Tarek Ziade in diesem Beitrag. Kang Zhang führte es zunächst als Google Summer of Code-Projekt durch und Tarek betreute Kang bei diesem Projekt.
Verfügbar als Teil des Tidelift-Abonnements.
Dieses Projekt und die Betreuer Tausender anderer Pakete arbeiten mit Tidelift zusammen, um ein Unternehmensabonnement bereitzustellen, das alle von Ihnen verwendeten Open Source abdeckt.
Erfahren Sie mehr.