Загрузка секрета из Azure Key Vault в приложении Spring Boot

В этом руководстве показано, как загрузить секрет из Azure Key Vault в приложении Spring Boot для защиты конфиденциальных данных конфигурации. Azure Key Vault обеспечивает безопасное хранилище секретов, таких как пароли и строки подключения к базе данных.

Предварительные условия

Внимание

Для выполнения действий, описанных в этой статье, требуется spring Boot версии 2.5 или более поздней.

Добавление секрета в Azure Key Vault

В этом руководстве описывается, как считывать учетные данные базы данных из Key Vault в приложении Spring Boot. Чтобы считывать учетные данные из Key Vault, необходимо сначала сохранить учетные данные базы данных в Key Vault.

Сведения о хранении URL-адреса базы данных H2 в качестве нового секрета в Key Vault см. в разделе Quickstart: установка и извлечение секрета из Azure Key Vault с помощью портала Azure. В этом руководстве вы задали секрет с именем h2url и значением jdbc:h2:~/testdb;user=sa;password=password.

Примечание.

После задания секрета предоставьте приложению доступ к Key Vault, следуя инструкциям в Назначение политики доступа Key Vault.

Прочтите секрет из Azure Key Vault

После хранения учетных данных базы данных в Key Vault их можно получить с помощью Spring Cloud Azure.

Чтобы установить Spring Cloud Azure Key Vault Starter-модуль, добавьте следующие зависимости в файл pom.xml:

  • Акт технических спецификаций Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете Spring Boot 4.0.x, установите для нее spring-cloud-azure-dependencies значение .7.4.0

    Если вы используете Spring Boot 3.5.x, установите для нее spring-cloud-azure-dependencies значение 6.5.0.

    Если вы используете Spring Boot 3.1.x-3.5.x, обязательно установите для нее версию spring-cloud-azure-dependencies на 5.25.0.

    Если вы используете Spring Boot 2.x, обязательно установите версию spring-cloud-azure-dependencies на 4.20.0.

    Эта ведомость материалов (BOM) должна быть сконфигурирована в <dependencyManagement> разделе файла pom.xml. Это гарантирует, что все зависимости Spring Cloud Azure используют одну и ту же версию.

    Дополнительные сведения о версии, используемой для этого BOM, см. в разделе Какую версию Spring Cloud Azure я должен использовать.

  • Артефакт Spring Cloud Azure Key Vault Starter:

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

Spring Cloud Azure предоставляет несколько методов чтения секретов из Key Vault. Для разных вариантов использования можно использовать следующие методы независимо или объединить их.

  • Используйте Azure SDK для Key Vault.
  • Используйте Spring KeyVault PropertySource.

Использование Azure SDK для Key Vault

Azure SDK для Key Vault предоставляет SecretClient для управления секретами в хранилище ключей.

В следующем примере кода показано, как использовать для SecretClient получения учетных данных базы данных H2 из Azure Key Vault.

Чтобы прочитать секрет из Key Vault с помощью Azure SDK, настройте приложение, выполнив следующие действия.

  1. Настройте конечную точку Key Vault в файле конфигурации application.properties.

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. Внедрите SecretClient bean в ваше Spring-приложение и используйте метод getSecret для извлечения секрета, как показано в следующем примере:

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

    Совет

    В этом руководстве нет операций проверки подлинности в конфигурациях или коде. Однако для подключения к службам Azure требуется проверка подлинности. Чтобы завершить проверку подлинности, необходимо использовать удостоверение Azure. Spring Cloud Azure использует DefaultAzureCredential, которую предоставляет библиотека удостоверений Azure для получения учетных данных без необходимости изменения кода.

    DefaultAzureCredential поддерживает несколько методов проверки подлинности и определяет, какой метод следует использовать во время выполнения. Этот подход позволяет приложению использовать различные методы проверки подлинности в разных средах (например, локальных и рабочих средах), не реализуя код, зависящий от среды. Дополнительные сведения см. в разделе DefaultAzureCredential.

    Для выполнения проверки подлинности в локальных средах разработки можно использовать Azure CLI, Visual Studio Code, PowerShell или другие методы. Дополнительные сведения см. в разделе аутентификация Azure в средах разработки на Java. Чтобы завершить проверку подлинности в средах размещения Azure, рекомендуется использовать управляемое удостоверение, назначаемое пользователем. Дополнительные сведения см. в разделе Управляемые удостоверения для ресурсов Azure?

  3. Запустите приложение. Вы увидите журналы, аналогичные следующему примеру:

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

Вы можете создать боб самостоятельно SecretClient , но процесс сложный. В приложениях Spring Boot необходимо управлять свойствами, изучать шаблон построителя и регистрировать клиент в контексте приложения Spring. В следующем примере кода показано, как создать 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();
    }

}

В следующем списке показаны некоторые причины, по которым этот код не является гибким или грациозным:

  • Конечная точка Key Vault жестко закодирована.
  • Если вы используете @Value для получения конфигураций из среды Spring, в файле application.properties невозможно указать IDE.
  • Если у вас есть сценарий микрослужбы, необходимо дублировать код в каждом проекте. Это легко сделать ошибки и трудно быть согласованными.

К счастью, Spring Cloud Azure упрощает построение SecretClient боба. Вместо создания боба вручную можно напрямую внедрить SecretClient и использовать свойства конфигурации, с которыми вы уже знакомы для настройки Key Vault. Для получения дополнительной информации см. Примеры конфигурации.

Spring Cloud Azure также предоставляет следующие глобальные конфигурации для различных сценариев. Для получения дополнительной информации см. раздел Глобальная конфигурация пакетов SDK для служб Azure в руководстве разработчика Spring Cloud Azure.

  • Параметры прокси-сервера.
  • Параметры повторных попыток.
  • Параметры клиента транспорта HTTP.

Вы также можете подключиться к разным Azure облакам. Для получения дополнительной информации см. раздел Подключение к различным облакам Azure.

Использование Spring Key Vault PropertySource

В предыдущих разделах показано, как считывать SecretClientCommandLineRunner секрет после запуска приложения. Однако в приложениях Spring Boot необходимо прочитать секреты перед запуском приложения. Например, перед запуском приложения требуется свойство пароля источника данных. Предыдущий сценарий не работает, если вы хотите сохранить пароль источника данных в Key Vault и по-прежнему использовать автоматическую конфигурацию Spring для получения источника данных.

В этом случае Spring Cloud Azure обеспечивает интеграцию среды Spring для загрузки секретов из Key Vault перед созданием контекста приложения. Секрет можно использовать для создания и настройки bean во время инициализации контекста приложения Spring. Этот подход является прозрачным способом доступа к секретам из Key Vault, и изменения кода не требуются.

В следующем примере кода показано, как получить PropertySource учетные данные базы данных H2 для создания источника данных из Azure Key Vault.

Чтобы получить URL-адрес базы данных H2 из Key Vault и сохранить данные из базы данных H2 с помощью Spring Data JPA, настройте приложение, выполнив следующие действия.

  1. Добавьте следующие свойства конечной точки и источника данных Key Vault в файл конфигурации 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
    

    Совет

    Примеры конфигурации свойств Spring Cloud Azure см. в разделе Configuration examples в руководстве разработчика Spring Cloud Azure.

    Этот пример — это простой сценарий базы данных с помощью базы данных H2. Используйте База данных Azure для MySQL или База данных Azure для PostgreSQL в рабочей среде и сохраните URL-адрес базы данных, имя пользователя и пароль в Azure Key Vault. Если вы хотите избежать пароля, подключение без пароля является хорошим выбором. Дополнительные сведения см. в разделе Passwordless connections for Azure services.

  2. Создайте новый класс Todo Java. Этот класс представляет собой модель домена, сопоставленную с таблицей todo , которая автоматически создает JPA. Следующий код игнорирует getters методы и 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. Измените файл класса запуска, чтобы отобразить следующее содержимое.

    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. Запустите приложение. Приложение получает URL-адрес базы данных H2 из Key Vault, затем подключается к базе данных H2 и сохраняет данные в базе данных. Вы увидите журналы, аналогичные следующему примеру:

    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
    

Развертывание в Приложения Azure Spring

Теперь, когда у вас есть приложение Spring Boot, работающее локально, пришло время переместить его в рабочую среду. Приложения Azure Spring упрощает развертывание приложений Spring Boot для Azure без каких-либо изменений кода. Эта служба управляет инфраструктурой приложений Spring, благодаря чему разработчики могут сосредоточиться на коде. Приложения Azure Spring обеспечивает управление жизненным циклом с помощью комплексного мониторинга и диагностики, управления конфигурацией, обнаружения служб, интеграции CI/CD, сине-зеленого развертывания и другое. Чтобы развернуть ваше приложение в Приложения Azure Spring, ознакомьтесь со статьей развертывание вашего первого приложения в Приложения Azure Spring.

Следующие шаги