Partilhar via


Carregar um segredo do Azure Key Vault numa aplicação Spring Boot

Este tutorial mostra-lhe como usar o Key Vault em aplicações Spring Boot para proteger dados de configuração sensíveis e recuperar propriedades de configuração do Key Vault. Key Vault fornece armazenamento seguro de segredos genéricos, como palavras-passe e cadeias de ligação à base de dados.

Pré-requisitos

  • Uma subscrição do Azure - crie uma gratuitamente.
  • Kit de Desenvolvimento Java (JDK) versão 8 ou superior.
  • Apache Maven
  • Azure CLI
  • Uma instância do Key Vault. Se não tiveres um, vê Quickstart: Cria um cofre de chaves usando o portal Azure. Além disso, anota o URI da instância do Key Vault, pois precisas dele para a aplicação de teste deste tutorial.
  • Um aplicativo Spring Boot. Se você não tiver um, crie um projeto Maven com o Spring Initializr. Certifique-se de selecionar Maven Project e, em Dependencies, adicionar as dependências Spring Web, Spring Data JPA e H2 Database, e depois selecione Java versão 8 ou superior.

Importante

O Spring Boot versão 2.5 ou superior é necessário para concluir as etapas neste artigo.

Definir um segredo em Azure Key Vault

Este tutorial descreve como ler credenciais de base de dados do Key Vault numa aplicação Spring Boot. Para ler as credenciais do Key Vault, deve primeiro armazenar as credenciais da base de dados no Key Vault.

Para armazenar o URL de uma base de dados H2 como um novo segredo em Key Vault, veja Quickstart: Definir e recuperar um segredo de Azure Key Vault usando o portal Azure. Neste tutorial, você definirá um segredo com nome h2url e valor jdbc:h2:~/testdb;user=sa;password=password.

Nota

Depois de definir o segredo, conceda acesso à sua aplicação no Key Vault seguindo as instruções em Atribuir uma política de acesso do Key Vault.

Leia um segredo do Azure Key Vault

Agora que as credenciais da base de dados foram armazenadas no Key Vault, pode recuperá-las com o Spring Cloud Azure.

Para instalar o módulo Spring Cloud Azure Key Vault Starter, adicione as seguintes dependências ao seu ficheiro pom.xml:

  • A Lista de Materiais Spring Cloud Azure (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>7.1.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Nota

    Se estiveres a usar o Spring Boot 4.0.x, certifica-te de definir a spring-cloud-azure-dependencies versão para 7.1.0.

    Se estiveres a usar o Spring Boot 3.5.x, certifica-te de definir a spring-cloud-azure-dependencies versão para 6.1.0.

    Se estiveres a usar o Spring Boot 3.1.x-3.5.x, certifica-te de definir a spring-cloud-azure-dependencies versão para 5.25.0.

    Se você estiver usando o Spring Boot 2.x, certifique-se de definir a versão spring-cloud-azure-dependencies como 4.20.0.

    Esta lista de materiais (BOM) deve ser configurada na seção <dependencyManagement> do seu arquivo pom.xml. Isto garante que todas as dependências do Spring Cloud Azure usam a mesma versão.

    Para mais informações sobre a versão usada nesta BOM, consulte Qual Versão do Spring Cloud Azure Devo Usar.

  • O artefacto inicial do Spring Cloud Azure Key Vault:

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

O Spring Cloud Azure tem vários métodos para ler segredos do Key Vault. Você pode usar os seguintes métodos independentemente ou combiná-los para diferentes casos de uso:

  • Utilize o SDK do Azure para Key Vault.
  • Utilize o Spring KeyVault PropertySource.

Utilize o SDK do Azure para Key Vault

Azure SDK para Key Vault proporciona SecretClient para administrar segredos no Key Vault.

O seguinte exemplo de código irá mostrar-lhe como usar SecretClient para obter credenciais de base de dados H2 a partir de Azure Key Vault.

Para ler um segredo usando o Azure SDK do Key Vault, configure a aplicação seguindo estes passos:

  1. Configure um endpoint Key Vault no ficheiro de configuração application.properties.

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. Injete o SecretClient bean na sua aplicação Spring e use o getSecret método para recuperar um segredo, no exemplo a seguir:

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

    Gorjeta

    Neste tutorial, não há operações de autenticação nas configurações ou no código. No entanto, a ligação aos serviços do Azure requer autenticação. Para completar a autenticação, precisa de usar o Azure Identity. O Spring Cloud Azure utiliza DefaultAzureCredential, que a biblioteca Azure Identity fornece para te ajudar a obter credenciais sem quaisquer alterações de código.

    DefaultAzureCredential Suporta vários métodos de autenticação e determina qual método usar em tempo de execução. Essa abordagem permite que seu aplicativo use diferentes métodos de autenticação em ambientes diferentes (como ambientes locais e de produção) sem implementar código específico do ambiente. Para obter mais informações, consulte DefaultAzureCredential.

    Para completar a autenticação em ambientes de desenvolvimento locais, pode usar Azure CLI, Visual Studio Code, PowerShell ou outros métodos. Para mais informações, consulte Autenticação do Azure em ambientes de desenvolvimento Java. Para completar a autenticação em ambientes de alojamento Azure, recomendamos a utilização da identidade gerida atribuída pelo utilizador. Para mais informações, consulte O que são identidades geridas para Azure recursos?

  3. Inicie a aplicação. Você verá logs semelhantes ao exemplo a seguir:

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

Você pode construir o SecretClient feijão sozinho, mas o processo é complicado. Em aplicativos Spring Boot, você precisa gerenciar propriedades, aprender o padrão do construtor e registrar o cliente no contexto do aplicativo Spring. O exemplo de código a seguir mostra como você cria um SecretClient bean:

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

}

A lista a seguir mostra alguns dos motivos pelos quais esse código não é flexível ou gracioso:

  • O endpoint do Key Vault é codificado fixamente.
  • Se você usar @Value para obter configurações do ambiente Spring, não poderá ter dicas do IDE no arquivo application.properties .
  • Se você tiver um cenário de microsserviço, o código deve ser duplicado em cada projeto, e é fácil cometer erros e difícil ser consistente.

Felizmente, com o Spring Cloud Azure, não é necessário construir o bean SecretClient sozinho. Em vez disso, pode injetar diretamente SecretClient e usar as propriedades de configuração com que já está familiarizado para configurar Key Vault. Para obter mais informações, consulte Exemplos de configuração.

O Spring Cloud Azure também fornece as seguintes configurações globais para diferentes cenários. Para mais informações, consulte a configuração Global para SDKs de Serviço Azure do guia para programadores Spring Cloud Azure.

  • Opções de proxy.
  • Opções de repetição novamente.
  • Opções do cliente de transporte HTTP.

Também podes ligar-te a diferentes clouds do Azure. Para mais informações, veja Conectar-se a diferentes nuvens Azure.

Utilize o Spring Key Vault PropertySource

As seções anteriores mostraram como usar SecretClient no CommandLineRunner para ler o segredo depois que o aplicativo foi iniciado. Em aplicativos Spring Boot, no entanto, a leitura de segredos é necessária antes que o aplicativo seja iniciado. Por exemplo, a propriedade de senha da fonte de dados é necessária antes que o aplicativo seja iniciado. O cenário anterior não funciona se quiseres guardar a palavra-passe da fonte de dados no Key Vault e ainda assim usar a configuração automática do Spring para obter uma fonte de dados.

Neste caso, o Spring Cloud Azure fornece integração com o ambiente Spring para carregar segredos do Key Vault antes de construir o contexto da aplicação. Você pode usar o segredo para construir e configurar o bean durante a inicialização do contexto do aplicativo Spring. Esta abordagem é uma forma transparente de aceder a segredos do Key Vault, e não são necessárias alterações no código.

O exemplo de código seguinte mostra-lhe como usar PropertySource para obter credenciais da base de dados H2 e construir a fonte de dados a partir de Azure Key Vault.

Para recuperar a URL de uma base de dados H2 do Key Vault e armazenar dados da base de dados H2 usando o Spring Data JPA, configure a aplicação seguindo estes passos:

  1. Adicione as seguintes propriedades de endpoint do Key Vault e de origem de dados ao ficheiro de configuração 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
    

    Gorjeta

    Para exemplos de configuração de propriedades do Spring Cloud Azure, consulte a secção <>exemplos de configuração do guia para desenvolvedores Spring Cloud Azure.

    Este exemplo é um cenário de banco de dados simples usando um banco de dados H2. Recomendamos utilizar o Azure Database for MySQL ou o Azure Database for PostgreSQL num ambiente de produção e armazenar o URL da base de dados, nome de utilizador e palavra-passe no Azure Key Vault. Se você quiser evitar a senha, conexões sem senha é uma boa escolha. Para mais informações, consulte Conexões sem palavra-passe para serviços Azure.

  2. Cria uma nova classe Todo Java. Esta classe é um modelo de domínio mapeado na tabela todo que será criada automaticamente pela JPA. O código a seguir ignora os getters métodos e 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. Edite o arquivo de classe de inicialização para mostrar o seguinte conteúdo.

    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. Inicie a aplicação. A aplicação irá recuperar o URL da base de dados H2 do Key Vault, depois ligar-se à base de dados H2 e armazenar os dados na base de dados. Você verá logs semelhantes ao exemplo a seguir:

    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
    

Desdobrar para o Azure Spring Apps

Agora que você tem o aplicativo Spring Boot em execução localmente, é hora de movê-lo para a produção. Azure Spring Apps facilita a implementação de aplicações Spring Boot para Azure sem quaisquer alterações de código. O serviço gerencia a infraestrutura dos aplicativos Spring para que os desenvolvedores possam se concentrar em seu código. O Azure Spring Apps oferece gestão do ciclo de vida através de monitorização e diagnóstico abrangentes, gestão de configuração, descoberta de serviços, integração CI/CD, implementações azul-verde e muito mais. Para implementar a sua aplicação para Azure Spring Apps, consulte Implante a sua primeira aplicação para Azure Spring Apps.

Próximos passos