Titkos kód betöltése Azure Key Vault egy Spring Boot-alkalmazásban

Ez az oktatóanyag megmutatja, hogyan használhatja a Key Vaultot a Spring Boot alkalmazásokban a bizalmas konfigurációs adatok védelmére, és hogyan kérhet le konfigurációs tulajdonságokat a Key Vaultból. Key Vault általános titkos kódok, például jelszavak és adatbázis-kapcsolati sztringek 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 adat beállítása az Azure Key Vaultban

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

Ha az H2-adatbázis URL-címét új titkos adatként szeretné tárolni a Key Vault rendszerben, tekintse meg a Quickstart: Titkos adat beállítása és lekérése az Azure Key Vault rendszerből az Azure portál 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.

Megjegyzés

A titkos kulcs megadása után biztosítson hozzáférést az alkalmazásnak a Key Vault-hoz a A Key Vault hozzáférési szabályzat hozzárendelése utasításait követve.

Titok beolvasása az Azure Key Vaultból

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

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ék (BOM):

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

    Megjegyzés

    Ha a Spring Boot 4.0.x-et használja, mindenképpen állítsa a spring-cloud-azure-dependencies verziót 7.2.0 értékre.

    Ha Spring Boot 3.5.x-et használ, mindenképpen állítsa be a spring-cloud-azure-dependencies verziót 6.2.0.

    Ha a Spring Boot 3.1.x-3.5.x verziót használja, mindenképpen állítsa be a verziót spring-cloud-azure-dependencies-ra/c1.

    Ha a Spring Boot 2.x-et használja, mindenképpen állítsa be a spring-cloud-azure-dependencies verziót 4.20.0-re.

    Ezt az anyagjegyzéket (BOM) a <dependencyManagement> 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.

    Az ebben az anyagjegyzékben használt verzióval kapcsolatos további információkért lásd: Melyik Spring Cloud Azure verziót érdemes használnom.

  • 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ódszert használ a titkos kódok Key Vault való 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:

  • Az Azure SDK használata a Key Vault-tal.
  • A Spring KeyVault PropertySourcehasználata.

Azure SDK használata a Key Vault könyvtárral

Az Azure SDK a Key Vault számára SecretClient biztosít a titkok kezeléséhez a Key Vaultban.

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

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

  1. Konfiguráljon egy Key Vault végpontot a 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 Azure Identitást kell használnia. A Spring Cloud Azure DefaultAzureCredential használ, amelyet az Azure Identitástár biztosít a hitelesítő adatok kódmódosítások nélküli beszerzéséhez.

    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álhat Azure CLI, Visual Studio Code, PowerShellt vagy más módszereket. További információ: Azure hitelesítés Java fejlesztési környezetekben. Ha Azure üzemeltetési környezetekben szeretné elvégezni a hitelesítést, javasoljuk, hogy használja a felhasználó által hozzárendelt felügyelt identitást. További információ: Mi 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
    

Önállóan is elkészítheti a SecretClient babot, 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 egy SecretClient bean-t:

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.

Szerencsére a SecretClient babot nem szükséges saját magának létrehoznia a Spring Cloud Azure-val. Ehelyett közvetlenül injektálhat SecretClient, és használhatja a már ismert konfigurációs tulajdonságokat a Key Vault konfigurálásához. 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ókért lásd: Az Azure Service SDK-k globális konfigurációja a Spring Cloud Azure fejlesztői útmutató című részben.

  • 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ó: Kapcsolódás különböző Azure felhőkhöz.

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ásjelszót Key Vault 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 biztosítja a Spring környezeti integrációt, hogy az alkalmazáskörnyezet létrehozása előtt betöltse a Key Vault titkokat. 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 átlátható módja annak, hogy hozzáférhessen a Key Vault titkos kulcsaihoz, és nincs szükség kódmódosításra.

Az alábbi példakód bemutatja, hogyan használható a PropertySource a H2-adatbázis hitelesítő adatainak lekérésére az adatforrás Azure Key Vault-ből való létrehozásához.

Ha le szeretné kérni egy H2-adatbázis URL-címét Key Vault é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égpont- és adatforrás-tulajdonságokat a 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 tulajdonságkonfigurációját a Spring Cloud Azure fejlesztői útmutatókonfigurációs példák szakaszában találja.

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

  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 getters és a setters metódusokat.

    import jakarta.persistence.Entity;
    import jakarta.persistence.GeneratedValue;
    import jakarta.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 Vault, 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 a Azure Spring Apps

Most, hogy a Spring Boot alkalmazás helyben fut, ideje áthelyezni éles környezetbe. Azure Spring Apps megkönnyíti a Spring Boot-alkalmazások Azure való üzembe helyezését 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. Azure Spring Apps teljes körű monitorozás és diagnosztika, konfigurációkezelés, szolgáltatásfelderítés, CI/CD-integráció, kék-zöld környezetek és egyebek használatával biztosítja az életciklus-felügyeletet. Az alkalmazás Azure Spring Apps való üzembe helyezéséről a A Azure Spring Apps első alkalmazás üzembe helyezéséről szóló cikkben olvashat.

Következő lépések