Titkos kód betöltése az Azure Key Vaultból Spring Boot-alkalmazásban

Ez az oktatóanyag bemutatja, hogyan használhatja a Key Vaultot a Spring Boot-alkalmazásokban a bizalmas konfigurációs adatok védelmére és a konfigurációs tulajdonságok Key Vaultból való lekérésére. A Key Vault általános titkos kulcsok, például jelszavak és adatbázis-kapcsolati sztring biztonságos tárolását biztosítja.

Előfeltételek

Fontos

A cikkben ismertetett lépések elvégzéséhez a Spring Boot 2.5-ös vagy újabb verziójára van szükség.

Titkos kulcs beállítása az Azure Key Vaulthoz

Ez az oktatóanyag bemutatja, hogyan olvashatja be az adatbázis hitelesítő adatait a Key Vaultból egy Spring Boot-alkalmazásban. A Key Vault hitelesítő adatainak olvasásához először az adatbázis hitelesítő adatait kell tárolnia a Key Vaultban.

Ha egy H2-adatbázis URL-címét új titkos kódként szeretné tárolni a Key Vaultban, olvassa el a rövid útmutatót: Titkos kulcs beállítása és lekérése az Azure Key Vaultból az Azure Portal használatával. Ebben az oktatóanyagban egy titkos kulcsot fog beállítani névvel h2url és értékkel jdbc:h2:~/testdb;user=sa;password=password.

Feljegyzés

A titkos kód beállítása után adjon hozzáférést az alkalmazásnak a Key Vaulthoz a Key Vault hozzáférési szabályzatának hozzárendelésével.

Titkos kód beolvasása az Azure Key Vaultból

Most, hogy az adatbázis hitelesítő adatai a Key Vaultban lettek tárolva, lekérheti őket a Spring Cloud Azure-ban.

A Spring Cloud Azure Key Vault Starter modul telepítéséhez adja hozzá a következő függőségeket a pom.xml fájlhoz:

  • A Spring Cloud Azure Anyagjegyzéke (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.11.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Feljegyzés

    Ha Spring Boot 2.x-et használ, mindenképpen állítsa be a verziót 4.17.0.spring-cloud-azure-dependencies Ezt az anyagjegyzéket (BOM) a <dependencyManagement> pom.xml fájl szakaszában kell konfigurálni. Ez biztosítja, hogy minden Spring Cloud Azure-függőség ugyanazt a verziót használja. A BOM-hez használt verzióról további információt a Spring Cloud Azure melyik verzióját érdemes használni.

  • A Spring Cloud Azure Key Vault Starter összetevő:

    <dependency>
      <groupId>com.azure.spring</groupId>
      <artifactId>spring-cloud-azure-starter-keyvault</artifactId>
    </dependency>
    

A Spring Cloud Azure számos módszerrel rendelkezik a Key Vault titkos kulcsainak olvasására. A következő módszereket egymástól függetlenül használhatja, vagy kombinálhatja őket különböző használati esetekhez:

  • Használja az Azure SDK for Key Vaultot.
  • A Spring KeyVault PropertySourcehasználata.

Az Azure SDK használata a Key Vaulthoz

Az Azure SDK for Key Vault titkos kulcsokat kezel SecretClient a Key Vaultban.

Az alábbi példakód bemutatja, hogyan lehet lekérni SecretClient a H2-adatbázis hitelesítő adatait az Azure Key Vaultból.

Ha az Azure SDK-val szeretne titkos kódot olvasni a Key Vaultból, konfigurálja az alkalmazást az alábbi lépések végrehajtásával:

  1. Key Vault-végpont konfigurálása az application.properties konfigurációs fájlban.

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. Injektálja a SecretClient babot a Spring-alkalmazásba, és használja a getSecret metódust egy titkos kód lekéréséhez, ahogyan az alábbi példában látható:

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

    Tipp.

    Ebben az oktatóanyagban nincsenek hitelesítési műveletek a konfigurációkban vagy a kódban. Az Azure-szolgáltatásokhoz való csatlakozáshoz azonban hitelesítés szükséges. A hitelesítés befejezéséhez az Azure Identity-et kell használnia. A Spring Cloud Azure DefaultAzureCredentialaz Azure Identity-kódtár használatával segít a hitelesítő adatok kódmódosítások nélküli beszerzésében.

    DefaultAzureCredential több hitelesítési módszert támogat, és meghatározza, hogy melyik metódust használja futásidőben. Ez a megközelítés lehetővé teszi, hogy az alkalmazás különböző hitelesítési módszereket használjon különböző környezetekben (például helyi és éles környezetekben) környezetspecifikus kód implementálása nélkül. További információ: DefaultAzureCredential.

    A helyi fejlesztési környezetekben a hitelesítés befejezéséhez használhatja az Azure CLI-t, a Visual Studio Code-ot, a PowerShellt vagy más módszereket. További információ: Azure-hitelesítés Java-fejlesztési környezetekben. A hitelesítés azure-beli üzemeltetési környezetekben való elvégzéséhez javasoljuk a felhasználó által hozzárendelt felügyelt identitás használatát. További információ: Mik az Azure-erőforrások felügyelt identitásai?

  3. Indítsa el az alkalmazást. A következő példához hasonló naplók láthatók:

    h2url: jdbc:h2:~/testdb;user=sa;password=password
    

A babot SecretClient önállóan is elkészítheti, de a folyamat bonyolult. A Spring Boot-alkalmazásokban kezelnie kell a tulajdonságokat, meg kell tanulnia a szerkesztői mintát, és regisztrálnia kell az ügyfelet a Spring-alkalmazás környezetében. Az alábbi példakód bemutatja, hogyan hozhat létre babot SecretClient :

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

}

Az alábbi listában látható néhány ok, amiért ez a kód nem rugalmas vagy kecses:

  • A Key Vault-végpont kódolt.
  • Ha a Spring-környezetből szeretne @Value konfigurációkat lekérni, az application.properties fájlban nem szerepelhetnek IDE-tippek.
  • Ha mikroszolgáltatási forgatókönyve van, a kódot minden projektben duplikálni kell, és könnyű hibákat elkövetni, és nehéz konzisztensnek lenni.

A Spring Cloud Azure-ban szerencsére nem szükséges önállóan összeállítani a SecretClient babot. Ehelyett közvetlenül injektálhatja SecretClient és használhatja a Key Vault konfigurálásához már ismert konfigurációs tulajdonságokat. További információ: Konfigurációs példák.

A Spring Cloud Azure a következő globális konfigurációkat is biztosítja a különböző forgatókönyvekhez. További információ: Az Azure Service SDK-k globális konfigurációja a Spring Cloud Azure fejlesztői útmutatójában.

  • Proxybeállítások.
  • Újrapróbálkozás beállításai.
  • HTTP átviteli ügyfél beállításai.

Különböző Azure-felhőkhöz is csatlakozhat. További információ: Csatlakozás különböző Azure-felhőkbe.

A Spring Key Vault PropertySource használata

Az előző szakaszok bemutatták, hogyan használható SecretClient a CommandLineRunner titkos kód olvasására az alkalmazás elindítása után. A Spring Boot-alkalmazásokban azonban a titkos kódok olvasására van szükség az alkalmazás elindítása előtt. Az adatforrás jelszótulajdonságára például az alkalmazás elindítása előtt van szükség. Az előző forgatókönyv nem fog működni, ha az adatforrás jelszavát a Key Vaultban szeretné tárolni, és továbbra is a Spring automatikus konfigurációját használja az adatforrás lekéréséhez.

Ebben az esetben a Spring Cloud Azure spring environment-integrációt biztosít a Key Vault titkos kulcsainak betöltéséhez az alkalmazáskörnyezet létrehozása előtt. A titkos kóddal létrehozhatja és konfigurálhatja a babot a Spring-alkalmazás környezetének inicializálása során. Ez a megközelítés transzparens módon érhető el a Key Vault titkos kulcsaihoz, és nincs szükség kódmódosításra.

Az alábbi példakód bemutatja, hogyan lehet PropertySource lekérni a H2-adatbázis hitelesítő adatait az adatforrás Azure Key Vaultból való létrehozásához.

Ha le szeretné kérni egy H2-adatbázis URL-címét a Key Vaultból, és adatokat szeretne tárolni a H2-adatbázisból a Spring Data JPA használatával, konfigurálja az alkalmazást az alábbi lépések végrehajtásával:

  1. Adja hozzá a következő Key Vault-végpontot és adatforrás-tulajdonságokat az application.properties konfigurációs fájlhoz.

    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
    

    Tipp.

    A Spring Cloud Azure-beli tulajdonságkonfigurációra vonatkozó példákért tekintse meg a Spring Cloud Azure fejlesztői útmutatójának Konfigurációs példák szakaszát.

    Tipp.

    Ez a példa egy H2-adatbázist használó egyszerű adatbázis-forgatókönyv. Javasoljuk, hogy éles környezetben használja az Azure Database for MySQL-t vagy az Azure Database for PostgreSQL-t, és tárolja az adatbázis URL-címét, felhasználónevét és jelszavát az Azure Key Vaultban. Ha el szeretné kerülni a jelszót, a jelszó nélküli kapcsolatok jó választás. További információ: Jelszó nélküli kapcsolatok az Azure-szolgáltatásokhoz.

  2. Hozzon létre egy új Todo Java-osztályt. Ez az osztály egy olyan tartománymodell, amely a todo JPA által automatikusan létrehozott táblára van leképezve. Az alábbi kód figyelmen kívül hagyja a metódusokat és setters a getters metódusokat.

    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;
    
    }
    
  3. Szerkessze az indítási osztályfájlt a következő tartalom megjelenítéséhez.

    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> {
    
    }
    
  4. Indítsa el az alkalmazást. Az alkalmazás lekéri a H2-adatbázis URL-címét a Key Vaultból, majd csatlakozik a H2-adatbázishoz, és adatokat tárol az adatbázisba. A következő példához hasonló naplók láthatók:

    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
    

Üzembe helyezés az Azure Spring Appsben

Most, hogy a Spring Boot-alkalmazás helyileg fut, ideje éles környezetbe áthelyezni. Az Azure Spring Apps megkönnyíti a Spring Boot-alkalmazások üzembe helyezését az Azure-ban kódmódosítások nélkül. A szolgáltatás kezeli a Spring-alkalmazások infrastruktúráját, hogy a fejlesztők a kódjukra összpontosíthassanak. Az Azure Spring Apps átfogó monitorozási és diagnosztikai, konfigurációkezelési, szolgáltatásfelderítési, CI/CD-integrációs, kék-zöld környezetek és egyebek használatával biztosítja az életciklus-felügyeletet. Az alkalmazás Azure Spring Appsben való üzembe helyezéséről az első alkalmazás üzembe helyezése az Azure Spring Appsben című témakörben olvashat.

Következő lépések