Condividi tramite


Connettere Azure Spring Apps a Key Vault usando le identità gestite

Nota

I piani Basic, Standard ed Enterprise saranno deprecati a partire dalla metà di marzo 2025, con un periodo di ritiro di 3 anni. È consigliabile eseguire la transizione ad App Azure Container. Per altre informazioni, vedere l'annuncio di ritiro di Azure Spring Apps.

Il piano Standard a consumo e dedicato sarà deprecato a partire dal 30 settembre 2024, con un arresto completo dopo sei mesi. È consigliabile eseguire la transizione ad App Azure Container. Per altre informazioni, vedere Eseguire la migrazione del consumo di Azure Spring Apps Standard e del piano dedicato alle app Azure Container.

Questo articolo si applica a: ✔️ Java ❌ C#

Questo articolo illustra come creare un'identità gestita assegnata dal sistema o assegnata dall'utente per un'app distribuita in Azure Spring Apps e usarla per accedere ad Azure Key Vault.

Azure Key Vault può essere usato per archiviare in modo sicuro e controllare rigorosamente l'accesso a token, password, certificati, chiavi API e altri segreti dell'app. È possibile creare un'identità gestita in Microsoft Entra ID ed eseguire l'autenticazione a qualsiasi servizio che supporti l'autenticazione di Microsoft Entra, incluso Key Vault, senza dover visualizzare le credenziali nel codice.

Il video seguente descrive come gestire i segreti usando Azure Key Vault.


Prerequisiti

Specificare i nomi per ogni risorsa

Creare variabili per contenere i nomi delle risorse usando i comandi seguenti. Assicurarsi di sostituire i segnaposto con i propri valori.

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

Creare un gruppo di risorse

Un gruppo di risorse è un contenitore logico in cui vengono distribuite e gestite le risorse di Azure. Creare un gruppo di risorse per contenere sia Key Vault che Spring Cloud usando il comando az group create , come illustrato nell'esempio seguente:

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

Configurare l'insieme di credenziali delle chiavi

Per creare un insieme di credenziali delle chiavi, usare il comando az keyvault create , come illustrato nell'esempio seguente:

Importante

Ogni insieme di credenziali delle chiavi deve avere un nome univoco.

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

Usare il comando seguente per visualizzare l'URL dell'app e quindi prendere nota dell'URL restituito, nel formato https://${KEY_VAULT}.vault.azure.net. Usare questo valore nel passaggio seguente.

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

È ora possibile inserire un segreto nell'insieme di credenziali delle chiavi usando il comando az keyvault secret set , come illustrato nell'esempio seguente:

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

Creare un servizio e un'app di Azure Spring Apps

Dopo aver installato tutte le estensioni corrispondenti, usare il comando seguente per creare un'istanza di Azure Spring Apps:

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

L'esempio seguente crea l'app con un'identità gestita assegnata dal sistema, come richiesto dal --system-assigned parametro :

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}

L'esempio seguente crea un'app denominata springapp con un'identità gestita assegnata dal sistema, come richiesto dal parametro --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)

Concedere all'app l'accesso a Key Vault

Usare il comando seguente per concedere l'accesso appropriato in Key Vault per l'app:

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

Nota

Per l'identità gestita assegnata dal sistema, usare az keyvault delete-policy --name ${KEY_VAULT} --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} per rimuovere l'accesso per l'app dopo che l'identità gestita assegnata dal sistema è disabilitata.

Creare un'app Spring Boot di esempio con Spring Boot Starter

Questa app ha accesso per ottenere segreti da Azure Key Vault. Usare l'utilità di avvio Spring Boot segreti di Azure Key Vault. Azure Key Vault viene aggiunto come istanza di Spring PropertySource. È possibile accedere facilmente ai segreti archiviati in Azure Key Vault e usarli come qualsiasi proprietà di configurazione esternalizzata, come le proprietà dei file.

  1. Usare il comando seguente per generare un progetto di esempio da start.spring.io con Azure Key Vault Spring Starter.

    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. Specificare l'insieme di credenziali delle chiavi nell'app.

    cd springapp
    vim src/main/resources/application.properties
    
  3. Per usare l'identità gestita per un'app distribuita in Azure Spring Apps, aggiungere proprietà con il contenuto seguente al file 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

    È necessario aggiungere l'URL dell'insieme di credenziali delle chiavi nel file application.properties , come illustrato in precedenza. In caso contrario, l'URL dell'insieme di credenziali delle chiavi potrebbe non essere acquisito durante il runtime.

  4. Aggiornare src/main/java/com/example/demo/DemoApplication.java con l'esempio di codice seguente. Questo codice recupera il stringa di connessione dall'insieme di credenziali delle chiavi.

    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));
        }
    }
    

    Se si apre il file pom.xml , è possibile visualizzare la spring-cloud-azure-starter-keyvault dipendenza, come illustrato nell'esempio seguente:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    
  1. Usare il comando seguente per distribuire l'app in Azure Spring Apps:

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path
    
  1. Usare il comando seguente per distribuire l'app in 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. Per testare l'app, accedere all'endpoint pubblico o all'endpoint di test usando il comando seguente:

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

    Il messaggio seguente viene restituito nel corpo della risposta: jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;.

Pulire le risorse

Usare il comando seguente per eliminare l'intero gruppo di risorse, inclusa l'istanza del servizio appena creata:

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

Passaggi successivi