Charger un secret à partir d’Azure Key Vault dans une application Spring Boot

Ce tutoriel vous montre comment utiliser Key Vault dans les applications Spring Boot pour sécuriser les données de configuration sensibles et récupérer les propriétés de configuration à partir de Key Vault. Key Vault offre un stockage sécurisé des secrets génériques, tels que les mots de passe et les chaînes de connexion de base de données.

Prérequis

Important

Spring Boot version 2.5 ou ultérieure est nécessaire pour effectuer les étapes décrites dans cet article.

Définir un secret sur Azure Key Vault

Ce tutoriel explique comment lire les informations d’identification de base de données à partir de Key Vault dans une application Spring Boot. Pour lire les informations d’identification à partir de Key Vault, vous devez d’abord stocker les informations d’identification de base de données dans Key Vault.

Pour stocker l’URL d’une base de données H2 en tant que nouveau secret dans Key Vault, consultez démarrage rapide : Définir et récupérer un secret à partir d’Azure Key Vault à l’aide du Portail Azure. Dans ce tutoriel, vous allez définir un secret avec le nom h2url et la valeur jdbc:h2:~/testdb;user=sa;password=password.

Remarque

Après avoir défini le secret, accordez à votre application l’accès à Key Vault en suivant les instructions de l’instruction Affecter une stratégie d’accès Key Vault.

Lire un secret à partir d’Azure Key Vault

Maintenant que les informations d’identification de base de données ont été stockées dans Key Vault, vous pouvez les récupérer avec Spring Cloud Azure.

Pour installer le module Spring Cloud Azure Key Vault Starter, ajoutez les dépendances suivantes à votre fichier pom.xml :

  • The 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>
    

    Remarque

    Si vous utilisez Spring Boot 2.x, veillez à définir la spring-cloud-azure-dependencies version 4.17.0sur . Cette facture de matériel (BOM) doit être configurée dans la <dependencyManagement> section de votre fichier pom.xml . Cela garantit que toutes les dépendances Azure Spring Cloud utilisent la même version. Pour plus d’informations sur la version utilisée pour ce boM, consultez La version de Spring Cloud Azure à utiliser.

  • Artefact Spring Cloud Azure Key Vault Starter :

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

Spring Cloud Azure a plusieurs méthodes pour lire des secrets à partir de Key Vault. Vous pouvez utiliser les méthodes suivantes indépendamment ou les combiner pour différents cas d’usage :

  • Utilisez le Kit de développement logiciel (SDK) Azure pour Key Vault.
  • Utilisez Spring KeyVault PropertySource.

Utiliser le Kit de développement logiciel (SDK) Azure pour Key Vault

Le Kit de développement logiciel (SDK) Azure pour Key Vault fournit SecretClient la gestion des secrets dans Key Vault.

L’exemple de code suivant vous montre comment récupérer SecretClient les informations d’identification de base de données H2 à partir d’Azure Key Vault.

Pour lire un secret à l’aide du Kit de développement logiciel (SDK) Azure à partir de Key Vault, configurez l’application en procédant comme suit :

  1. Configurez un point de terminaison Key Vault dans le fichier de configuration application.properties .

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. Injectez le SecretClient haricot dans votre application Spring et utilisez la getSecret méthode pour récupérer un secret, comme illustré dans l’exemple suivant :

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

    Conseil

    Dans ce tutoriel, il n’existe aucune opération d’authentification dans les configurations ou le code. Toutefois, la connexion aux services Azure nécessite une authentification. Pour effectuer l’authentification, vous devez utiliser Identité Azure. Spring Cloud Azure utilise DefaultAzureCredential, que la bibliothèque d’identités Azure fournit pour vous aider à obtenir des informations d’identification sans aucune modification du code.

    DefaultAzureCredential prend en charge plusieurs méthodes d’authentification et détermine quelle méthode doit être utilisée au moment de l’exécution. Cette approche permet à votre application d’utiliser différentes méthodes d’authentification dans différents environnements (tels que les environnements locaux et de production) sans implémenter de code spécifique à l’environnement. Pour plus d’informations, consultez DefaultAzureCredential.

    Pour terminer l’authentification dans les environnements de développement locaux, vous pouvez utiliser Azure CLI, Visual Studio Code, PowerShell ou d’autres méthodes. Pour plus d’informations, consultez l’authentification Azure dans les environnements de développement Java. Pour terminer l’authentification dans les environnements d’hébergement Azure, nous vous recommandons d’utiliser l’identité managée affectée par l’utilisateur. Pour plus d’informations, consultez Que sont les identités managées pour les ressources Azure ?

  3. Lancez l’application. Vous verrez des journaux similaires à l’exemple suivant :

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

Vous pouvez construire le SecretClient haricot par vous-même, mais le processus est compliqué. Dans les applications Spring Boot, vous devez gérer les propriétés, apprendre le modèle de générateur et inscrire le client dans votre contexte d’application Spring. L’exemple de code suivant montre comment générer un SecretClient haricot :

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

}

La liste suivante présente certaines des raisons pour lesquelles ce code n’est pas flexible ou approprié :

  • Le point de terminaison Key Vault est codé en dur.
  • Si vous utilisez @Value pour obtenir des configurations à partir de l’environnement Spring, vous ne pouvez pas avoir d’indicateurs IDE dans votre fichier application.properties .
  • Si vous avez un scénario de microservice, le code doit être dupliqué dans chaque projet, et il est facile de faire des erreurs et difficile d’être cohérent.

Heureusement, la création du SecretClient haricot par vous-même n’est pas nécessaire avec Spring Cloud Azure. Au lieu de cela, vous pouvez injecter SecretClient et utiliser directement les propriétés de configuration que vous connaissez déjà pour configurer Key Vault. Pour plus d’informations, consultez les exemples de configuration.

Spring Cloud Azure fournit également les configurations globales suivantes pour différents scénarios. Pour plus d’informations, consultez la section Configuration globale des kits SDK Azure Service du guide du développeur Spring Cloud Azure.

  • Options de proxy.
  • Options de nouvelle tentative.
  • Options du client de transport HTTP.

Vous pouvez également vous connecter à différents clouds Azure. Pour plus d’informations, consultez Connecter sur différents clouds Azure.

Utiliser Spring Key Vault PropertySource

Les sections précédentes vous ont montré comment utiliser SecretClient dans le CommandLineRunner secret pour lire le secret après le démarrage de l’application. Dans les applications Spring Boot, toutefois, la lecture des secrets est requise avant le démarrage de l’application. Par exemple, la propriété de mot de passe de la source de données est requise avant le démarrage de l’application. Le scénario précédent ne fonctionnera pas si vous souhaitez stocker le mot de passe de la source de données dans Key Vault et utiliser la configuration automatique Spring pour obtenir une source de données.

Dans ce cas, Spring Cloud Azure fournit l’intégration de l’environnement Spring pour charger des secrets à partir de Key Vault avant de créer le contexte de l’application. Vous pouvez utiliser le secret pour construire et configurer le bean pendant l’initialisation du contexte de l’application Spring. Cette approche est un moyen transparent pour vous d’accéder aux secrets à partir de Key Vault, et aucune modification du code n’est requise.

L’exemple de code suivant vous montre comment récupérer PropertySource les informations d’identification de base de données H2 pour générer la source de données à partir d’Azure Key Vault.

Pour récupérer l’URL d’une base de données H2 à partir de Key Vault et stocker des données à partir de la base de données H2 à l’aide de Spring Data JPA, configurez l’application en procédant comme suit :

  1. Ajoutez le point de terminaison Key Vault et les propriétés de source de données suivants au fichier de configuration 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
    

    Conseil

    Pour obtenir des exemples de configuration de propriétés Spring Cloud Azure, consultez la section Exemples de configuration du guide du développeur Spring Cloud Azure.

    Conseil

    Cet exemple est un scénario de base de données simple utilisant une base de données H2. Nous vous recommandons d’utiliser Azure Database pour MySQL ou Azure Database pour PostgreSQL dans un environnement de production et de stocker l’URL de base de données, le nom d’utilisateur et le mot de passe dans Azure Key Vault. Si vous souhaitez éviter le mot de passe, les connexions sans mot de passe constituent un bon choix. Pour plus d’informations, consultez Connexions sans mot de passe pour les services Azure.

  2. Créez une Todo classe Java. Cette classe est un modèle de domaine mappé sur la todo table qui sera automatiquement créée par JPA. Le code suivant ignore les méthodes et setters les getters méthodes.

    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. Modifiez le fichier de classe de démarrage pour afficher le contenu suivant.

    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. Lancez l’application. L’application récupère l’URL de la base de données H2 à partir de Key Vault, puis se connecte à la base de données H2 et stocke les données dans la base de données. Vous verrez des journaux similaires à l’exemple suivant :

    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
    

Déployer sur Azure Spring Apps

Maintenant que vous disposez de l’application Spring Boot en cours d’exécution localement, il est temps de le déplacer en production. Azure Spring Apps facilite le déploiement d’applications Spring Boot sur Azure sans aucune modification de code. Le service gère l’infrastructure des applications Spring, ce qui permet aux développeurs de se concentrer sur leur code. Azure Spring Apps assure la gestion du cycle de vie en utilisant des outils complets, tels que la supervision et les diagnostics, la gestion des configurations, la découverte de services, l’intégration CI/CD, les déploiements bleus-verts, etc. Pour déployer votre application sur Azure Spring Apps, consultez Déployer votre première application sur Azure Spring Apps.

Étapes suivantes