Share via


Conectar Azure Spring Apps a Key Vault mediante identidades administradas

Nota:

Azure Spring Apps es el nuevo nombre del servicio Azure Spring Cloud. Aunque el servicio tiene un nuevo nombre, verá el nombre antiguo en algunos lugares durante un tiempo mientras trabajamos para actualizar recursos, como capturas de pantalla, vídeos y diagramas.

Este artículo se aplica a: ✔️ Java ❌ C#

En este artículo se muestra cómo crear una identidad administrada asignada por el sistema o asignada por el usuario para una aplicación implementada en Azure Spring Apps y usarla para acceder a Azure Key Vault.

Azure Key Vault se puede utilizar para almacenar de forma segura y controlar estrechamente el acceso a los tokens, contraseñas, certificados, claves de API y otros secretos de una aplicación. Puede crear una identidad administrada en microsoft Entra ID y autenticarse en cualquier servicio que admita la autenticación de Microsoft Entra, incluido Key Vault, sin tener que mostrar credenciales en el código.

En el vídeo siguiente se describe cómo administrar secretos mediante Azure Key Vault.


Requisitos previos

  • Suscripción a Azure. Si no tiene una suscripción, cree una cuenta gratuita antes de empezar.
  • CLI de Azure, versión 2.55.0 o posterior.

Proporcione nombres para cada recurso

Cree variables para contener los nombres del recurso mediante los siguientes comandos. Asegúrese de reemplazar los marcadores de posición por sus propios valores.

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

Crear un grupo de recursos

Un grupo de recursos es un contenedor lógico en el que se implementan y se administran los recursos de Azure. Cree un grupo de recursos para que contenga Key Vault y Spring Cloud mediante el comando az group create , como se muestra en el ejemplo siguiente:

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

Configuración de un almacén de claves

Para crear una instancia de Key Vault, use el comando az keyvault create , como se muestra en el ejemplo siguiente:

Importante

Cada instancia de Key Vault debe tener un nombre único.

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

Use el siguiente comando para mostrar la dirección URL de la aplicación y, a continuación, tome nota de la dirección URL devuelta, que tiene el formato https://${KEY_VAULT}.vault.azure.net. Use este valor en el paso siguiente.

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

Ahora puede colocar un secreto en key Vault mediante el comando az keyvault secret set , como se muestra en el ejemplo siguiente:

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

Creación de una aplicación y un servicio de Azure Spring Apps

Después de instalar todas las extensiones correspondientes, use el siguiente comando para crear una instancia de Azure Spring Apps:

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

En el ejemplo siguiente se crea la aplicación con una identidad administrada asignada por el sistema, tal y como solicita el --system-assigned parámetro :

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}

En el ejemplo siguiente, se crea una aplicación denominada springapp con una identidad administrada asignada por el sistema, según solicitó el parámetro --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)

Concesión a la aplicación de acceso a Key Vault

Use el siguiente comando para conceder el acceso adecuado en Key Vault para la aplicación.

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

Nota:

En el caso de la identidad administrada asignada por el sistema, use az keyvault delete-policy --name ${KEY_VAULT} --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} para quitar el acceso de la aplicación después de deshabilitar la identidad administrada asignada por el sistema.

Compilación de una aplicación de Spring Boot de ejemplo con el código de inicio de Spring Boot

Esta aplicación tiene acceso a secretos de Azure Key Vault. Use el inicio de Spring Boot con los secretos de Azure Key Vault. Azure Key Vault se agrega como una instancia de PropertySource de Spring. Se puede acceder a los secretos almacenados en Azure Key Vault y usarlos de forma apropiada como cualquier propiedad de configuración externa, por ejemplo, las propiedades de los archivos.

  1. Use el siguiente comando para generar un proyecto de ejemplo a partir de start.spring.io con Spring Starter de 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. Especifique el almacén de claves en la aplicación.

    cd springapp
    vim src/main/resources/application.properties
    
  3. Para usar la identidad administrada para una aplicación implementada para Azure Spring Apps, agregue propiedades con el siguiente contenido al archivo 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
    

    Nota:

    Debe agregar la dirección URL del almacén de claves en el archivo application.properties, como se ha mostrado anteriormente. De lo contrario, es posible que la dirección URL del almacén de claves no se capture durante la ejecución.

  4. Actualice src/main/java/com/example/demo/DemoApplication.java con el ejemplo de código siguiente. Este código recupera el cadena de conexión de 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));
        }
    }
    

    Si abre el archivo pom.xml, podrá ver la dependencia spring-cloud-azure-starter-keyvault, tal y como se muestra en el ejemplo siguiente:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    
  1. Use el siguiente comando para implementar la aplicación en Azure Spring Apps:

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path
    
  1. Use el siguiente comando para implementar la aplicación en 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. Para probar la aplicación, acceda al punto de conexión público o al punto de conexión de prueba mediante el siguiente comando:

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

    El mensaje siguiente se devuelve en el cuerpo de la respuesta: jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;.

Limpieza de recursos

Use el siguiente comando para eliminar todo el grupo de recursos, incluida la instancia de servicio recién creada:

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

Pasos siguientes