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
- Een Azure-abonnement (u kunt een gratis abonnement maken).
- Java Development Kit (JDK) versie 8 of hoger.
- Apache Maven
- Azure-CLI
- Een Key Vault-exemplaar. Als u nog geen sleutelkluis hebt, raadpleegt u quickstart: Een sleutelkluis maken met behulp van Azure Portal. Noteer ook de URI van het Key Vault-exemplaar, omdat u deze nodig hebt voor de testtoepassing voor deze zelfstudie.
- Een Spring Boot-toepassing. Als u er nog geen hebt, maakt u een Maven-project met de Spring Initializr. Zorg ervoor dat u Maven-project selecteert en onder Afhankelijkheden de Afhankelijkheden van Spring Web, Spring Data JPA en H2 Database toevoegt en vervolgens Java-versie 8 of hoger selecteert.
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.19.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 op4.19.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
PropertySource
gebruiken.
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:
Configureer een Key Vault-eindpunt in het configuratiebestand application.properties .
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
Injecteer de
SecretClient
bean in uw Spring-toepassing en gebruik degetSecret
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
DefaultAzureCredential
van, 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.
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 met 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:
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.
Maak een nieuwe
Todo
Java-klasse. Deze klasse is een domeinmodel dat is toegewezen aan detodo
tabel die automatisch wordt gemaakt door JPA. De volgende code negeert degetters
ensetters
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; }
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> { }
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.