Eine Einführung in Spring Cloud Vault

1. Übersicht

In diesem Tutorial zeigen wir, wie wir Hashicorps Vault in Spring Boot-Anwendungen verwenden können, um vertrauliche Konfigurationsdaten zu sichern.

Wir gehen hier von einigen Vault-Kenntnissen aus und haben bereits ein Test-Setup eingerichtet . Wenn dies nicht der Fall ist, nehmen Sie sich einen Moment Zeit, um unser Vault Intro-Tutorial zu lesen, damit wir uns mit den Grundlagen vertraut machen können.

2. Spring Cloud Vault

Spring Cloud Vault ist eine relativ neue Erweiterung des Spring Cloud-Stacks, mit der Anwendungen auf transparente Weise auf Geheimnisse zugreifen können, die in einer Vault-Instanz gespeichert sind .

Im Allgemeinen ist die Migration zu Vault ein sehr einfacher Vorgang: Fügen Sie einfach die erforderlichen Bibliotheken hinzu und fügen Sie unserem Projekt einige zusätzliche Konfigurationseigenschaften hinzu, und schon kann es losgehen. Es sind keine Codeänderungen erforderlich!

Dies ist möglich, da es sich um eine PropertySource mit hoher Priorität handelt, die in der aktuellen Umgebung registriert ist .

Als solches wird Spring es verwenden, wenn eine Eigenschaft benötigt wird. Beispiele hierfür sind DataSource- Eigenschaften, ConfigurationProperties usw.

3. Hinzufügen von Spring Cloud Vault zu einem Spring Boot-Projekt

Um die Spring-Cloud-Vault- Bibliothek in ein Maven-basiertes Spring Boot-Projekt aufzunehmen, verwenden wir das zugehörige Starter- Artefakt, mit dem alle erforderlichen Abhängigkeiten abgerufen werden.

Neben dem Hauptstarter, werden wir auch die Feder-Gewölbe-config-Datenbanken , die Unterstützung für dynamische Datenbank - Anmeldeinformationen ergänzt:

 org.springframework.cloud spring-cloud-starter-vault-config   org.springframework.cloud spring-cloud-vault-config-databases 

Die neueste Version des Spring Cloud Vault-Starters kann von Maven Central heruntergeladen werden.

3.1. Basiseinstellung

Damit Spring Cloud Vault ordnungsgemäß funktioniert, muss ermittelt werden, wo der Vault-Server kontaktiert werden soll und wie er sich dagegen authentifizieren kann.

Dazu stellen wir die erforderlichen Informationen in der Datei bootstrap.yml oder bootstrap.properties bereit :

# bootstrap.yml spring: cloud: vault: uri: //localhost:8200 ssl: trust-store: classpath:/vault.jks trust-store-password: changeit 

Die Eigenschaft spring.cloud.vault.uri verweist auf die API-Adresse von Vault. Da unsere Testumgebung HTTPS mit einem selbstsignierten Zertifikat verwendet, müssen wir auch einen Schlüsselspeicher bereitstellen, der den öffentlichen Schlüssel enthält.

Beachten Sie, dass diese Konfiguration keine Authentifizierungsdaten enthält . Im einfachsten Fall, wenn wir ein festes Token verwenden, können wir es über die Systemeigenschaft spring.cloud.vault.token oder eine Umgebungsvariable übergeben. Dieser Ansatz funktioniert gut in Verbindung mit Standard-Cloud-Konfigurationsmechanismen wie ConfigMaps oder Docker-Geheimnissen von Kubernetes.

Spring Vault erfordert außerdem eine zusätzliche Konfiguration für jeden Geheimtyp, den wir in unserer Anwendung verwenden möchten. In den folgenden Abschnitten wird beschrieben, wie Sie zwei gängigen Geheimtypen unterstützen können: Schlüssel / Wert und Datenbankanmeldeinformationen.

4. Verwenden des generischen Secrets-Backends

Wir verwenden das generische geheime Backend, um auf nicht versionierte Geheimnisse zuzugreifen, die als Schlüssel-Wert-Paare in Vault gespeichert sind .

Angenommen, wir haben bereits die Spring-Cloud-Starter-Vault-Konfigurationsabhängigkeit in unserem Klassenpfad . Alles, was wir tun müssen, ist, der Konfigurationsdatei bootstrap.yml der Anwendung einige Eigenschaften hinzuzufügen :

spring: cloud: vault: # other vault properties omitted ... generic: enabled: true application-name: fakebank 

Die Eigenschaft Anwendungsname ist in diesem Fall optional. Wenn nicht angegeben, nimmt Spring stattdessen den Wert des Standardnamens spring.application.name an.

Wir können nun alle Schlüssel / Wert - Paare an gespeicherten verwenden secret / fakebank wie jede andere Umwelt Eigenschaft . Das folgende Snippet zeigt, wie wir den Wert des unter diesem Pfad gespeicherten foo- Schlüssels lesen können :

@Autowired Environment env; public String getFoo() { return env.getProperty("foo"); } 

Wie wir sehen können, weiß der Code selbst nichts über Vault, was gut ist! Wir können weiterhin feste Eigenschaften in lokalen Tests verwenden und nach Belieben zu Vault wechseln, indem wir nur eine einzelne Eigenschaft in bootstrap.yml aktivieren .

4.1. Ein Hinweis zu Federprofilen

Wenn in der aktuellen Umgebung verfügbar , verwendet Spring Cloud Vault die verfügbaren Profilnamen als Suffix, das an den angegebenen Basispfad angehängt wird, in dem Schlüssel / Wert-Paare durchsucht werden .

Es wird auch nach Eigenschaften unter einem konfigurierbaren Standardanwendungspfad (mit und ohne Profilsuffix) gesucht, damit wir gemeinsame Geheimnisse an einem einzigen Ort haben können. Verwenden Sie diese Funktion mit Vorsicht!

Zusammenfassend lässt sich sagen , dass Spring Vault nach Eigenschaften sucht, die unter den folgenden Pfaden gespeichert sind, wenn das Produktionsprofil unserer Fakebank- Anwendung aktiv ist:

  1. Geheimnis / Fakebank / Produktion (höhere Priorität)
  2. Geheimnis / Fakebank
  3. Geheimnis / Anwendung / Produktion
  4. Geheimnis / Anwendung (niedrigere Priorität)

In der vorhergehenden Liste ist application der Name, den Spring als zusätzlichen Standardspeicherort für Geheimnisse verwendet. Wir können es mit der Eigenschaft spring.cloud.vault.generic.default-context ändern .

Eigenschaften, die unter dem spezifischsten Pfad gespeichert sind, haben Vorrang vor den anderen. Wenn beispielsweise dieselbe Eigenschaft foo unter den obigen Pfaden verfügbar ist, lautet die Rangfolge:

5. Verwenden des geheimen Datenbank-Backends

Mit dem Datenbank-Backend-Modul können Spring-Anwendungen dynamisch generierte Datenbankanmeldeinformationen verwenden, die von Vault erstellt wurden . Spring Vault fügt diese Anmeldeinformationen unter den Standardeigenschaften spring.datasource.username und spring.datasource.password ein, damit sie von regulären DataSource- Dateien ausgewählt werden können .

Bitte beachten Sie, dass wir vor der Verwendung dieses Backends eine Datenbankkonfiguration und Rollen in Vault erstellen müssen, wie in unserem vorherigen Lernprogramm beschrieben.

Um von Vault generierte Datenbankanmeldeinformationen in unserer Spring-Anwendung verwenden zu können, müssen die Spring-Cloud-Vault-Konfigurationsdatenbanken zusammen mit dem entsprechenden JDBC-Treiber im Klassenpfad des Projekts vorhanden sein.

Wir müssen auch die Verwendung in unserer Anwendung aktivieren, indem wir unserer bootstrap.yml einige Eigenschaften hinzufügen :

spring: cloud: vault: # ... other properties omitted database: enabled: true role: fakebank-accounts-rw

Die wichtigste Eigenschaft ist hier die Rolle Eigenschaft, die eine Datenbank Rollennamen in Vault gespeichert hält. Während des Bootstraps kontaktiert Spring Vault und fordert Sie auf, neue Anmeldeinformationen mit den entsprechenden Berechtigungen zu erstellen.

Der Tresor widerruft standardmäßig die mit diesen Anmeldeinformationen verknüpften Berechtigungen nach der konfigurierten Lebensdauer.

Glücklicherweise erneuert Spring Vault automatisch den Mietvertrag, der mit den erworbenen Anmeldeinformationen verknüpft ist. Auf diese Weise bleiben die Anmeldeinformationen gültig, solange unsere Anwendung ausgeführt wird.

Lassen Sie uns nun diese Integration in Aktion sehen. Das folgende Snippet ruft eine neue Datenbankverbindung von einer von Spring verwalteten DataSource ab :

Connection c = datasource.getConnection(); 

Wieder einmal können wir sehen, dass unser Code keine Anzeichen für die Verwendung von Vault enthält . Die gesamte Integration erfolgt auf Umgebungsebene , sodass unser Code wie gewohnt problemlos einem Unit-Test unterzogen werden kann.

6. Fazit

In diesem Tutorial haben wir gezeigt, wie Vault mithilfe der Spring Vault-Bibliothek in Spring Boot integriert wird. Wir haben zwei häufige Anwendungsfälle behandelt: generische Schlüssel / Wert-Paare und Anmeldeinformationen für dynamische Datenbanken.

Ein Beispielprojekt mit allen erforderlichen Abhängigkeiten, Integrationstests und Tresor-Setup-Skripten ist auf GitHub verfügbar.