Ładowanie wpisu tajnego z usługi Azure Key Vault w aplikacji Spring Boot
W tym samouczku pokazano, jak używać usługi Key Vault w aplikacjach Spring Boot do zabezpieczania poufnych danych konfiguracji i pobierania właściwości konfiguracji z usługi Key Vault. Usługa Key Vault zapewnia bezpieczny magazyn ogólnych wpisów tajnych, takich jak hasła i parametry połączenia bazy danych.
Wymagania wstępne
- Subskrypcja platformy Azure — utwórz bezpłatnie.
- Zestaw Java Development Kit (JDK) w wersji 8 lub nowszej.
- Apache Maven
- Interfejs wiersza polecenia platformy Azure
- Wystąpienie usługi Key Vault. Jeśli go nie masz, zobacz Szybki start: tworzenie magazynu kluczy przy użyciu witryny Azure Portal. Ponadto zanotuj identyfikator URI wystąpienia usługi Key Vault, ponieważ jest on potrzebny dla aplikacji testowej na potrzeby tego samouczka.
- Aplikacja Spring Boot. Jeśli go nie masz, utwórz projekt Maven za pomocą narzędzia Spring Initializr. Pamiętaj, aby wybrać pozycję Projekt Maven i w obszarze Zależności dodaj zależności Spring Web, Spring Data JPA i H2 Database , a następnie wybierz pozycję Java w wersji 8 lub nowszej.
Ważne
Do wykonania kroków opisanych w tym artykule jest wymagany program Spring Boot w wersji 2.5 lub nowszej.
Ustawianie wpisu tajnego na usługę Azure Key Vault
W tym samouczku opisano sposób odczytywania poświadczeń bazy danych z usługi Key Vault w aplikacji Spring Boot. Aby odczytać poświadczenia z usługi Key Vault, najpierw należy przechowywać poświadczenia bazy danych w usłudze Key Vault.
Aby przechowywać adres URL bazy danych H2 jako nowy wpis tajny w usłudze Key Vault, zobacz Szybki start: ustawianie i pobieranie wpisu tajnego z usługi Azure Key Vault przy użyciu witryny Azure Portal. W tym samouczku ustawisz wpis tajny z nazwą h2url
i wartością jdbc:h2:~/testdb;user=sa;password=password
.
Uwaga
Po ustawieniu wpisu tajnego przyznaj aplikacji dostęp do usługi Key Vault, postępując zgodnie z instrukcjami w temacie Przypisywanie zasad dostępu usługi Key Vault.
Odczytywanie wpisu tajnego z usługi Azure Key Vault
Teraz, gdy poświadczenia bazy danych zostały zapisane w usłudze Key Vault, możesz je pobrać za pomocą platformy Azure Spring Cloud.
Aby zainstalować moduł Startowy usługi Azure Key Vault spring Cloud, dodaj następujące zależności do pliku pom.xml :
Projekt 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>
Uwaga
Jeśli używasz środowiska Spring Boot 2.x, pamiętaj, aby ustawić
spring-cloud-azure-dependencies
wersję na4.19.0
. Ten rachunek materiału (BOM) należy skonfigurować w<dependencyManagement>
sekcji pliku pom.xml . Gwarantuje to, że wszystkie zależności platformy Azure platformy Spring Cloud korzystają z tej samej wersji. Aby uzyskać więcej informacji na temat wersji używanej dla tego modelu BOM, zobacz Która wersja platformy Spring Cloud platformy Azure powinna być używana.Artefakt startowy usługi Azure Key Vault spring Cloud:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-keyvault</artifactId> </dependency>
Platforma Spring Cloud Azure oferuje kilka metod odczytywania wpisów tajnych z usługi Key Vault. Można użyć następujących metod niezależnie lub połączyć je w różnych przypadkach użycia:
- Użyj zestawu Azure SDK dla usługi Key Vault.
- Użyj programu Spring KeyVault
PropertySource
.
Korzystanie z zestawu Azure SDK dla usługi Key Vault
Zestaw Azure SDK dla usługi Key Vault zapewnia SecretClient
zarządzanie wpisami tajnymi w usłudze Key Vault.
W poniższym przykładzie kodu pokazano, jak pobrać SecretClient
poświadczenia bazy danych H2 z usługi Azure Key Vault.
Aby odczytać wpis tajny przy użyciu zestawu Azure SDK z usługi Key Vault, skonfiguruj aplikację, wykonując następujące kroki:
Skonfiguruj punkt końcowy usługi Key Vault w pliku konfiguracji application.properties .
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
Wstrzyknąć fasolę
SecretClient
w aplikacji Spring i użyćgetSecret
metody w celu pobrania wpisu tajnego, jak pokazano w poniższym przykładzie: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()); } }
Napiwek
W tym samouczku nie ma żadnych operacji uwierzytelniania w konfiguracjach ani kodzie. Jednak nawiązywanie połączenia z usługami platformy Azure wymaga uwierzytelniania. Aby ukończyć uwierzytelnianie, musisz użyć usługi Azure Identity. Platforma Spring Cloud na platformie Azure używa
DefaultAzureCredential
biblioteki tożsamości platformy Azure, która ułatwia uzyskiwanie poświadczeń bez żadnych zmian w kodzie.DefaultAzureCredential
obsługuje wiele metod uwierzytelniania i określa, która metoda ma być używana w czasie wykonywania. Takie podejście umożliwia aplikacji używanie różnych metod uwierzytelniania w różnych środowiskach (takich jak środowiska lokalne i produkcyjne) bez implementowania kodu specyficznego dla środowiska. Aby uzyskać więcej informacji, zobacz DefaultAzureCredential.Aby ukończyć uwierzytelnianie w lokalnych środowiskach deweloperskich, możesz użyć interfejsu wiersza polecenia platformy Azure, programu Visual Studio Code, programu PowerShell lub innych metod. Aby uzyskać więcej informacji, zobacz Uwierzytelnianie platformy Azure w środowiskach deweloperskich Java. Aby ukończyć uwierzytelnianie w środowiskach hostingu platformy Azure, zalecamy użycie tożsamości zarządzanej przypisanej przez użytkownika. Aby uzyskać więcej informacji, zobacz Co to są tożsamości zarządzane dla zasobów platformy Azure?
Uruchom aplikację. Zobaczysz dzienniki podobne do następującego przykładu:
h2url: jdbc:h2:~/testdb;user=sa;password=password
Możesz samodzielnie skompilować fasolę SecretClient
, ale proces jest skomplikowany. W aplikacjach Spring Boot musisz zarządzać właściwościami, uczyć się wzorca konstruktora i rejestrować klienta w kontekście aplikacji Spring. W poniższym przykładzie kodu pokazano, jak utworzyć fasolę SecretClient
:
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();
}
}
Na poniższej liście przedstawiono niektóre przyczyny, dla których ten kod nie jest elastyczny lub elastyczny:
- Punkt końcowy usługi Key Vault jest zakodowany w kodzie twardym.
- Jeśli używasz
@Value
polecenia do pobierania konfiguracji ze środowiska Spring, nie możesz mieć wskazówek dotyczących środowiska IDE w pliku application.properties . - Jeśli masz scenariusz mikrousług, kod musi być zduplikowany w każdym projekcie i łatwo popełnić błędy i trudno go spójnie.
Na szczęście samodzielne tworzenie fasoli SecretClient
nie jest konieczne w przypadku platformy Azure Spring Cloud. Zamiast tego możesz bezpośrednio wstrzyknąć SecretClient
i użyć właściwości konfiguracji, które już znasz, aby skonfigurować usługę Key Vault. Aby uzyskać więcej informacji, zobacz Przykłady konfiguracji.
Platforma Spring Cloud Azure udostępnia również następujące konfiguracje globalne dla różnych scenariuszy. Aby uzyskać więcej informacji, zobacz sekcję Global configuration for Azure Service SDK (Konfiguracja globalna zestawów SDK usługi Platformy Azure) w przewodniku dewelopera platformy Azure spring Cloud.
- Opcje serwera proxy.
- Opcje ponawiania prób.
- Opcje klienta transportu HTTP.
Możesz również nawiązać połączenie z różnymi chmurami platformy Azure. Aby uzyskać więcej informacji, zobacz Nawiązywanie połączenia z różnymi chmurami platformy Azure.
Korzystanie z usługi Spring Key Vault PropertySource
W poprzednich sekcjach pokazano, jak używać SecretClient
polecenia w pliku CommandLineRunner
w celu odczytania wpisu tajnego po uruchomieniu aplikacji. Jednak w aplikacjach Spring Boot odczytywanie wpisów tajnych jest wymagane przed uruchomieniem aplikacji. Na przykład właściwość hasła źródła danych jest wymagana przed uruchomieniem aplikacji. Poprzedni scenariusz nie będzie działać, jeśli chcesz przechowywać hasło źródła danych w usłudze Key Vault i nadal używać automatycznej konfiguracji platformy Spring w celu pobrania źródła danych.
W takim przypadku platforma Spring Cloud Azure zapewnia integrację środowiska Spring w celu załadowania wpisów tajnych z usługi Key Vault przed utworzeniem kontekstu aplikacji. Klucz tajny służy do konstruowania i konfigurowania fasoli podczas inicjowania kontekstu aplikacji Spring. Takie podejście jest przejrzystym sposobem uzyskiwania dostępu do wpisów tajnych z usługi Key Vault i nie są wymagane żadne zmiany kodu.
W poniższym przykładzie kodu pokazano, jak pobrać PropertySource
poświadczenia bazy danych H2 w celu skompilowania źródła danych z usługi Azure Key Vault.
Aby pobrać adres URL bazy danych H2 z usługi Key Vault i zapisać dane z bazy danych H2 przy użyciu narzędzia Spring Data JPA, skonfiguruj aplikację, wykonując następujące kroki:
Dodaj następujące właściwości punktu końcowego i źródła danych usługi Key Vault do pliku konfiguracji 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
Napiwek
Przykłady konfiguracji właściwości platformy Azure platformy Spring Cloud można znaleźć w sekcji Przykłady konfiguracji przewodnika dla deweloperów platformy Azure spring Cloud.
Napiwek
W tym przykładzie przedstawiono prosty scenariusz bazy danych korzystający z bazy danych H2. Zalecamy używanie usługi Azure Database for MySQL lub Azure Database for PostgreSQL w środowisku produkcyjnym oraz przechowywanie adresu URL bazy danych, nazwy użytkownika i hasła w usłudze Azure Key Vault. Jeśli chcesz uniknąć hasła, połączenia bez hasła są dobrym wyborem. Aby uzyskać więcej informacji, zobacz Połączenia bez hasła dla usług platformy Azure.
Utwórz nową
Todo
klasę Języka Java. Ta klasa jest modelem domeny mapowanym na tabelętodo
, która zostanie automatycznie utworzona przez jpa. Poniższy kod ignorujegetters
metody isetters
.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; }
Edytuj plik klasy uruchamiania, aby wyświetlić następującą zawartość.
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> { }
Uruchom aplikację. Aplikacja pobierze adres URL bazy danych H2 z usługi Key Vault, a następnie połączy się z bazą danych H2 i zapisze dane w bazie danych. Zobaczysz dzienniki podobne do następującego przykładu:
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
Wdrażanie w usłudze Azure Spring Apps
Teraz, gdy aplikacja Spring Boot działa lokalnie, nadszedł czas, aby przenieść ją do środowiska produkcyjnego. Usługa Azure Spring Apps ułatwia wdrażanie aplikacji Spring Boot na platformie Azure bez żadnych zmian w kodzie. Usługa zarządza infrastrukturą aplikacji Spring, aby deweloperzy mogli skupić się na swoim kodzie. Usługa Azure Spring Apps zapewnia zarządzanie cyklem życia przy użyciu kompleksowego monitorowania i diagnostyki, zarządzania konfiguracją, odnajdywania usług, integracji/ciągłego wdrażania, wdrożeń niebieskich zielonych i nie tylko. Aby wdrożyć aplikację w usłudze Azure Spring Apps, zobacz Wdrażanie pierwszej aplikacji w usłudze Azure Spring Apps.