Memuat rahasia dari Azure Key Vault dalam aplikasi Spring Boot

Tutorial ini menunjukkan kepada Anda cara menggunakan Key Vault di aplikasi Spring Boot untuk mengamankan data konfigurasi sensitif dan mengambil properti konfigurasi dari Key Vault. Key Vault menyediakan penyimpanan rahasia dengan aman, seperti string koneksi database dan kata sandi.

Prasyarat

Penting

Spring Boot versi 2.5 atau yang lebih tinggi diperlukan untuk menyelesaikan langkah-langkah dalam artikel ini.

Mengatur rahasia ke Azure Key Vault

Tutorial ini menjelaskan cara membaca kredensial database dari Key Vault dalam aplikasi Spring Boot. Untuk membaca kredensial dari Key Vault, Anda harus terlebih dahulu menyimpan kredensial database di Key Vault.

Untuk menyimpan URL database H2 sebagai rahasia baru di Key Vault, lihat Mulai Cepat: Mengatur dan mengambil rahasia dari Azure Key Vault menggunakan portal Azure. Dalam tutorial ini, Anda akan mengatur rahasia dengan nama h2url dan nilai jdbc:h2:~/testdb;user=sa;password=password.

Catatan

Setelah mengatur rahasia, berikan akses aplikasi Anda ke Key Vault dengan mengikuti instruksi di Menetapkan kebijakan akses Key Vault.

Membaca rahasia dari Azure Key Vault

Sekarang setelah kredensial database disimpan di Key Vault, Anda dapat mengambilnya dengan Spring Cloud Azure.

Untuk menginstal modul Spring Cloud Azure Key Vault Starter, tambahkan dependensi berikut ke file pom.xml Anda:

  • Spring Cloud Azure Bill of Materials (BOM):

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.azure.spring</groupId>
          <artifactId>spring-cloud-azure-dependencies</artifactId>
          <version>5.12.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    

    Catatan

    Jika Anda menggunakan Spring Boot 2.x, pastikan untuk mengatur versi ke spring-cloud-azure-dependencies4.18.0. Bill of Material (BOM) ini harus dikonfigurasi di bagian <dependencyManagement> file pom.xml Anda. Ini memastikan bahwa semua dependensi Spring Cloud Azure menggunakan versi yang sama. Untuk informasi selengkapnya tentang versi yang digunakan untuk BOM ini, lihat Versi Spring Cloud Azure mana yang Harus Saya Gunakan.

  • Artefak Spring Cloud Azure Key Vault Starter:

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

Spring Cloud Azure memiliki beberapa metode untuk membaca rahasia dari Key Vault. Anda dapat menggunakan metode berikut secara independen atau menggabungkannya untuk kasus penggunaan yang berbeda:

  • Gunakan Azure SDK untuk Key Vault.
  • Gunakan Spring KeyVault PropertySource.

Menggunakan Azure SDK untuk Key Vault

Azure SDK untuk Key Vault menyediakan SecretClient untuk mengelola rahasia di Key Vault.

Contoh kode berikut akan menunjukkan kepada Anda cara menggunakan SecretClient untuk mengambil kredensial database H2 dari Azure Key Vault.

Untuk membaca rahasia menggunakan Azure SDK dari Key Vault, konfigurasikan aplikasi dengan mengikuti langkah-langkah berikut:

  1. Konfigurasikan titik akhir Key Vault dalam file konfigurasi application.properties .

    spring.cloud.azure.keyvault.secret.endpoint=https://<your-keyvault-name>.vault.azure.net/
    
  2. SecretClient Masukkan kacang di aplikasi Spring Anda dan gunakan getSecret metode untuk mengambil rahasia, seperti yang ditunjukkan dalam contoh berikut:

    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

    Dalam tutorial ini, tidak ada operasi autentikasi dalam konfigurasi atau kode. Namun, menyambungkan ke layanan Azure memerlukan autentikasi. Untuk menyelesaikan autentikasi, Anda perlu menggunakan Azure Identity. Spring Cloud Azure menggunakan DefaultAzureCredential, yang disediakan pustaka Azure Identity untuk membantu Anda mendapatkan kredensial tanpa perubahan kode apa pun.

    DefaultAzureCredential mendukung beberapa metode autentikasi dan menentukan metode mana yang akan digunakan saat runtime. Pendekatan ini memungkinkan aplikasi Anda menggunakan metode autentikasi yang berbeda di lingkungan yang berbeda (seperti lingkungan lokal dan produksi) tanpa menerapkan kode khusus lingkungan. Untuk informasi selengkapnya, lihat DefaultAzureCredential.

    Untuk menyelesaikan autentikasi di lingkungan pengembangan lokal, Anda dapat menggunakan Azure CLI, Visual Studio Code, PowerShell, atau metode lainnya. Untuk informasi selengkapnya, lihat Autentikasi Azure di lingkungan pengembangan Java. Untuk menyelesaikan autentikasi di lingkungan hosting Azure, sebaiknya gunakan identitas terkelola yang ditetapkan pengguna. Untuk informasi selengkapnya, lihat Apa yang dimaksud dengan identitas terkelola untuk sumber daya Azure?

  3. Mulai aplikasi. Anda akan melihat log yang mirip dengan contoh berikut:

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

Anda dapat membangun SecretClient biji sendiri, tetapi prosesnya rumit. Di aplikasi Spring Boot, Anda harus mengelola properti, mempelajari pola penyusun, dan mendaftarkan klien ke konteks aplikasi Spring Anda. Contoh kode berikut menunjukkan cara Anda membuat SecretClient kacang:

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

}

Daftar berikut menunjukkan beberapa alasan mengapa kode ini tidak fleksibel atau anggun:

  • Titik akhir Key Vault dikodekan secara permanen.
  • Jika Anda menggunakan @Value untuk mendapatkan konfigurasi dari lingkungan Spring, Anda tidak dapat memiliki petunjuk IDE dalam file application.properties Anda.
  • Jika Anda memiliki skenario layanan mikro, kode harus diduplikasi di setiap proyek, dan mudah untuk membuat kesalahan dan sulit untuk konsisten.

Untungnya, membangun SecretClient kacang sendiri tidak diperlukan dengan Spring Cloud Azure. Sebagai gantinya, Anda dapat langsung menyuntikkan SecretClient dan menggunakan properti konfigurasi yang sudah Anda kenal untuk mengonfigurasi Key Vault. Untuk informasi selengkapnya, lihat Contoh konfigurasi.

Spring Cloud Azure juga menyediakan konfigurasi global berikut untuk skenario yang berbeda. Untuk informasi selengkapnya, lihat bagian Konfigurasi global untuk Azure Service SDK dari panduan pengembang Spring Cloud Azure.

  • Opsi proksi.
  • Opsi coba lagi.
  • Opsi klien transportasi HTTP.

Anda juga dapat terhubung ke cloud Azure yang berbeda. Untuk informasi selengkapnya, lihat Koneksi ke cloud Azure yang berbeda.

Menggunakan Spring Key Vault PropertySource

Bagian sebelumnya menunjukkan kepada Anda cara menggunakan SecretClient untuk CommandLineRunner membaca rahasia setelah aplikasi dimulai. Namun, dalam aplikasi Spring Boot, membaca rahasia diperlukan sebelum aplikasi dimulai. Misalnya, properti kata sandi sumber data diperlukan sebelum aplikasi dimulai. Skenario sebelumnya tidak akan berfungsi jika Anda ingin menyimpan kata sandi sumber data di Key Vault dan masih menggunakan konfigurasi otomatis Spring untuk mendapatkan sumber data.

Dalam hal ini, Spring Cloud Azure menyediakan integrasi lingkungan Spring untuk memuat rahasia dari Key Vault sebelum membangun konteks aplikasi. Anda dapat menggunakan rahasia untuk membangun dan mengonfigurasi biji selama inisialisasi konteks aplikasi Spring. Pendekatan ini adalah cara transparan bagi Anda untuk mengakses rahasia dari Key Vault, dan tidak ada perubahan kode yang diperlukan.

Contoh kode berikut menunjukkan cara menggunakan PropertySource untuk mengambil kredensial database H2 untuk membangun sumber data dari Azure Key Vault.

Untuk mengambil URL database H2 dari Key Vault dan menyimpan data dari database H2 menggunakan Spring Data JPA, konfigurasikan aplikasi dengan mengikuti langkah-langkah berikut:

  1. Tambahkan properti titik akhir dan sumber data Key Vault berikut ke file konfigurasi application.properties .

    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

    Untuk contoh konfigurasi properti Spring Cloud Azure, lihat bagian Contoh konfigurasi dari panduan pengembang Spring Cloud Azure.

    Tip

    Contoh ini adalah skenario database sederhana menggunakan database H2. Sebaiknya gunakan Azure Database for MySQL atau Azure Database for PostgreSQL di lingkungan produksi dan menyimpan URL database, nama pengguna, dan kata sandi di Azure Key Vault. Jika Anda ingin menghindari kata sandi, koneksi tanpa kata sandi adalah pilihan yang baik. Untuk informasi selengkapnya, lihat Koneksi tanpa kata sandi untuk layanan Azure.

  2. Buat kelas Java baru Todo . Kelas ini adalah model domain yang dipetakan ke todo tabel yang akan dibuat secara otomatis oleh JPA. Kode berikut mengabaikan getters metode dan setters .

    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. Edit file kelas startup untuk menampilkan konten berikut.

    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. Mulai aplikasi. Aplikasi akan mengambil URL database H2 dari Key Vault, lalu menyambungkan ke database H2, dan menyimpan data ke database. Anda akan melihat log yang mirip dengan contoh berikut:

    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
    

Sebarkan ke Azure Spring Apps

Sekarang setelah Anda memiliki aplikasi Spring Boot yang berjalan secara lokal, saatnya untuk memindahkannya ke produksi. Azure Spring Apps memudahkan penyebaran aplikasi Spring Boot ke Azure tanpa perubahan kode apa pun. Layanan ini mengelola infrastruktur aplikasi Spring sehingga pengembang dapat fokus pada kode mereka. Azure Spring Apps menyediakan manajemen siklus hidup menggunakan pemantauan dan diagnostik yang komprehensif, manajemen konfigurasi, penemuan layanan, integrasi CI/CD, penyebaran biru-hijau, dan banyak lagi. Untuk menyebarkan aplikasi Anda ke Azure Spring Apps, lihat Menyebarkan aplikasi pertama Anda ke Azure Spring Apps.

Langkah berikutnya