Поделиться через


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

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

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

Внимание

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

Настройка секрета в Azure Key Vault

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

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

Примечание.

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

Получение секрета из Azure Key Vault

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

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

  • Спецификация материалов Spring Cloud Azure (BOM):

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

    Примечание.

    Если вы используете Spring Boot 2.x, обязательно установите версию spring-cloud-azure-dependencies на значение 4.20.0. Этот счет материалов (BOM) должен быть настроен в <dependencyManagement> разделе pom.xml файла. Это гарантирует, что все зависимости Azure Spring Cloud используют одну и ту же версию. Дополнительные сведения о версии, используемой для этого BOM, см. в статье "Какая версия Spring Cloud Azure должна использоваться".

  • Артефакт стартер-пакета Spring Cloud для Azure Key Vault:

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

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

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

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

Пакет SDK Azure для Key Vault предоставляет SecretClient для управления секрета́ми в Key Vault.

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

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

  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.
  • Если у вас есть сценарий микросервисов, код приходится дублировать в каждом проекте, и легко ошибиться, а поддерживать согласованность сложно.

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

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

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

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

Используйте Spring Key Vault PropertySource

В предыдущих разделах показано, как использовать SecretClient в CommandLineRunner, чтобы считать секрет после запуска приложения. Однако в приложениях 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
    

    Совет

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

    Совет

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

  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 Apps

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

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