Een geheim laden vanuit Azure Key Vault in een Spring Boot-toepassing

In deze zelfstudie leert u hoe u Key Vault in Spring Boot-toepassingen gebruikt om gevoelige configuratiegegevens te beveiligen en configuratie-eigenschappen op te halen uit Key Vault. Key Vault biedt beveiligde opslag van algemene geheimen, zoals wachtwoorden en databaseverbindingsreeksen.

Vereisten

Belangrijk

Spring Boot versie 2.5 of hoger is vereist om de stappen in dit artikel uit te voeren.

Een geheim instellen op Azure Key Vault

In deze zelfstudie wordt beschreven hoe u databasereferenties uit Key Vault leest in een Spring Boot-toepassing. Als u de referenties uit Key Vault wilt lezen, moet u eerst databasereferenties opslaan in Key Vault.

Als u de URL van een H2-database wilt opslaan als een nieuw geheim in Key Vault, raadpleegt u quickstart: Een geheim instellen en ophalen uit Azure Key Vault met behulp van de Azure-portal. In deze zelfstudie stelt u een geheim in met de naam h2url en waarde jdbc:h2:~/testdb;user=sa;password=password.

Notitie

Nadat u het geheim hebt ingesteld, verleent u uw app toegang tot Key Vault door de instructies te volgen in Toegangsbeleid voor Key Vault toewijzen.

Een geheim lezen uit Azure Key Vault

Nu de databasereferenties zijn opgeslagen in Key Vault, kunt u ze ophalen met Spring Cloud Azure.

Als u de Spring Cloud Azure Key Vault Starter-module wilt installeren, voegt u de volgende afhankelijkheden toe aan uw pom.xml-bestand :

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

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

    Notitie

    Als u Spring Boot 2.x gebruikt, moet u de spring-cloud-azure-dependencies versie instellen op 4.17.0. Deze stuklijst (Bill of Material) moet worden geconfigureerd in de <dependencyManagement> sectie van uw pom.xml-bestand . Dit zorgt ervoor dat alle Spring Cloud Azure-afhankelijkheden dezelfde versie gebruiken. Zie welke versie van Spring Cloud Azure moet ik gebruiken voor meer informatie over de versie die voor deze BOM wordt gebruikt.

  • Het Spring Cloud Azure Key Vault Starter-artefact:

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

Spring Cloud Azure heeft verschillende methoden voor het lezen van geheimen uit Key Vault. U kunt de volgende methoden onafhankelijk gebruiken of combineren voor verschillende use cases:

  • Gebruik Azure SDK voor Key Vault.
  • Spring KeyVault PropertySourcegebruiken.

Azure SDK gebruiken voor Key Vault

Azure SDK voor Key Vault biedt SecretClient het beheren van geheimen in Key Vault.

In het volgende codevoorbeeld ziet u hoe SecretClient u H2-databasereferenties ophaalt uit Azure Key Vault.

Als u een geheim wilt lezen met behulp van Azure SDK vanuit Key Vault, configureert u de toepassing door de volgende stappen uit te voeren:

  1. Configureer een Key Vault-eindpunt in het configuratiebestand application.properties .

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. Injecteer de SecretClient bean in uw Spring-toepassing en gebruik de getSecret methode om een geheim op te halen, zoals wordt weergegeven in het volgende voorbeeld:

    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());
        }
    }
    

    Tip

    In deze zelfstudie zijn er geen verificatiebewerkingen in de configuraties of de code. Voor het maken van verbinding met Azure-services is echter verificatie vereist. Als u de verificatie wilt voltooien, moet u Azure Identity gebruiken. Spring Cloud Azure maakt gebruik DefaultAzureCredentialvan, die de Azure Identity-bibliotheek biedt om u te helpen referenties op te halen zonder dat er codewijzigingen zijn aangebracht.

    DefaultAzureCredential ondersteunt meerdere verificatiemethoden en bepaalt welke methode tijdens runtime moet worden gebruikt. Met deze aanpak kan uw app verschillende verificatiemethoden gebruiken in verschillende omgevingen (zoals lokale en productieomgevingen) zonder omgevingsspecifieke code te implementeren. Zie DefaultAzureCredential voor meer informatie.

    Als u de verificatie in lokale ontwikkelomgevingen wilt voltooien, kunt u Azure CLI, Visual Studio Code, PowerShell of andere methoden gebruiken. Zie Azure-verificatie in Java-ontwikkelomgevingen voor meer informatie. Als u de verificatie in Azure-hostingomgevingen wilt voltooien, raden we u aan om een door de gebruiker toegewezen beheerde identiteit te gebruiken. Zie Wat zijn beheerde identiteiten voor Azure-resources? voor meer informatie.

  3. Start de toepassing. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

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

U kunt de SecretClient bean zelf bouwen, maar het proces is ingewikkeld. In Spring Boot-toepassingen moet u eigenschappen beheren, het opbouwpatroon leren en de client registreren bij de context van uw Spring-toepassing. In het volgende codevoorbeeld ziet u hoe u een SecretClient bean bouwt:

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 de volgende lijst ziet u enkele redenen waarom deze code niet flexibel of correct is:

  • Het Key Vault-eindpunt is vastgelegd in code.
  • Als u @Value configuraties uit de Spring-omgeving wilt ophalen, kunt u geen IDE-hints hebben in het bestand application.properties .
  • Als u een microservicescenario hebt, moet de code in elk project worden gedupliceerd en kunt u eenvoudig fouten maken en moeilijk consistent zijn.

Gelukkig is het bouwen van de SecretClient bean zelf niet nodig met Spring Cloud Azure. In plaats daarvan kunt u de configuratie-eigenschappen waarmee u al bekend bent, rechtstreeks injecteren SecretClient en gebruiken om Key Vault te configureren. Zie Configuratievoorbeelden voor meer informatie.

Spring Cloud Azure biedt ook de volgende globale configuraties voor verschillende scenario's. Zie de sectie Globale configuratie voor Azure Service SDK's van de Spring Cloud Azure-ontwikkelaarshandleiding voor meer informatie.

  • Proxyopties.
  • Opties voor opnieuw proberen.
  • Opties voor HTTP-transportclient.

U kunt ook verbinding maken met verschillende Azure-clouds. Zie Verbinding maken naar verschillende Azure-clouds voor meer informatie.

Spring Key Vault PropertySource gebruiken

In de CommandLineRunner vorige secties hebt u gezien hoe SecretClient u het geheim kunt lezen nadat de toepassing is gestart. In Spring Boot-toepassingen is het lezen van geheimen echter vereist voordat de toepassing wordt gestart. De eigenschap wachtwoord voor de gegevensbron is bijvoorbeeld vereist voordat de toepassing wordt gestart. Het vorige scenario werkt niet als u het wachtwoord voor de gegevensbron wilt opslaan in Key Vault en nog steeds de automatische spring-configuratie gebruikt om een gegevensbron op te halen.

In dit geval biedt Spring Cloud Azure Spring-omgevingsintegratie om geheimen uit Key Vault te laden voordat u de toepassingscontext bouwt. U kunt het geheim gebruiken om de bean te maken en te configureren tijdens de initialisatie van de Spring-toepassingscontext. Deze benadering is een transparante manier om toegang te krijgen tot geheimen vanuit Key Vault en er zijn geen codewijzigingen vereist.

In het volgende codevoorbeeld ziet u hoe PropertySource u H2-databasereferenties kunt ophalen om de gegevensbron te bouwen uit Azure Key Vault.

Als u de URL van een H2-database wilt ophalen uit Key Vault en gegevens uit de H2-database wilt opslaan met spring Data JPA, configureert u de toepassing door de volgende stappen uit te voeren:

  1. Voeg de volgende eigenschappen van het Key Vault-eindpunt en de gegevensbron toe aan het configuratiebestand application.properties .

    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
    

    Tip

    Zie de sectie Configuratievoorbeelden van de Spring Cloud Azure-ontwikkelaarshandleiding voor Spring Cloud Azure voor voorbeelden van eigenschappen.

    Tip

    Dit voorbeeld is een eenvoudig databasescenario met behulp van een H2-database. U wordt aangeraden Azure Database for MySQL of Azure Database for PostgreSQL te gebruiken in een productieomgeving en database-URL, gebruikersnaam en wachtwoord op te slaan in Azure Key Vault. Als u het wachtwoord wilt vermijden, is verbindingen zonder wachtwoord een goede keuze. Zie verbindingen zonder wachtwoord voor Azure-services voor meer informatie.

  2. Maak een nieuwe Todo Java-klasse. Deze klasse is een domeinmodel dat is toegewezen aan de todo tabel die automatisch wordt gemaakt door JPA. De volgende code negeert de getters en 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. Bewerk het opstartklassebestand om de volgende inhoud weer te geven.

    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. Start de toepassing. De toepassing haalt de URL van de H2-database op uit Key Vault, maakt vervolgens verbinding met de H2-database en slaat gegevens op in de database. U ziet logboeken die vergelijkbaar zijn met het volgende voorbeeld:

    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
    

Implementeren in Azure Spring Apps

Nu de Spring Boot-toepassing lokaal wordt uitgevoerd, is het tijd om deze naar productie te verplaatsen. Met Azure Spring Apps kunt u Eenvoudig Spring Boot-toepassingen implementeren in Azure zonder codewijzigingen. De service beheert de infrastructuur van Spring-toepassingen, zodat ontwikkelaars zich kunnen richten op hun code. Azure Spring Apps biedt levenscyclusbeheer met uitgebreide bewaking en diagnose, configuratiebeheer, servicedetectie, CI/CD-integratie, blauwgroene implementaties en meer. Zie Uw eerste toepassing implementeren in Azure Spring Apps om uw toepassing te implementeren in Azure Spring Apps.

Volgende stappen