Подключение Azure Spring Apps в Key Vault с помощью управляемых удостоверений

Примечание.

Azure Spring Apps — это новое название службы Azure Spring Cloud. Старое название будет еще некоторое время встречаться в наших материалах, пока мы не обновим ресурсы, такие как снимки экрана, видео и схемы.

Эта статья применима к: ✔️ Java ❌ C#

В этой статье показано, как создать управляемое удостоверение, назначаемое системой или назначаемое пользователем, для приложения, развернутого в Azure Spring Apps, и использовать его для доступа к Azure Key Vault.

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

В следующем видео описано, как управлять секретами с помощью Azure Key Vault.


Необходимые компоненты

Укажите имена для каждого ресурса

Создайте переменные для хранения имен ресурсов с помощью следующих команд. Обязательно замените заполнители своими значениями.

export LOCATION=<location>
export RESOURCE_GROUP=myresourcegroup
export SPRING_APPS=myasa
export APP=springapp-system
export KEY_VAULT=<your-keyvault-name>

Создание или изменение группы ресурсов

Группа ресурсов — это логический контейнер, в котором происходит развертывание ресурсов Azure и управление ими. Создайте группу ресурсов, чтобы содержать Key Vault и Spring Cloud с помощью команды az group create , как показано в следующем примере:

az group create --name ${RESOURCE_GROUP} --location ${LOCATION}

Настройка Key Vault

Чтобы создать Key Vault, используйте команду az keyvault create , как показано в следующем примере:

Важно!

Каждый Key Vault должен иметь уникальное имя.

az keyvault create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT}

Используйте следующую команду, чтобы отобразить URL-адрес приложения, а затем запишите возвращенный URL-адрес, который находится в формате https://${KEY_VAULT}.vault.azure.net. Используйте это значение на следующем шаге.

az keyvault show \
    --resource-group ${RESOURCE_GROUP} \
    --name ${KEY_VAULT} \
    --query properties.vaultUri --output tsv

Теперь вы можете поместить секрет в Key Vault с помощью команды az keyvault secret set , как показано в следующем примере:

az keyvault secret set \
    --vault-name ${KEY_VAULT} \
    --name "connectionString" \
    --value "jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;"

Создание приложения и службы Azure Spring Apps

После установки всех соответствующих расширений используйте следующую команду, чтобы создать экземпляр Azure Spring Apps:

az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --sku Enterprise \
    --name ${SPRING_APPS}

В следующем примере создается приложение с управляемым удостоверением, назначаемым системой, в соответствии с запросом --system-assigned параметра:

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)
az extension add --upgrade --name spring
az spring create \
    --resource-group ${RESOURCE_GROUP} \
    --name ${SPRING_APPS}

В приведенном ниже примере создается приложение springapp с управляемым удостоверением, назначаемым системой, как определено параметром --system-assigned.

az spring app create \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --assign-endpoint true \
    --runtime-version Java_17 \
    --system-assigned
export MANAGED_IDENTITY_PRINCIPAL_ID=$(az spring app show \
    --resource-group ${RESOURCE_GROUP} \
    --service ${SPRING_APPS} \
    --name ${APP} \
    --query identity.principalId --output tsv)

Предоставление приложению доступа к Key Vault

Чтобы предоставить приложению доступ к Key Vault, выполните следующую команду:

az keyvault set-policy \
    --name ${KEY_VAULT} \
    --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} \
    --secret-permissions set get list

Примечание.

Для управляемого удостоверения, назначаемого системой, используйте az keyvault delete-policy --name ${KEY_VAULT} --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} для удаления доступа для приложения после отключения управляемого удостоверения, назначаемого системой.

Создание примера приложения Spring Boot с помощью стартера Spring Boot

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

  1. Используйте следующую команду, чтобы создать пример проекта на основе start.spring.io с помощью начального примера Spring для Azure Key Vault.

    curl https://start.spring.io/starter.tgz -d dependencies=web,azure-keyvault -d baseDir=springapp -d bootVersion=3.2.1 -d javaVersion=17 -d type=maven-project | tar -xzvf -
    
  2. Определите Key Vault в приложении.

    cd springapp
    vim src/main/resources/application.properties
    
  3. Чтобы использовать управляемое удостоверение для приложения, развернутого в Azure Spring Apps, добавьте свойства со следующим содержимым в файл src/main/resources/application.properties .

    spring.cloud.azure.keyvault.secret.property-sources[0].endpoint=<your-keyvault-url>
    spring.cloud.azure.keyvault.secret.property-sources[0].credential.managed-identity-enabled=true
    

    Примечание.

    Необходимо добавить URL-адрес хранилища ключей в файл application.properties , как показано ранее. В противном случае URL-адрес хранилища ключей не будет использоваться во время выполнения.

  4. Обновите src/main/java/com/example/demo/DemoApplication.java с помощью следующего примера кода. Этот код извлекает строка подключения из Key Vault.

    package com.example.demo;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @SpringBootApplication
    @RestController
    public class DemoApplication implements CommandLineRunner {
    
        @Value("${connectionString}")
        private String connectionString;
    
        public static void main(String[] args) {
            SpringApplication.run(DemoApplication.class, args);
        }
    
        @GetMapping("get")
        public String get() {
            return connectionString;
        }
    
        public void run(String... args) throws Exception {
            System.out.println(String.format("\nConnection String stored in Azure Key Vault:\n%s\n",connectionString));
        }
    }
    

    Если открыть файл pom.xml , можно увидеть spring-cloud-azure-starter-keyvault зависимость, как показано в следующем примере:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    
  1. Используйте следующую команду для развертывания приложения в Azure Spring Apps:

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path
    
  1. Используйте следующую команду для развертывания приложения в Azure Spring Apps:

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path \
        --build-env BP_JVM_VERSION=17
    
  1. Чтобы протестировать приложение, получите доступ к общедоступной конечной точке или тестовой конечной точке, выполнив следующую команду:

    curl https://${SPRING_APPS}-${APP}.azuremicroservices.io/get
    

    Следующее сообщение возвращается в тексте ответа: jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;

Очистка ресурсов

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

az group delete --name ${RESOURCE_GROUP} --yes

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