Ł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

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.11.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ę na 4.17.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:

  1. 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/
    
  2. 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 DefaultAzureCredentialbiblioteki 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?

  3. 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 Połączenie do różnych chmur 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:

  1. 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.

  2. 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 ignoruje getters metody i setters .

    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. 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> {
    
    }
    
  4. 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.

Następne kroki