Spring Boot uygulamasında Azure Key Vault'tan gizli dizi yükleme
Bu öğreticide, hassas yapılandırma verilerinin güvenliğini sağlamak ve Key Vault'tan yapılandırma özelliklerini almak için Spring Boot uygulamalarında Key Vault'un nasıl kullanılacağı gösterilmektedir. Key Vault, parolalar ve veritabanı bağlantı dizesi gibi genel gizli dizilerin güvenli bir şekilde depolanmasını sağlar.
Önkoşullar
- Azure aboneliği - ücretsiz bir abonelik oluşturun.
- Java Development Kit (JDK) sürüm 8 veya üzeri.
- Apache Maven
- Azure CLI
- Key Vault örneği. Anahtarınız yoksa bkz . Hızlı Başlangıç: Azure portalını kullanarak anahtar kasası oluşturma. Ayrıca, bu öğretici için test uygulamasına ihtiyacınız olduğu için Key Vault örneğinin URI'sini not edin.
- Spring Boot uygulaması. Yoksa Spring Initializr ile bir Maven projesi oluşturun. Maven Projesi'ni seçtiğinizden emin olun ve Bağımlılıklar'ın altında Spring Web, Spring Data JPA ve H2 Veritabanı bağımlılıklarını ekleyin ve ardından Java sürüm 8 veya üzerini seçin.
Önemli
Bu makaledeki adımları tamamlamak için Spring Boot sürüm 2.5 veya üzeri gereklidir.
Azure Key Vault'a gizli dizi ayarlama
Bu öğreticide, Spring Boot uygulamasında Key Vault'tan veritabanı kimlik bilgilerinin nasıl okunduğu açıklanmaktadır. Key Vault'tan kimlik bilgilerini okumak için önce veritabanı kimlik bilgilerini Key Vault'ta depolamanız gerekir.
H2 veritabanının URL'sini Key Vault'ta yeni bir gizli dizi olarak depolamak için bkz . Hızlı Başlangıç: Azure portalını kullanarak Azure Key Vault'tan gizli dizi ayarlama ve alma. Bu öğreticide, adı h2url
ve değeriyle jdbc:h2:~/testdb;user=sa;password=password
bir gizli dizi ayarlayacaksınız.
Not
Gizli diziyi ayarladıktan sonra, Key Vault erişim ilkesi atama başlığı altında yer alan yönergeleri izleyerek uygulamanıza Key Vault erişimi verin.
Azure Key Vault'tan gizli dizi okuma
Artık veritabanı kimlik bilgileri Key Vault'ta depolandığına göre Spring Cloud Azure ile bunları alabilirsiniz.
Spring Cloud Azure Key Vault Starter modülünü yüklemek için pom.xml dosyanıza aşağıdaki bağımlılıkları ekleyin:
Spring Cloud Azure Ürün Reçetesi (BOM):
<dependencyManagement> <dependencies> <dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-dependencies</artifactId> <version>5.18.0</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
Not
Spring Boot 2.x kullanıyorsanız, sürümünü olarak
4.19.0
ayarladığınızdanspring-cloud-azure-dependencies
emin olun. Bu Ürün Reçetesi (BOM), pom.xml dosyanızın bölümünde yapılandırılmalıdır<dependencyManagement>
. Bu, tüm Spring Cloud Azure bağımlılıklarının aynı sürümü kullanmasını sağlar. Bu ürün reçetesi için kullanılan sürüm hakkında daha fazla bilgi için bkz . Spring Cloud Azure'ın Hangi Sürümünü Kullanmalıyım.Spring Cloud Azure Key Vault Starter yapıtı:
<dependency> <groupId>com.azure.spring</groupId> <artifactId>spring-cloud-azure-starter-keyvault</artifactId> </dependency>
Spring Cloud Azure, Key Vault'tan gizli dizileri okumak için çeşitli yöntemlere sahiptir. Aşağıdaki yöntemleri bağımsız olarak kullanabilir veya farklı kullanım örnekleri için birleştirebilirsiniz:
- Key Vault için Azure SDK'sını kullanın.
- Spring KeyVault
PropertySource
kullanın.
Key Vault için Azure SDK'sını kullanma
Key Vault için Azure SDK, Key Vault'taki gizli dizileri SecretClient
yönetmeyi sağlar.
Aşağıdaki kod örneği, Azure Key Vault'tan H2 veritabanı kimlik bilgilerini almak için nasıl kullanacağınızı SecretClient
gösterir.
Key Vault'tan Azure SDK kullanarak gizli dizi okumak için aşağıdaki adımları izleyerek uygulamayı yapılandırın:
application.properties yapılandırma dosyasında bir Key Vault uç noktası yapılandırın.
spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
SecretClient
Spring uygulamanıza çekirdeği ekleyin ve aşağıdaki örnekte gösterildiği gibi bir gizli dizi almak için yöntemini kullanıngetSecret
: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()); } }
İpucu
Bu öğreticide yapılandırmalarda veya kodda kimlik doğrulama işlemi yoktur. Ancak Azure hizmetlerine bağlanmak için kimlik doğrulaması gerekir. Kimlik doğrulamasını tamamlamak için Azure Identity kullanmanız gerekir. Spring Cloud Azure, azure kimlik kitaplığının herhangi bir kod değişikliği yapmadan kimlik bilgilerini almanıza yardımcı olmak için sağladığı öğesini kullanır
DefaultAzureCredential
.DefaultAzureCredential
birden çok kimlik doğrulama yöntemini destekler ve çalışma zamanında hangi yöntemin kullanılacağını belirler. Bu yaklaşım, uygulamanızın ortama özgü kod uygulamadan farklı ortamlarda (yerel ve üretim ortamları gibi) farklı kimlik doğrulama yöntemleri kullanmasını sağlar. Daha fazla bilgi için bkz . DefaultAzureCredential.Yerel geliştirme ortamlarında kimlik doğrulamasını tamamlamak için Azure CLI, Visual Studio Code, PowerShell veya diğer yöntemleri kullanabilirsiniz. Daha fazla bilgi için bkz . Java geliştirme ortamlarında Azure kimlik doğrulaması. Azure barındırma ortamlarında kimlik doğrulamasını tamamlamak için kullanıcı tarafından atanan yönetilen kimliği kullanmanızı öneririz. Daha fazla bilgi için bkz. Azure kaynakları için yönetilen kimlikler nelerdir?
Uygulamayı başlatın. Aşağıdaki örneğe benzer günlükler görürsünüz:
h2url: jdbc:h2:~/testdb;user=sa;password=password
Çekirdeği kendiniz oluşturabilirsiniz SecretClient
, ancak işlem karmaşıktır. Spring Boot uygulamalarında özellikleri yönetmeniz, oluşturucu desenini öğrenmeniz ve istemciyi Spring uygulama bağlamınıza kaydetmeniz gerekir. Aşağıdaki kod örneği, bir SecretClient
fasulyeyi nasıl oluşturabileceğinizi gösterir:
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();
}
}
Aşağıdaki listede, bu kodun esnek veya düzgün olmasının nedenlerinden bazıları gösterilmektedir:
- Key Vault uç noktası sabit kodlanmış.
- Spring ortamından yapılandırmaları almak için kullanıyorsanız
@Value
, application.properties dosyanızda IDE ipuçlarına sahip olamazsınız. - Mikro hizmet senaryonuz varsa, kodun her projede çoğaltılması gerekir ve hata yapmak kolaydır ve tutarlı olması zordur.
Neyse ki Spring Cloud Azure ile çekirdeği kendiniz oluşturmak SecretClient
gerekli değildir. Bunun yerine, Key Vault'un yapılandırılması için zaten bildiğiniz yapılandırma özelliklerini doğrudan ekleyebilir SecretClient
ve kullanabilirsiniz. Daha fazla bilgi için bkz . Yapılandırma örnekleri.
Spring Cloud Azure, farklı senaryolar için aşağıdaki genel yapılandırmaları da sağlar. Daha fazla bilgi için Spring Cloud Azure geliştirici kılavuzunun Azure Hizmet SDK'ları için genel yapılandırma bölümüne bakın.
- Ara sunucu seçenekleri.
- Yeniden deneme seçenekleri.
- HTTP aktarım istemcisi seçenekleri.
Ayrıca farklı Azure bulutlarına da bağlanabilirsiniz. Daha fazla bilgi için bkz . Farklı Azure bulutlarına bağlanma.
Spring Key Vault PropertySource kullanma
Önceki bölümlerde, uygulama başlatıldıktan sonra gizli diziyi okumak için içinde CommandLineRunner
nasıl kullanacağınız SecretClient
gösterildi. Ancak Spring Boot uygulamalarında uygulama başlamadan önce gizli dizileri okumak gerekir. Örneğin, uygulama başlamadan önce veri kaynağı parola özelliği gereklidir. Önceki senaryo, veri kaynağı parolasını Key Vault'ta depolamak ve yine de spring otomatik yapılandırmasını kullanarak veri kaynağı almak istiyorsanız çalışmaz.
Bu durumda Spring Cloud Azure, uygulama bağlamını oluşturmadan önce Key Vault'tan gizli dizileri yüklemek için Spring ortamı tümleştirmesi sağlar. Spring uygulama bağlamı başlatma sırasında çekirdeği oluşturmak ve yapılandırmak için gizli diziyi kullanabilirsiniz. Bu yaklaşım, Key Vault'tan gizli dizilere erişmeniz için saydam bir yoldur ve kod değişikliği gerekmez.
Aşağıdaki kod örneği, Azure Key Vault'tan veri kaynağını oluşturmak üzere H2 veritabanı kimlik bilgilerini almak için nasıl kullanacağınızı PropertySource
gösterir.
Key Vault'tan bir H2 veritabanının URL'sini almak ve Spring Data JPA kullanarak H2 veritabanından veri depolamak için aşağıdaki adımları izleyerek uygulamayı yapılandırın:
Aşağıdaki Key Vault uç noktasını ve veri kaynağı özelliklerini application.properties yapılandırma dosyasına ekleyin.
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
İpucu
Spring Cloud Azure özellik yapılandırması örnekleri için Spring Cloud Azure geliştirici kılavuzunun Yapılandırma örnekleri bölümüne bakın.
İpucu
Bu örnek, H2 veritabanı kullanan basit bir veritabanı senaryosudur. Üretim ortamında MySQL için Azure Veritabanı veya PostgreSQL için Azure Veritabanı kullanmanızı ve Azure Key Vault'ta veritabanı URL'sini, kullanıcı adını ve parolayı depolamanızı öneririz. Paroladan kaçınmak istiyorsanız parolasız bağlantılar iyi bir seçimdir. Daha fazla bilgi için bkz . Azure hizmetleri için parolasız bağlantılar.
Yeni
Todo
bir Java sınıfı oluşturun. Bu sınıf, JPA tarafından otomatik olarak oluşturulacak tabloyatodo
eşlenen bir etki alanı modelidir. Aşağıdaki kod vesetters
yöntemlerini yoksayargetters
.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; }
Aşağıdaki içeriği göstermek için başlangıç sınıfı dosyasını düzenleyin.
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> { }
Uygulamayı başlatın. Uygulama, H2 veritabanının URL'sini Key Vault'tan alır, ardından H2 veritabanına bağlanır ve verileri veritabanına depolar. Aşağıdaki örneğe benzer günlükler görürsünüz:
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
Azure Spring Apps'e dağıtma
Spring Boot uygulamasını yerel olarak çalıştırdığınıza göre artık uygulamayı üretim ortamına taşımanın zamanı geldi. Azure Spring Apps , kod değişikliği yapmadan Spring Boot uygulamalarını Azure'a dağıtmayı kolaylaştırır. Hizmet, geliştiricilerin kodlarına odaklanabilmesi için Spring uygulamalarının altyapısını yönetir. Azure Spring Apps kapsamlı izleme ve tanılama, yapılandırma yönetimi, hizmet bulma, CI/CD tümleştirmesi, mavi-yeşil dağıtımlar ve daha fazlasını kullanarak yaşam döngüsü yönetimi sağlar. Uygulamanızı Azure Spring Apps'e dağıtmak için bkz . İlk uygulamanızı Azure Spring Apps'e dağıtma.