Freigeben über


Einlesen eines Geheimnisses aus Azure Key Vault in eine Spring Boot-Anwendung

In diesem Lernprogramm erfahren Sie, wie Sie Key Vault in Spring Boot-Anwendungen verwenden, um vertrauliche Konfigurationsdaten zu sichern und Konfigurationseigenschaften aus Key Vault abzurufen. Key Vault bietet einen sicheren Speicher für generische Geheimnisse wie z. B. Kennwörter und Datenbankverbindungszeichenfolgen.

Voraussetzungen

Wichtig

Für die Schritte in diesem Artikel wird mindestens die Spring Boot-Version 2.5 benötigt.

So legen Sie für Azure Key Vault ein Geheimnis fest

In diesem Lernprogramm wird beschrieben, wie Sie Datenbankanmeldeinformationen aus Key Vault in einer Spring Boot-Anwendung lesen. Um die Anmeldeinformationen aus Key Vault zu lesen, sollten Sie zuerst Datenbankanmeldeinformationen im Key Vault speichern.

Informationen zum Speichern der URL einer H2-Datenbank als neues Geheimnis in Key Vault finden Sie unter Schnellstart: Festlegen und Abrufen eines geheimen Schlüssels aus Azure Key Vault über das Azure-Portal. In diesem Lernprogramm legen Sie einen geheimen Schlüssel mit Namen h2url und Wert jdbc:h2:~/testdb;user=sa;password=password fest.

Hinweis

Nachdem Sie den geheimen Schlüssel festgelegt haben, gewähren Sie Ihrer App Zugriff auf Key Vault, indem Sie die Anweisungen unter Zuweisen einer Key Vault-Zugriffsrichtlinie befolgen.

Lesen eines Secrets aus Azure Key Vault

Nachdem die Datenbankanmeldeinformationen im Key Vault gespeichert wurden, können Sie sie mit Spring Cloud Azure abrufen.

Um das Spring Cloud Azure Key Vault-Startermodul zu installieren, fügen Sie Ihrer pom.xml-Datei die folgenden Abhängigkeiten hinzu:

  • Die Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.18.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Hinweis

    Wenn Sie Spring Boot 2.x verwenden, stellen Sie sicher, dass Sie die spring-cloud-azure-dependencies Version auf 4.19.0 festlegen. Diese Stückliste (Bill of Material, BOM) sollte im <dependencyManagement> Abschnitt Ihrer pom.xml Datei konfiguriert werden. Dadurch wird sichergestellt, dass alle Spring Cloud Azure-Abhängigkeiten dieselbe Version verwenden. Weitere Informationen zu der Version, die für diese BOM verwendet wird, finden Sie unter Welche Version von Spring Cloud Azure sollte ich verwenden.

  • Das Spring Cloud Azure Key Vault Starter-Artefakt:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    

Spring Cloud Azure verfügt über mehrere Methoden zum Lesen geheimer Schlüssel aus Key Vault. Sie können die folgenden Methoden unabhängig voneinander verwenden oder für unterschiedliche Anwendungsfälle kombinieren:

  • Verwenden Sie Azure SDK für Key Vault.
  • Verwenden Sie Spring KeyVault PropertySource.

Verwenden Sie Azure SDK für Key Vault

Das Azure SDK für Key Vault bietet die SecretClient Verwaltung geheimer Schlüssel im Key Vault.

Im folgenden Codebeispiel wird gezeigt, wie Sie SecretClient verwenden, um H2-Datenbankanmeldeinformationen aus Azure Key Vault abzurufen.

Um einen geheimen Schlüssel mithilfe des Azure SDK aus Key Vault zu lesen, konfigurieren Sie die Anwendung wie folgt:

  1. Konfigurieren Sie einen Key Vault-Endpunkt in der Konfigurationsdatei application.properties.

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. Fügen Sie die SecretClient Bean in Ihre Spring-Anwendung ein, und verwenden Sie die getSecret Methode, um einen geheimen Schlüssel abzurufen, wie im folgenden Beispiel gezeigt:

    import com.azure.security.keyvault.secrets.SecretClient;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class SecretClientApplication implements CommandLineRunner {
    
        // Spring Cloud Azure will automatically inject SecretClient in your ApplicationContext.
        private final SecretClient secretClient;
    
        public SecretClientApplication(SecretClient secretClient) {
            this.secretClient = secretClient;
        }
    
        public static void main(String[] args) {
            SpringApplication.run(SecretClientApplication.class, args);
        }
    
        @Override
        public void run(String... args) {
            System.out.println("h2url: " + secretClient.getSecret("h2url").getValue());
        }
    }
    

    Tipp

    In diesem Lernprogramm gibt es keine Authentifizierungsvorgänge in den Konfigurationen oder im Code. Für die Verbindung mit dem Azure-Diensten ist jedoch eine Authentifizierung erforderlich. Um die Authentifizierung abzuschließen, müssen Sie Azure Identity verwenden. Spring Cloud Azure verwendet DefaultAzureCredential, was die Azure Identity-Bibliothek bereitstellt, um Sie beim Abrufen von Anmeldeinformationen ohne Codeänderungen zu unterstützen.

    DefaultAzureCredential“ unterstützt mehrere Authentifizierungsmethoden und bestimmt, welche Methode zur Laufzeit verwendet wird. Mit diesem Ansatz kann Ihre Anwendung verschiedene Authentifizierungsmethoden in unterschiedlichen Umgebungen verwenden (z. B. in lokalen oder Produktionsumgebungen), ohne dass umgebungsspezifischer Code implementiert werden muss. Weitere Informationen finden Sie unter DefaultAzureCredential.

    Um die Authentifizierung in lokalen Entwicklungsumgebungen abzuschließen, können Sie Azure CLI, Visual Studio Code, PowerShell oder andere Methoden verwenden. Weitere Informationen finden Sie unter Azure-Authentifizierung in Java-Entwicklungsumgebungen. Um die Authentifizierung in Azure-Hostingumgebungen abzuschließen, empfehlen wir die Verwendung einer benutzerzugewiesenen verwalteten Identität. Weitere Informationen finden Sie unter Was sind verwaltete Identitäten für Azure-Ressourcen?.

  3. Starten Sie die Anwendung. Ihnen wird daraufhin Protokolle angezeigt, die in etwa wie im folgenden Beispiel aussehen:

    h2url: jdbc:h2:~/testdb;user=sa;password=password
    

Sie können die SecretClient Bean selbst erstellen, aber der Prozess ist kompliziert. In Spring Boot-Anwendungen müssen Sie Eigenschaften verwalten, das Generatormuster erlernen und den Client in Ihrem Spring-Anwendungskontext registrieren. Das folgende Codebeispiel zeigt, wie Sie eine SecretClient Bean erstellen:

import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SecretClientConfiguration {

    @Bean
    public SecretClient createSecretClient() {
        return new SecretClientBuilder()
            .vaultUrl("https://<your-key-vault-url>.vault.azure.net/")
            .credential(new DefaultAzureCredentialBuilder().build())
            .buildClient();
    }

}

In der folgenden Liste sind einige der Gründe aufgeführt, warum dieser Code nicht flexibel oder ordnungsgemäß ist:

  • Der Key Vault-Endpunkt ist hartcodiert.
  • Wenn Sie @Value verwenden, um Konfigurationen aus der Spring-Umgebung zu erhalten, können Sie keine IDE-Hinweise in Ihrer application.properties-Datei haben.
  • Wenn Sie über ein Microservice-Szenario verfügen, muss der Code in jedem Projekt dupliziert werden, und es ist einfach, Fehler zu machen und schwer konsistent zu sein.

Glücklicherweise ist das Erstellen der SecretClient Bean selbst mit Spring Cloud Azure nicht erforderlich. Stattdessen können Sie die Konfigurationseigenschaften, mit denen Sie bereits vertraut sind, direkt einfügen SecretClient und verwenden, um Key Vault zu konfigurieren. Weitere Informationen finden Sie in den Konfigurationsbeispielen.

Spring Cloud Azure bietet auch die folgenden globalen Konfigurationen für verschiedene Szenarien. Weitere Informationen finden Sie im Abschnitt Globale Konfiguration für Azure Service SDKs des Azure-Entwicklerhandbuchs für Spring Cloud.

  • Proxy-Optionen.
  • Wiederholungsoptionen.
  • HTTP-Transportclientoptionen.

Sie können auch eine Verbindung mit verschiedenen Azure-Clouds herstellen. Weitere Informationen finden Sie unter Herstellen einer Verbindung mit verschiedenen Azure-Clouds.

Verwenden von Spring Key Vault PropertySource

In den vorherigen Abschnitten wurde gezeigt, wie Sie SecretClient in CommandLineRunner verwenden, um den geheimen Schlüssel nach dem Start der Anwendung lesen zu können. In Spring Boot-Anwendungen ist jedoch das Lesen geheimer Schlüssel erforderlich, bevor die Anwendung gestartet wird. Die Eigenschaft des Datenquellenkennworts ist z. B. erforderlich, bevor die Anwendung gestartet wird. Das vorherige Szenario funktioniert nicht, wenn Sie das Datenquellenkennwort im Key Vault speichern und weiterhin die automatische Spring-Konfiguration verwenden möchten, um eine Datenquelle abzurufen.

In diesem Fall bietet Spring Cloud Azure die Integration der Spring-Umgebung, um geheime Schlüssel aus Key Vault zu laden, bevor der Anwendungskontext erstellt wird. Sie können den geheimen Schlüssel verwenden, um die Bean während der Initialisierung des Spring-Anwendungskontexts zu erstellen und zu konfigurieren. Dieser Ansatz ist eine transparente Möglichkeit für Sie, auf geheime Schlüssel vom Key Vault zuzugreifen, und es sind keine Codeänderungen erforderlich.

Im folgenden Codebeispiel wird gezeigt, wie Sie PropertySource verwenden, um H2-Datenbankanmeldeinformationen abzurufen und die Datenquelle aus Azure Key Vault zu erstellen.

Um die URL einer H2-Datenbank aus Key Vault abzurufen und Daten aus der H2-Datenbank mithilfe von Spring Data JPA zu speichern, konfigurieren Sie die Anwendung folgendermaßen:

  1. Fügen Sie der Konfigurationsdatei application.properties die folgenden Key Vault-Endpunkt- und Datenquelleneigenschaften hinzu.

    logging.level.org.hibernate.SQL=DEBUG
    
    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=https://<your-keyvault-name>.vault.azure.net/
    spring.datasource.url=${h2url}
    
    spring.jpa.hibernate.ddl-auto=create-drop
    spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
    

    Tipp

    Beispiele für die Konfiguration der Spring Cloud Azure-Eigenschaft finden Sie im Abschnitt Konfigurationsbeispiele des Azure-Entwicklerhandbuchs für Spring Cloud.

    Tipp

    Dieses Beispiel ist ein einfaches Datenbankszenario mit einer H2-Datenbank. Es wird empfohlen, Azure-Datenbank for MySQL oder Azure-Datenbank for PostgreSQL in einer Produktionsumgebung zu verwenden und Datenbank-URL, Benutzername und Kennwort in Azure Key Vault zu speichern. Wenn Sie das Kennwort vermeiden möchten, sind kennwortlose Verbindungen eine gute Wahl. Weitere Informationen finden Sie unter Kennwortlose Verbindungen für Azure-Dienste.

  2. Erstellen Sie eine neue Todo Java-Klasse. Diese Klasse ist ein Domänenmodell, das in der todo Tabelle zugeordnet wird, die automatisch von JPA erstellt wird. Der folgende Code ignoriert die getters- und setters-Methoden:

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Todo {
    
        public Todo() {
        }
    
        public Todo(String description, String details, boolean done) {
            this.description = description;
            this.details = details;
            this.done = done;
        }
    
        @Id
        @GeneratedValue
        private Long id;
    
        private String description;
    
        private String details;
    
        private boolean done;
    
    }
    
  3. Bearbeiten Sie die Startklassendatei, um den folgenden Inhalt anzuzeigen.

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.context.event.ApplicationReadyEvent;
    import org.springframework.context.ApplicationListener;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import java.util.stream.Stream;
    
    @SpringBootApplication
    public class KeyvaultApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(KeyvaultApplication.class, args);
        }
    
        @Bean
        ApplicationListener<ApplicationReadyEvent> basicsApplicationListener(TodoRepository repository) {
            return event->repository
                .saveAll(Stream.of("A", "B", "C").map(name->new Todo("configuration", "congratulations, you have set up "
                    + "correctly!", true)).toList())
                .forEach(System.out::println);
        }
    
    }
    
    interface TodoRepository extends JpaRepository<Todo, Long> {
    
    }
    
  4. Starten Sie die Anwendung. Die Anwendung ruft die URL der H2-Datenbank aus Key Vault ab, stellt dann eine Verbindung mit der H2-Datenbank her und speichert Daten mit der Datenbank. Ihnen wird daraufhin Protokolle angezeigt, die in etwa wie im folgenden Beispiel aussehen:

    2023-01-13 15:51:35.498 DEBUG 5616 --- [main] org.hibernate.SQL: insert into todo (description, details, done, id) values (?, ?, ?, ?)
    com.contoso.keyvault.Todo@1f
    

Bereitstellen in Azure Spring Apps

Nachdem Sie nun die Spring Boot-Anwendung lokal ausgeführt haben, ist es an der Zeit, sie in die Produktion zu verschieben. Mit Azure Spring Apps lassen sich Spring Boot-Anwendungen ganz einfach und ohne Codeänderungen in Azure bereitstellen. Der Dienst verwaltet die Infrastruktur von Spring-Anwendungen und ermöglicht es Entwicklern dadurch, sich auf ihren Code zu konzentrieren. Azure Spring Apps bietet eine Lebenszyklusverwaltung mit umfassender Überwachung und Diagnose, Konfigurationsverwaltung, Dienstermittlung, CI/CD-Integration, Blau/Grün-Bereitstellungen und mehr. Informationen zum Bereitstellen Ihrer Anwendung in Azure Spring Apps finden Sie unter Bereitstellen Ihrer ersten Anwendung in Azure Spring Apps.

Nächste Schritte