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=passwordbir 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.11.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.17.0ayarladığınızdan spring-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 PropertySourcekullanı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:

  1. 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/
    
  2. 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?

  3. 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ğlan.

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:

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

  2. Yeni Todo bir Java sınıfı oluşturun. Bu sınıf, JPA tarafından otomatik olarak oluşturulacak tabloya todo eşlenen bir etki alanı modelidir. Aşağıdaki kod ve setters 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;
    
    }
    
  3. 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> {
    
    }
    
  4. 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.

Sonraki adımlar