Eine Einführung zu Spring Cloud Vault

Eine Einführung in Spring Cloud Vault

1. Überblick

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

We assume here some Vault knowledge and that we have a test setup already up and running. Wenn dies nicht der Fall ist, nehmen wir uns einen Moment Zeit, um unsereVault Intro tutorialzu lesen, damit wir uns mit den Grundlagen vertraut machen können.

2. Federwolkengewölbe

Spring Cloud Vault ist eine relativ neue Erweiterung des Spring Cloud-Stacks, dieallows applications to access secrets stored in a Vault instance in a transparent way beträgt.

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. No code changes are required!

Dies ist möglich, weil es alsPropertySource mit hoher Priorität fungiert, die in den aktuellenEnvironment registriert sind.

Spring wird es daher immer dann verwenden, wenn eine Immobilie benötigt wird. Beispiele sindDataSource Eigenschaften,ConfigurationProperties, und so weiter.

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

Um diespring-cloud-vault-Bibliothek in ein Maven-basiertes Spring Boot-Projekt aufzunehmen, verwenden wir das zugehörigestarter-Artefakt, das alle erforderlichen Abhängigkeiten abruft.

Neben den wichtigstenstarter, enthalten wir auch diespring-vault-config-databases, die die Unterstützung für dynamische Datenbankanmeldeinformationen hinzufügen:


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


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

Die neueste Version vonSpring Cloud Vault starter kann von Maven Central heruntergeladen werden.

3.1. Grundkonfiguration

Damit Spring Cloud Vault ordnungsgemäß funktioniert, muss festgelegt werden, wo der Vault-Server kontaktiert und wie sich dieser authentifizieren soll.

Dazu geben wir die erforderlichen Informationen inbootstrap.yml oderbootstrap.properties an:

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

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

Note that this configuration has no authentication data. Im einfachsten Fall, wenn wir ein festes Token verwenden, können wir es über die Systemeigenschaftspring.cloud.vault.token oder eine Umgebungsvariable übergeben. Dieser Ansatz funktioniert gut in Verbindung mit Standard-Cloud-Konfigurationsmechanismen wie den ConfigMaps oder Docker-Geheimnissen von Kubernetes.

Spring Vault erfordert außerdem eine zusätzliche Konfiguration für jede Art von Geheimnis, die wir in unserer Anwendung verwenden möchten. In den folgenden Abschnitten wird beschrieben, wie wir zwei gängigen geheimen Typen Unterstützung hinzufügen können: Schlüssel / Wert und Datenbankanmeldeinformationen.

4. Verwenden des Generic Secrets-Backends

We use the Generic Secret backend to access unversioned secrets stored as Key-Value pairs in Vault.

Angenommen, wir haben bereits die Abhängigkeit vonspring-cloud-starter-vault-configinclasspath, müssen wir der Konfigurationsdateibootstrap.ymlder Anwendung lediglich einige Eigenschaften hinzufügen:

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

Die Eigenschaftapplication-name ist in diesem Fall optional. Wenn nicht angegeben, nimmt Spring stattdessen den Wert des Standardsspring.application.name an.

Wir können jetzt alle Schlüssel / Wert-Paare verwenden, die beisecret/fakebank gespeichert sind, wie alle anderenEnvironment-Eigenschaften.. Das folgende Snippet zeigt, wie wir den Wert desfoo-Schlüssels lesen können, der unter gespeichert ist dieser Pfad:

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

As we can see, the code itself knows nothing about 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 inbootstrap.yml aktivieren.

4.1. Ein Hinweis zu Federprofilen

Wenn verfügbar im aktuellenEnvironment, Spring Cloud Vaultwill use the available profile names as a suffix appended to the specified base path where key/value pairs will be searched.

Es wird auch nach Eigenschaften unter einem konfigurierbaren Standardanwendungspfad (mit und ohne Profilsuffix) gesucht, damit wir an einem einzigen Ort gemeinsame Geheimnisse 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 Profil vonproductionder Anwendung outfakebankaktiv ist:

  1. secret/fakebank_/production_ (higher priority)

  2. secret/fakebank

  3. secret/application/production

  4. secret/application (niedrigere Priorität)

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

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

5. Verwenden des geheimen Datenbank-Backends

The Database backend module allows Spring applications to use dynamically generated database credentials created by Vault. Spring Vault fügt diese Anmeldeinformationen unter den Standardeigenschaftenspring.datasource.username undspring.datasource.passwordein, sodass sie von regulärenDataSources ausgewählt werden können.

Bitte beachten Sie, dass wir vor Verwendung dieses Backends eine Datenbankkonfiguration und Rollen in Vault erstellen müssen, wie inour previous tutorial beschrieben.

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

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

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

Die wichtigste Eigenschaft hierbei ist die Eigenschaftrole, die einen in Vault gespeicherten Datenbankrollennamen enthält. Während des Bootstraps kontaktiert Spring Vault und fordert ihn auf, neue Anmeldeinformationen mit den entsprechenden Berechtigungen zu erstellen.

Der Tresor widerruft standardmäßig die Berechtigungen, die diesen Anmeldeinformationen zugeordnet sind, nach der konfigurierten Lebensdauer.

GlücklicherweiseSpring Vault will automatically renew the lease associated with the acquired credentials. Auf diese Weise bleiben die Anmeldeinformationen gültig, solange unsere Anwendung ausgeführt wird.

Lassen Sie uns diese Integration nun in Aktion sehen. Das folgende Snippet erhält eine neue Datenbankverbindung von einem von Spring verwaltetenDataSource:

Connection c = datasource.getConnection();

Once again, we can see that there is no sign of Vault usage in our code. Die gesamte Integration erfolgt auf der Ebene vonEnvironment, sodass unser Code wie gewohnt problemlos einem Unit-Test unterzogen werden kann.

6. Fazit

In diesem Tutorial haben wir gezeigt, wie Sie Vault mithilfe der Spring Vault-Bibliothek in Spring Boot integrieren. 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 inover on GitHub verfügbar.