Загрузка секрета из Azure Key Vault в приложении Spring Boot
В этом руководстве показано, как использовать Key Vault в приложениях Spring Boot для защиты конфиденциальных данных конфигурации и получения свойств конфигурации из Key Vault. Key Vault обеспечивает безопасное хранение общих секретов, таких как пароли и строки подключения к базам данных.
Необходимые компоненты
- Подписка Azure — создайте бесплатную учетную запись.
- Пакет средств разработки Java (JDK) версии 8 или более поздней.
- Apache Maven
- Azure CLI
- Экземпляр Key Vault. Если у вас его нет, см. краткое руководство. Создание хранилища ключей с помощью портал Azure. Кроме того, запишите универсальный код ресурса (URI) экземпляра Key Vault, так как он необходим для тестового приложения для этого руководства.
- Приложение Spring Boot. Если у вас его нет, создайте проект Maven с помощью Spring Initializr. Не забудьте выбрать проект Maven и в разделе "Зависимости" добавьте зависимости Spring Web, Spring Data JPA и базы данных H2, а затем выберите Java версии 8 или более поздней.
Внимание
Для выполнения действий, описанных в этой статье, требуется 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, настройте приложение, выполнив следующие действия.
Настройте конечную точку Key Vault в файле конфигурации application.properties .
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
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.
Запустите приложение. Вы увидите журналы, аналогичные следующему примеру:
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, настройте приложение, выполнив следующие действия.
Добавьте следующие свойства конечной точки и источника данных 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.
Создайте новый
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; }
Измените файл класса запуска, чтобы отобразить следующее содержимое.
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> { }
Запустите приложение. Приложение получит 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".