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

Ez az oktatóanyag bemutatja, hogyan tölthet be titkos kódokat Azure Key Vault egy Spring Boot-alkalmazásban a bizalmas konfigurációs adatok védelme érdekében. Azure Key Vault biztonságos tárterületet biztosít olyan titkos kódokhoz, mint a jelszavak és az adatbázis-kapcsolati sztringek.

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 állít be 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

Miután Key Vault tárolta az adatbázis hitelesítő adatait, a Spring Cloud Azure használatával lekérheti őket.

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.4.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Megjegyzés

    Ha Spring Boot 4.0.x-et használ, állítsa a verziót a spring-cloud-azure-dependencies következőre 7.4.0: .

    Ha a Spring Boot 3.5.x-et használja, állítsa a verziót a spring-cloud-azure-dependencies következőre 6.5.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 kínál az 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:

  • 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 lekérni SecretClient a H2-adatbázis hitelesítő adatait Azure Key Vault.

Ha a Key Vault titkos kódjának Azure SDK használatával szeretne beolvasni, 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
    

A babot SecretClient saját maga 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 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, minden projektben duplikálnia kell a kódot. Könnyű hibákat elkövetni, és nehéz konzisztensnek lenni.

Szerencsére a Spring Cloud Azure leegyszerűsíti a bab készítésétSecretClient. A bab manuális létrehozása helyett közvetlenül injektálhatja 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 bemutatjá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 az alkalmazás indítása előtt el kell olvasnia a titkos kulcsokat. 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 működik, 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 lehet PropertySource lekérni a H2-adatbázis hitelesítő adatait az adatforrás Azure Key Vault.

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. Használjon Azure Database for MySQL vagy Azure Database for PostgreSQL éles környezetben, é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