Načtení tajného kódu ze služby Azure Key Vault v aplikaci Spring Boot

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

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 pro Azure Key Vault

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

Informace o uložení adresy URL databáze H2 jako nového tajného kódu ve službě Key Vault najdete v rychlém startu: Nastavení a načtení tajného klíče ze služby Azure Key Vault pomocí webu Azure Portal. 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 ke službě Key Vault podle pokynů v části Přiřazení zásad přístupu ke službě Key Vault.

Čtení tajného kódu ze služby Azure Key Vault

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

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

  • Kusovník materiálů (BOM) Spring Cloud v Azure:

    <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>
    

    Poznámka:

    Pokud používáte Spring Boot 2.x, nezapomeňte nastavit spring-cloud-azure-dependencies verzi na 4.17.0. Tato faktura materiálu (BOM) by měla být nakonfigurována v <dependencyManagement> části vašeho pom.xml souboru. Tím se zajistí, že všechny závislosti Azure Spring Cloudu budou používat stejnou verzi. Další informace o verzi použité pro tuto kusovníku najdete v tématu Jakou verzi Spring Cloud Azure mám použít.

  • Úvodní artefakt služby Spring Cloud pro Azure Key Vault:

    <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ů ze služby Key Vault. Následující metody můžete použít nezávisle nebo je kombinovat pro různé případy použití:

  • Použití sady Azure SDK pro Key Vault
  • Použijte Spring KeyVault PropertySource.

Použití sady Azure SDK pro Key Vault

Sada Azure SDK pro Key Vault poskytuje SecretClient správu tajných kódů ve službě Key Vault.

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

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

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

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. SecretClient Do aplikace Spring vložíte bean a použijete metodu getSecret k načtení tajného kódu, 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());
        }
    }
    

    Tip

    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 identitu Azure. Spring Cloud Azure používá DefaultAzureCredential, kterou poskytuje knihovna identit Azure, která vám pomůže 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 ve vývojových prostředích Java. K dokončení ověřování v hostitelských prostředích Azure 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
    

Bean můžete sestavit SecretClient 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 služby 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 rady 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í.

Vytvoření SecretClient beanu sami není naštěstí u Spring Cloud Azure nutné. Místo toho můžete přímo vkládat SecretClient a používat vlastnosti konfigurace, které už znáte ke konfiguraci služby 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 části Globální konfigurace sad SDK služby Azure v příručce pro vývojáře 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 cloudům Azure. Další informace najdete v tématu Připojení do různých cloudů Azure.

Použití PropertySource služby Spring Key Vault

Předchozí části vám ukázaly, jak se po spuštění aplikace používá SecretClient ke CommandLineRunner čtení tajného kódu. 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 ve službě Key Vault a stále použít automatickou konfiguraci Spring k získání zdroje dat.

V tomto případě Spring Cloud Azure poskytuje integraci prostředí Spring pro načtení tajných kódů ze služby 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 představuje transparentní způsob přístupu k tajným kódům ze služby Key Vault a nevyžaduje se žádné změny kódu.

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

Pokud chcete načíst adresu URL databáze H2 ze služby 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í koncový bod služby Key Vault a vlastnosti 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
    

    Tip

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

    Tip

    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 ve službě Azure Key Vault. Pokud se chcete vyhnout heslu, je dobrou volbou připojení bez hesla. Další informace najdete v tématu Připojení bez hesla pro služby Azure.

  2. Vytvořte novou Todo třídu 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 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. 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 ze služby 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 nasadit aplikaci do Azure Spring Apps, přečtěte si téma Nasazení první aplikace do Azure Spring Apps.

Další kroky