enhancement
major
minor
defect
critical
major
minor
major
#30267
Geheimnisse aus der Administration setzen und entfernen, beschreibbare Verzeichnis-Ablage
Kontext
Die Administration der React-Oberfläche zeigt unter System → Geheimnisse alle Geheimnisse, auf die die Konfigurationen der laufenden Dienste verweisen, und ob sie verfügbar sind (#29948). Ein fehlendes Geheimnis lässt sich dort bisher nur feststellen; bereitgestellt werden muss es außerhalb der Anwendung (Umgebungsvariable, Datei, Vault).
Die Ablage DirectorySecretStore liest jedes Geheimnis aus der gleichnamigen Datei eines Verzeichnisses. In einem Container sind das die eingehängten Secret-Dateien (Kubernetes, Docker), die schreibgeschützt sind. In einer einfachen Installation (WAR in einem Tomcat, Debian-Paket, Entwicklerrechner mit ~/.top-logic/secrets) ist das Verzeichnis dagegen für die Anwendung beschreibbar. Die Schnittstelle zum Schreiben von Geheimnissen (WritableSecretStore, SecretStoreService#getWritableStore()) gab es bereits, beschreibbar war aber nur DatabaseSecretStore, und keine Oberfläche nutzte sie.
Nach diesem Ticket kann ein Administrator ein benanntes Geheimnis direkt in der Übersicht setzen, ersetzen und entfernen, sofern die Ablage der Installation das zulässt. Der Wert eines Geheimnisses wird weiterhin nie angezeigt.
Verhalten
- Beschreibbare Verzeichnis-Ablage: DirectorySecretStore ist beschreibbar, solange die Anwendung in das Verzeichnis schreiben darf (geprüft bei jeder Anfrage). Für ein einzelnes Geheimnis entscheidet die Datei: Existiert sie, muss sie beschreibbar sein, sonst das Verzeichnis. Eine schreibgeschützt eingehängte Secret-Datei eines Containers wird damit nie überschrieben. Ein Geheimnis wird atomar geschrieben (temporäre Datei, dann Umbenennen), mit Lese- und Schreibrecht nur für den Besitzer, wo das Dateisystem POSIX-Rechte kennt. Ein fehlendes Verzeichnis wird nicht angelegt.
- Übersicht der Geheimnisse: Für die ausgewählte Zeile bieten „Geheimnis setzen“ und „Geheimnis entfernen“ an, das Geheimnis zu schreiben bzw. zu löschen. Der neue Wert wird in einem Dialog in ein Passwortfeld eingegeben. „Geheimnis setzen“ ist nur aktiv, wenn das Geheimnis über seinen Namen bezogen wird und ein Schreiben tatsächlich wirkt: Die Ablage ist beschreibbar, für den Namen gibt es keine Ausnahme (overrides), und keine Ablage, die in einer Kette (ChainSecretStore) vor der beschreibbaren steht, hält das Geheimnis bereits (auch nicht mit einem Fehler beim Lesen). „Geheimnis entfernen“ verlangt zusätzlich, dass die beschreibbare Ablage das Geheimnis hält; ein Geheimnis aus einer Ablage hinter ihr (z. B. ein Wert in der Konfiguration) kann überschrieben, aber nicht entfernt werden. Ein deaktivierter Befehl nennt den Grund. Nach dem Schreiben wird die Übersicht neu geprüft, die Zeile bleibt ausgewählt. Da Geheimnisse bei jeder Benutzung gelesen werden, wirkt die Änderung ohne Neustart, wo der Dienst das Geheimnis nicht nur beim Start liest.
- Das gilt für jede beschreibbare Ablage, also auch für DatabaseSecretStore, mit dem Geheimnisse auch in einer Installation mit mehreren Knoten gemeinsam verwaltet werden.
Technische Hinweise
- WritableSecretStore#canStore(name) (Standard: true) beantwortet, ob ein Geheimnis dieses Namens geschrieben werden kann und dann unter dem Namen geliefert wird. DirectorySecretStore liefert eine beschreibbare Sicht über getWritableStore() nur bei beschreibbarem Verzeichnis und beantwortet canStore über die Rechte von Datei bzw. Verzeichnis.
- Die beschreibbare Sicht von ChainSecretStore wird bei jeder Anfrage ermittelt und verneint canStore für einen Namen, den eine vorangehende Ablage der Kette hält.
- SecretStoreService#canStore(name) / canRemove(name) / store(name, secret) / remove(name) (und die statischen Varianten canStoreSecret, canRemoveSecret, storeSecret, removeSecret) prüfen Ausnahme, beschreibbare Ablage und canStore und melden einen nicht möglichen Schreibvorgang mit dem Grund.
- SecretReference#getSecretName() liefert den Namen eines über seinen Namen bezogenen Geheimnisses.
- Die Übersicht nutzt die TL-Script-Funktionen secretStorable, secretRemovable, secretStore und secretRemove (SecretFunctions) und den Dialog admin/system/set-secret.view.xml; der Wert gelangt nur in secretStore und wird weder protokolliert noch zurückgegeben.
- Entwickler-Artikel credentials/secret-stores beschreibt das Schreiben von Geheimnissen.