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
- Předplatné Azure – vytvořte si ho zdarma.
- Java Development Kit (JDK) verze 8 nebo vyšší.
- Apache Maven
- Azure CLI
- Instance služby Key Vault. Pokud ho nemáte, přečtěte si článek Rychlý start: Vytvoření trezoru klíčů pomocí webu Azure Portal. Poznamenejte si také identifikátor URI instance služby Key Vault, protože ho potřebujete pro testovací aplikaci pro účely tohoto kurzu.
- Aplikace Spring Boot. Pokud ho nemáte, vytvořte projekt Maven pomocí aplikace Spring Initializr. Nezapomeňte vybrat projekt Maven a v části Závislosti přidejte závislosti Spring Web, Spring Data JPA a H2 Database a pak vyberte Javu verze 8 nebo vyšší.
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.19.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 na4.19.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:
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/
SecretClient
Do aplikace Spring vložíte bean a použijete metodugetSecret
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?
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í k různým cloudům 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:
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.
Vytvořte novou
Todo
třídu Java. Tato třída je doménový model mapovaný natodo
tabulku, kterou automaticky vytvoří JPA. Následující kód ignorujegetters
metody asetters
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; }
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> { }
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.