Загрузка секрета из 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 (BOM):

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

    Примечание.

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

  • Артефакт Начального приложения Azure Key Vault Spring Cloud:

    <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 Вставьте боб в приложение 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.

  • Параметры прокси-сервера.
  • Параметры повтора.
  • Параметры клиента транспорта 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 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. Измените файл класса запуска, чтобы отобразить следующее содержимое.

    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".

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