Udostępnij za pośrednictwem


Załaduj sekret 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.

Umieść tajemnicę w 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 tajne ustawienie z nazwą h2url i wartością jdbc:h2:~/testdb;user=sa;password=password.

Uwaga

Po ustawieniu sekretu, 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.

Odczytaj tajemnicę 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ł Spring Cloud Azure Key Vault Starter, 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.21.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.19.0. Ten wykaz materiałowy (BOM) należy skonfigurować w sekcji <dependencyManagement>pliku pom.xml. Gwarantuje to, że wszystkie zależności Spring Cloud Azure korzystają z tej samej wersji. Aby uzyskać więcej informacji na temat wersji używanej dla tego BOM, zobacz Którą wersję Spring Cloud Azure powinienem używać.

  • Artefakt startowy usługi Spring Cloud Azure Key Vault:

    <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 Azure Key Vault zapewnia SecretClient do zarządzania sekretami w Azure Key Vault.

Przykład kodu poniżej pokaże, jak użyć SecretClient, aby pobrać 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. Wstrzyknij bean SecretClient w swojej aplikacji Spring i użyj metody getSecret do pobrania sekretu, jak to 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 konfiguracji 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 zbudować obiekt bean 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ć bean 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, dlaczego ten kod nie jest elastyczny ani elegancki.

  • Punkt końcowy usługi Key Vault jest zakodowany w kodzie twardym.
  • Jeśli używasz @Value do pobierania konfiguracji ze środowiska Spring, nie możesz mieć wskazówek IDE w pliku application.properties.
  • Jeśli masz scenariusz mikrousług, kod musi być powielony w każdym projekcie, co powoduje, że łatwo popełnić błędy i trudno zachować spójność.

Na szczęście samodzielne tworzenie beana SecretClient nie jest konieczne w przypadku Spring Cloud Azure. 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ę Konfiguracja globalna dla zestawów SDK usługi Azure w przewodniku dewelopera Spring Cloud Azure.

  • 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 w kontekście CommandLineRunner w celu odczytania tajemnicy 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 Spring Cloud Azure zapewnia integrację środowiska Spring w celu załadowania tajemnic z usługi Key Vault, zanim kontekst aplikacji zostanie zbudowany. Możesz użyć sekretu do konstrukcji i konfiguracji beanu podczas inicjalizacji kontekstu aplikacji Spring. Takie podejście jest przejrzystym sposobem uzyskiwania dostępu do sekretów z usługi Key Vault i nie są wymagane żadne zmiany kodu.

W poniższym przykładzie kodu pokazano, jak używać PropertySource do pobrania poświadczeń bazy danych H2, aby zbudować źródło danych z 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 Spring Cloud Azure można znaleźć w sekcji Przykłady konfiguracjiPrzewodnika dla deweloperów Spring Cloud Azure.

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

    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.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 do 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 wszechstronnego monitorowania i diagnostyki, zarządzania konfiguracją, automatycznego wykrywania usług, integracji CI/CD, wdrożeń blue-green 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