Połączenie usługi Azure Spring Apps do usługi Key Vault przy użyciu tożsamości zarządzanych

Uwaga

Azure Spring Apps to nowa nazwa usługi Azure Spring Cloud. Mimo że usługa ma nową nazwę, stara nazwa będzie widoczna w niektórych miejscach przez pewien czas, ponieważ pracujemy nad aktualizowaniem zasobów, takich jak zrzuty ekranu, filmy wideo i diagramy.

Ten artykuł dotyczy: ✔️ Java ❌ C#

W tym artykule pokazano, jak utworzyć tożsamość zarządzaną przypisaną przez system lub przypisaną przez użytkownika dla aplikacji wdrożonej w usłudze Azure Spring Apps i użyć jej do uzyskiwania dostępu do usługi Azure Key Vault.

Za pomocą usługi Azure Key Vault można bezpiecznie przechowywać i ściśle kontrolować dostęp do tokenów, haseł, certyfikatów, kluczy interfejsu API i innych wpisów tajnych dla aplikacji. Tożsamość zarządzaną można utworzyć w usłudze Microsoft Entra ID i uwierzytelnić w dowolnej usłudze obsługującej uwierzytelnianie firmy Microsoft Entra, w tym w usłudze Key Vault, bez konieczności wyświetlania poświadczeń w kodzie.

W poniższym filmie wideo opisano sposób zarządzania wpisami tajnymi przy użyciu usługi Azure Key Vault.


Wymagania wstępne

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji, przed rozpoczęciem utwórz bezpłatne konto .
  • Jeśli wdrażasz wystąpienie planu Usługi Azure Spring Apps Enterprise po raz pierwszy w subskrypcji docelowej, zobacz sekcję Wymagania planu przedsiębiorstwa w witrynie Azure Marketplace.
  • Interfejs wiersza polecenia platformy Azure w wersji 2.55.0 lub nowszej.

Podaj nazwy dla każdego zasobu

Utwórz zmienne do przechowywania nazw zasobów przy użyciu następujących poleceń. Pamiętaj, aby zastąpić symbole zastępcze własnymi wartościami.

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

Tworzenie grupy zasobów

Grupa zasobów to logiczny kontener przeznaczony do wdrażania zasobów platformy Azure i zarządzania nimi. Utwórz grupę zasobów zawierającą zarówno usługę Key Vault, jak i platformę Spring Cloud przy użyciu polecenia az group create , jak pokazano w poniższym przykładzie:

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

Konfigurowanie usługi Key Vault

Aby utworzyć usługę Key Vault, użyj polecenia az keyvault create , jak pokazano w poniższym przykładzie:

Ważne

Każda usługa Key Vault musi mieć unikatową nazwę.

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

Użyj następującego polecenia, aby wyświetlić adres URL aplikacji, a następnie zanotować zwrócony adres URL, który ma format https://${KEY_VAULT}.vault.azure.net. Użyj tej wartości w poniższym kroku.

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

Teraz możesz umieścić wpis tajny w usłudze Key Vault przy użyciu polecenia az keyvault secret set , jak pokazano w poniższym przykładzie:

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

Tworzenie usługi Azure Spring Apps i aplikacji

Po zainstalowaniu wszystkich odpowiednich rozszerzeń użyj następującego polecenia, aby utworzyć wystąpienie usługi Azure Spring Apps:

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

Poniższy przykład tworzy aplikację z tożsamością zarządzaną przypisaną przez system zgodnie z żądaniem parametru --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}

Poniższy przykład tworzy aplikację o nazwie springapp z tożsamością zarządzaną przypisaną przez system zgodnie z żądaniem parametru --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)

Udzielanie aplikacji dostępu do usługi Key Vault

Użyj następującego polecenia, aby udzielić odpowiedniego dostępu w usłudze Key Vault dla aplikacji:

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

Uwaga

W przypadku tożsamości zarządzanej przypisanej przez system użyj polecenia az keyvault delete-policy --name ${KEY_VAULT} --object-id ${MANAGED_IDENTITY_PRINCIPAL_ID} , aby usunąć dostęp do aplikacji po wyłączeniu tożsamości zarządzanej przypisanej przez system.

Tworzenie przykładowej aplikacji Spring Boot przy użyciu szablonu startowego Spring Boot

Ta aplikacja ma dostęp do uzyskiwania wpisów tajnych z usługi Azure Key Vault. Użyj szablonu startowego Spring Boot wpisów tajnych usługi Azure Key Vault. Usługa Azure Key Vault jest dodawana jako wystąpienie usługi Spring PropertySource. Dostęp do wpisów tajnych przechowywanych w usłudze Azure Key Vault można wygodnie uzyskiwać i używać jak dowolna zewnętrzna właściwość konfiguracji, taka jak właściwości w plikach.

  1. Użyj następującego polecenia, aby wygenerować przykładowy projekt z start.spring.io usługi 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. Określ usługę Key Vault w aplikacji.

    cd springapp
    vim src/main/resources/application.properties
    
  3. Aby użyć tożsamości zarządzanej dla aplikacji wdrożonej w usłudze Azure Spring Apps, dodaj właściwości z następującą zawartością do pliku 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
    

    Uwaga

    Musisz dodać adres URL magazynu kluczy w pliku application.properties , jak pokazano wcześniej. W przeciwnym razie adres URL magazynu kluczy może nie być przechwytywany podczas wykonywania.

  4. Zaktualizuj plik src/main/java/com/example/demo/DemoApplication.java przy użyciu poniższego przykładu kodu. Ten kod pobiera parametry połączenia z usługi 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));
        }
    }
    

    Po otwarciu pliku pom.xml można zobaczyć spring-cloud-azure-starter-keyvault zależność, jak pokazano w poniższym przykładzie:

    <dependency>
        <groupId>com.azure.spring</groupId>
        <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    
  1. Użyj następującego polecenia, aby wdrożyć aplikację w usłudze Azure Spring Apps:

    az spring app deploy \
        --resource-group ${RESOURCE_GROUP} \
        --service ${SPRING_APPS} \
        --name ${APP} \
        --source-path
    
  1. Użyj następującego polecenia, aby wdrożyć aplikację w usłudze 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. Aby przetestować aplikację, uzyskaj dostęp do publicznego punktu końcowego lub testowego punktu końcowego przy użyciu następującego polecenia:

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

    W treści odpowiedzi zostanie zwrócony następujący komunikat: jdbc:sqlserver://SERVER.database.windows.net:1433;database=DATABASE;.

Czyszczenie zasobów

Użyj następującego polecenia, aby usunąć całą grupę zasobów, w tym nowo utworzone wystąpienie usługi:

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

Następne kroki