Načtení tajného kódu z Azure Key Vault v aplikaci Spring Boot

V tomto kurzu se dozvíte, jak pomocí Key Vault v aplikacích Spring Boot zabezpečit citlivá konfigurační data a načíst vlastnosti konfigurace z Key Vault. Key Vault poskytuje zabezpečené úložiště obecných tajných kódů, jako jsou hesla a připojovací řetězce databáze.

Požadavky

Důležité

K dokončení kroků v tomto článku se vyžaduje Spring Boot verze 2.5 nebo vyšší.

Nastavení tajného kódu na Azure Key Vault

Tento kurz popisuje, jak číst přihlašovací údaje databáze z Key Vault v aplikaci Spring Boot. Pokud chcete číst přihlašovací údaje z Key Vault, měli byste nejprve uložit přihlašovací údaje databáze do Key Vault.

Pokud chcete adresu URL databáze H2 uložit jako nový tajný kód v Key Vault, přečtěte si téma Quickstart: Nastavení a načtení tajného klíče z Azure Key Vault pomocí portálu Azure. V tomto kurzu nastavíte tajný klíč s názvem h2url a hodnotou jdbc:h2:~/testdb;user=sa;password=password.

Poznámka:

Po nastavení tajného kódu udělte aplikaci přístup k Key Vault podle pokynů v Přiřaďte zásady přístupu Key Vault.

Čtení tajného kódu z Azure Key Vault

Teď, když jsou přihlašovací údaje databáze uložené v Key Vault, můžete je načíst pomocí Azure Spring Cloud.

Pokud chcete nainstalovat modul Spring Cloud Azure Key Vault Starter, přidejte do souboru pom.xml0 následující závislosti:

  • Spring Cloud Azure 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>
    

    Poznámka:

    Pokud používáte Spring Boot 4.0.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 7.2.0.

    Pokud používáte Spring Boot 3.5.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 6.2.0hodnotu.

    Pokud používáte Spring Boot 3.1.x-3.5.x, nezapomeňte nastavit verzi na spring-cloud-azure-dependencies.

    Pokud používáte Spring Boot 2.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 4.20.0.

    Tato faktura materiálu (BOM) by měla být nakonfigurována v <dependencyManagement> části vašeho pom.xml souboru. Tím zajistíte, že všechny závislosti Spring Cloud Azure budou používat stejnou verzi.

    Další informace o verzi použité pro tento kusovník najdete v tématu Kterou verzi Spring Cloud Azure bych měl použít.

  • Artefakt Spring Cloud Azure Key Vault Starter:

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

Spring Cloud Azure má několik metod čtení tajných kódů z Key Vault. Následující metody můžete použít nezávisle nebo je kombinovat pro různé případy použití:

  • Pro Key Vault použijte Azure SDK.
  • Použijte Spring KeyVault PropertySource.

Použití Azure SDK pro Key Vault

Azure SDK pro Key Vault poskytuje SecretClient ke správě tajných kódů v Key Vault.

Následující příklad kódu vám ukáže, jak pomocí SecretClient načíst přihlašovací údaje databáze H2 z Azure Key Vault.

Pokud chcete číst tajný kód pomocí Azure SDK z Key Vault, nakonfigurujte aplikaci pomocí následujícího postupu:

  1. Nakonfigurujte koncový bod Key Vault v konfiguračním souboru application.properties.

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. Injektujte SecretClient bean do vaší Spring aplikace a použijte metodu getSecret k načtení tajemství, jak je znázorněno v následujícím příkladu:

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

    Návod

    V tomto kurzu nejsou v konfiguracích ani kódu žádné ověřovací operace. Připojení ke službám Azure ale vyžaduje ověření. K dokončení ověřování je potřeba použít Azure Identity. Spring Cloud Azure používá DefaultAzureCredential, které knihovna identit Azure poskytuje, aby vám pomohla získat přihlašovací údaje bez jakýchkoli změn kódu.

    DefaultAzureCredential podporuje více metod ověřování a určuje, kterou metodu použít za běhu. Tento přístup umožňuje vaší aplikaci používat různé metody ověřování v různých prostředích (například v místních a produkčních prostředích) bez implementace kódu specifického pro prostředí. Další informace naleznete v tématu DefaultAzureCredential.

    K dokončení ověřování v místních vývojových prostředích můžete použít Azure CLI, Visual Studio Code, PowerShell nebo jiné metody. Další informace najdete v tématu ověřování Azure pro vývojová prostředí Java. K dokončení ověřování v Azure hostitelských prostředích doporučujeme použít spravovanou identitu přiřazenou uživatelem. Další informace najdete v tématu Co jsou spravované identity pro prostředky Azure?

  3. Spusťte aplikaci. Zobrazí se protokoly podobné následujícímu příkladu:

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

Můžete sestavit SecretClient bean sami, ale proces je komplikovaný. V aplikacích Spring Boot musíte spravovat vlastnosti, zjistit vzor tvůrce a zaregistrovat klienta do kontextu aplikace Spring. Následující příklad kódu ukazuje, jak vytvoříte SecretClient bean:

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

}

Následující seznam uvádí některé z důvodů, proč tento kód není flexibilní nebo elegantní:

  • Koncový bod Key Vault je pevně zakódovaný.
  • Pokud používáte @Value k získání konfigurací z prostředí Spring, nemůžete mít v souboru application.properties nápovědy IDE.
  • Pokud máte scénář mikroslužby, musí se kód v každém projektu duplikovat a je snadné udělat chyby a těžko být konzistentní.

Naštěstí není u Azure Spring Cloud nutné vytvářet SecretClient bean sami. Místo toho můžete přímo vložit SecretClient a použít vlastnosti konfigurace, které už znáte ke konfiguraci Key Vault. Další informace najdete v příkladech konfigurace.

Spring Cloud Azure také poskytuje následující globální konfigurace pro různé scénáře. Další informace najdete v sekci Globální konfigurace sad SDK služby Azure vývojářské příručky Spring Cloud Azure.

  • Možnosti proxy serveru.
  • Možnosti opakování
  • Možnosti přenosového klienta HTTP.

Můžete se také připojit k různým Azure cloudům. Další informace najdete v tématu Pojení k různým cloudům Azure.

Použijte Spring Key Vault PropertySource

Předchozí části vám ukázaly, jak po spuštění aplikace používat SecretClient v CommandLineRunner ke čtení tajemství. V aplikacích Spring Boot se ale před spuštěním aplikace vyžaduje čtení tajných kódů. Například vlastnost heslo zdroje dat je vyžadována před spuštěním aplikace. Předchozí scénář nebude fungovat, pokud chcete uložit heslo zdroje dat do Key Vault a přesto použít automatickou konfiguraci Spring k získání zdroje dat.

V tomto případě Azure Spring Cloud poskytuje integraci prostředí Spring pro načtení tajných kódů z Key Vault před sestavením kontextu aplikace. Tajný kód můžete použít k vytvoření a konfiguraci bean během inicializace kontextu aplikace Spring. Tento přístup je transparentní způsob, jak získat přístup k tajným kódům z Key Vault a nevyžaduje se žádné změny kódu.

Následující příklad kódu ukazuje, jak pomocí PropertySource načíst přihlašovací údaje databáze H2 k sestavení zdroje dat z Azure Key Vault.

Pokud chcete načíst adresu URL databáze H2 z Key Vault a uložit data z databáze H2 pomocí jpa Spring Data, nakonfigurujte aplikaci následujícím postupem:

  1. Do konfiguračního souboru application.properties přidejte následující vlastnosti koncového bodu Key Vault a zdroje dat.

    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
    

    Návod

    Příklady konfigurace vlastností Azure Spring Cloudu najdete v části Konfigurace příručky pro vývojáře Spring Cloud Azure.

    Tento příklad je jednoduchý databázový scénář s využitím databáze H2. Doporučujeme používat Azure Database for MySQL nebo Azure Database for PostgreSQL v produkčním prostředí a ukládat adresu URL databáze, uživatelské jméno a heslo do Azure Key Vault. Pokud se chcete vyhnout heslu, je dobrou volbou připojení bez hesla. Další informace dočtete se v tématu Připojení bez hesla pro služby Azure.

  2. Vytvořte novou třídu Todo Java. Tato třída je doménový model mapovaný na todo tabulku, kterou automaticky vytvoří JPA. Následující kód ignoruje getters metody a setters metody.

    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. Upravte soubor spouštěcí třídy, aby se zobrazil následující obsah.

    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. Spusťte aplikaci. Aplikace načte adresu URL databáze H2 z Key Vault, pak se připojí k databázi H2 a uloží data do databáze. Zobrazí se protokoly podobné následujícímu příkladu:

    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
    

Nasazení do Azure Spring Apps

Teď, když máte aplikaci Spring Boot spuštěnou místně, je čas ji přesunout do produkčního prostředí. Azure Spring Apps usnadňuje nasazování aplikací Spring Boot do Azure bez jakýchkoli změn kódu. Služba spravuje infrastrukturu aplikací Spring, aby se vývojáři mohli soustředit na svůj kód. Azure Spring Apps poskytuje správu životního cyklu pomocí komplexního monitorování a diagnostiky, správy konfigurace, zjišťování služeb, integrace CI/CD, modrých zelených nasazení a dalších. Pokud chcete aplikaci nasadit do Azure Spring Apps, viz Nasazení první aplikace na Azure Spring Apps.

Další kroky