Tutorial: Mengenkripsi dan mendekripsi blob menggunakan Azure Key Vault

Dalam tutorial ini, Anda mempelajari cara menggunakan enkripsi sisi klien untuk mengenkripsi dan mendekripsi blob menggunakan kunci yang disimpan dengan Azure Key Vault.

Azure Blob Storage mendukung enkripsi sisi layanan dan sisi klien. Untuk sebagian besar skenario, Microsoft merekomendasikan penggunaan fitur enkripsi sisi layanan untuk kemudahan penggunaan dalam melindungi data Anda. Untuk mempelajari selengkapnya tentang enkripsi sisi layanan, lihat Enkripsi Azure Storage untuk data tidak aktif.

Pustaka klien Azure Blob Storage untuk .NET mendukung enkripsi data sisi klien dalam aplikasi sebelum mengunggah ke Azure Storage, dan mendekripsi data saat mengunduh ke klien. Pustaka juga mendukung integrasi dengan Azure Key Vault untuk manajemen kunci.

Tutorial ini akan menunjukkan cara untuk:

  • Mengonfigurasi izin untuk sumber daya Azure Key Vault
  • Membuat aplikasi konsol untuk berinteraksi dengan sumber daya menggunakan pustaka klien .NET
  • Menambahkan kunci ke brankas kunci
  • Mengonfigurasi opsi enkripsi sisi klien menggunakan kunci yang disimpan dalam brankas kunci
  • Membuat objek klien layanan blob dengan enkripsi sisi klien diaktifkan
  • Unggah blob terenkripsi, lalu unduh dan dekripsi blob

Prasyarat

Menetapkan peran ke pengguna Microsoft Entra Anda

Saat mengembangkan secara lokal, pastikan bahwa akun pengguna yang mengakses brankas kunci memiliki izin yang benar. Anda akan memerlukan peran Petugas Kripto Key Vault untuk membuat kunci dan melakukan tindakan pada kunci di brankas kunci. Anda dapat menetapkan peran Azure RBAC kepada pengguna menggunakan portal Azure, Azure CLI, atau Azure PowerShell. Anda dapat mempelajari selengkapnya tentang cakupan yang tersedia untuk penetapan peran di halaman gambaran umum cakupan.

Dalam skenario ini, Anda akan menetapkan izin ke akun pengguna Anda, yang dilingkupkan ke brankas kunci, untuk mengikuti Prinsip Hak Istimewa Terkecil. Praktik ini hanya memberi pengguna izin minimum yang diperlukan dan menciptakan lingkungan produksi yang lebih aman.

Contoh berikut menunjukkan cara menetapkan peran Petugas Kripto Key Vault ke akun pengguna Anda, yang menyediakan akses yang Anda perlukan untuk menyelesaikan tutorial ini.

Penting

Dalam kebanyakan kasus, dibutuhkan satu atau dua menit agar penetapan peran disebarluaskan di Azure, tetapi dalam kasus yang jarang terjadi mungkin perlu waktu hingga delapan menit. Jika Anda menerima kesalahan autentikasi saat pertama kali menjalankan kode, tunggu beberapa saat dan coba lagi.

  1. Di portal Azure, temukan brankas kunci Anda menggunakan bilah pencarian utama atau navigasi kiri.

  2. Pada halaman gambaran umum brankas kunci, pilih Kontrol akses (IAM) dari menu sebelah kiri.

  3. Di halaman Kontrol akses (IAM), pilih tab Penetapan peran.

  4. Pilih + Tambahkan dari menu atas lalu Tambahkan penetapan peran dari menu drop-down yang dihasilkan.

    A screenshot showing how to assign a role in Azure portal.

  5. Gunakan kotak pencarian untuk memfilter hasil ke peran yang diinginkan. Untuk contoh ini, cari Petugas Kripto Key Vault dan pilih hasil yang cocok lalu pilih Berikutnya.

  6. Di bagian Tetapkan akses ke, pilih Pengguna, grup, atau perwakilan layanan, lalu pilih + Pilih anggota.

  7. Dalam dialog, cari nama pengguna Microsoft Entra Anda (biasanya alamat email user@domain Anda) lalu pilih Pilih di bagian bawah dialog.

  8. Pilih Tinjau + tetapkan untuk masuk ke halaman akhir, lalu Tinjau + tetapkan lagi untuk menyelesaikan proses.

Menyiapkan proyek Anda

  1. Di jendela konsol (seperti PowerShell atau Bash), gunakan dotnet new perintah untuk membuat aplikasi konsol baru dengan nama BlobEncryptionKeyVault. Perintah ini membuat proyek C# "Halo Dunia" sederhana dengan file sumber tunggal: Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Beralih ke direktori BlobEncryptionKeyVault yang baru dibuat.

    cd BlobEncryptionKeyVault
    
  3. Buka proyek di editor kode yang Anda inginkan. Untuk membuka proyek di:

    • Visual Studio, temukan dan klik dua kali file BlobEncryptionKeyVault.csproj.
    • Visual Studio Code, jalankan perintah berikut:
    code .
    

Untuk berinteraksi dengan layanan Azure dalam contoh ini, instal pustaka klien berikut menggunakan dotnet add package.

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Keys
dotnet add package Azure.Storage.Blobs

Tambahkan arahan berikut using dan pastikan untuk menambahkan referensi System.Configuration ke proyek.

using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Keys;
using Azure.Security.KeyVault.Keys.Cryptography;
using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

Mengatur variabel lingkungan

Aplikasi ini mencari variabel lingkungan yang disebut KEY_VAULT_NAME untuk mengambil nama brankas kunci Anda. Untuk mengatur variabel lingkungan, buka jendela konsol dan ikuti instruksi untuk sistem operasi Anda. Ganti <your-key-vault-name> dengan nama brankas kunci Anda.

Windows:

Anda dapat mengatur variabel lingkungan untuk Windows dari baris perintah. Namun, saat menggunakan pendekatan ini, nilai dapat diakses oleh semua aplikasi yang berjalan pada sistem operasi tersebut dan dapat menyebabkan konflik jika Anda tidak berhati-hati. Variabel lingkungan dapat diatur pada tingkat pengguna atau sistem:

setx KEY_VAULT_NAME "<your-key-vault-name>"

Setelah menambahkan variabel lingkungan di Windows, Anda harus memulai instans baru dari jendela perintah. Jika Anda menggunakan Visual Studio di Windows, Anda mungkin perlu membuka kembali Visual Studio setelah membuat variabel lingkungan agar perubahan terdeteksi.

Linux:

export KEY_VAULT_NAME=<your-key-vault-name>

Menambahkan kunci di Azure Key Vault

Dalam contoh ini, kami membuat kunci dan menambahkannya ke brankas kunci menggunakan pustaka klien Azure Key Vault. Anda juga dapat membuat dan menambahkan kunci ke brankas kunci menggunakan Azure CLI, portal Azure, atau PowerShell.

Dalam sampel di bawah ini, kami membuat objek KeyClient untuk vault yang ditentukan. Objek KeyClient kemudian digunakan untuk membuat kunci RSA baru di vault yang ditentukan.

var keyName = "testRSAKey";
var keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");

// URI for the key vault resource
var keyVaultUri = $"https://{keyVaultName}.vault.azure.net";

TokenCredential tokenCredential = new DefaultAzureCredential();

// Create a KeyClient object
var keyClient = new KeyClient(new Uri(keyVaultUri), tokenCredential);

// Add a key to the key vault
var key = await keyClient.CreateKeyAsync(keyName, KeyType.Rsa);

Membuat instans pemecah masalah kunci dan kunci

Selanjutnya, kita akan menggunakan kunci yang baru saja kita tambahkan ke vault untuk membuat klien kriptografi dan instans pemecah masalah kunci. CryptographyClient mengimplementasikan IKeyEncryptionKey dan digunakan untuk melakukan operasi kriptografi dengan kunci yang disimpan di Azure Key Vault. KeyResolver mengimplementasikan IKeyEncryptionResolver dan mengambil kunci enkripsi kunci dari pengidentifikasi kunci dan menyelesaikan kunci.

// Cryptography client and key resolver instances using Azure Key Vault client library
CryptographyClient cryptoClient = keyClient.GetCryptographyClient(key.Value.Name, key.Value.Properties.Version);
KeyResolver keyResolver = new (tokenCredential);

Jika Anda memiliki kunci yang sudah ada di vault yang ingin Anda enkripsi, Anda dapat membuat instans kunci dan pemecah masalah kunci dengan meneruskan URI:

var keyVaultKeyUri = $"https://{keyVaultName}.vault.azure.net/keys/{keyName}";
CryptographyClient cryptoClient = new CryptographyClient(new Uri(keyVaultKeyUri), tokenCredential);

Mengonfigurasi opsi enkripsi

Sekarang kita perlu mengonfigurasi opsi enkripsi yang akan digunakan untuk pengunggahan dan pengunduhan blob. Untuk menggunakan enkripsi sisi klien, pertama-tama kita membuat ClientSideEncryptionOptions objek dan mengaturnya pada pembuatan klien dengan SpecializedBlobClientOptions.

Kelas ClientSideEncryptionOptions menyediakan opsi konfigurasi klien untuk menyambungkan ke Blob Storage menggunakan enkripsi sisi klien. KeyEncryptionKey diperlukan untuk operasi pengunggahan dan digunakan untuk membungkus kunci enkripsi konten yang dihasilkan. KeyResolver diperlukan untuk operasi pengunduhan dan mengambil kunci enkripsi kunci yang benar untuk membongkar kunci enkripsi konten yang diunduh. KeyWrapAlgorithm diperlukan untuk pengunggahan dan menentukan pengidentifikasi algoritma yang akan digunakan saat membungkus kunci enkripsi konten.

Penting

Karena kerentanan keamanan di versi 1, disarankan untuk membuat ClientSideEncryptionOptions objek menggunakan ClientSideEncryptionVersion.V2_0 untuk parameter versi. Untuk mempelajari selengkapnya tentang mengurangi kerentanan di aplikasi Anda, lihat Mengurangi kerentanan keamanan di aplikasi Anda. Untuk informasi selengkapnya tentang kerentanan keamanan ini, lihat Azure Storage memperbarui enkripsi sisi klien di SDK untuk mengatasi kerentanan keamanan.

// Configure the encryption options to be used for upload and download
ClientSideEncryptionOptions encryptionOptions = new (ClientSideEncryptionVersion.V2_0)
{
    KeyEncryptionKey = cryptoClient,
    KeyResolver = keyResolver,
    // String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
    KeyWrapAlgorithm = "RSA-OAEP"
};

// Set the encryption options on the client options.
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };

Mengonfigurasi objek klien untuk menggunakan enkripsi sisi klien

Dalam contoh ini, kami menerapkan opsi konfigurasi enkripsi sisi klien ke BlobServiceClient objek. Ketika diterapkan di tingkat klien layanan, opsi enkripsi ini diteruskan dari klien layanan ke klien kontainer, dan dari klien kontainer ke klien blob. BlobClient Saat objek melakukan operasi pengunggahan atau pengunduhan, pustaka klien Azure Blob Storage menggunakan enkripsi amplop untuk mengenkripsi dan mendekripsi blob di sisi klien. Enkripsi amplop mengenkripsi kunci dengan satu atau beberapa kunci tambahan.

// Create a blob client with client-side encryption enabled.
// Attempting to construct a BlockBlobClient, PageBlobClient, or AppendBlobClient from a BlobContainerClient
// with client-side encryption options present will throw, as this functionality is only supported with BlobClient.
Uri blobUri = new (string.Format($"https://{accountName}.blob.core.windows.net"));
BlobClient blob = new BlobServiceClient(blobUri, tokenCredential, options).GetBlobContainerClient("test-container").GetBlobClient("testBlob");

Mengenkripsi blob dan mengunggah

BlobClient Saat objek memanggil metode pengunggahan, beberapa langkah terjadi untuk melakukan enkripsi sisi klien:

  1. Pustaka klien Azure Storage menghasilkan vektor inisialisasi acak (IV) 16 byte dan kunci enkripsi konten acak (CEK) 32 byte, dan melakukan enkripsi amplop data blob menggunakan informasi ini.
  2. Data blob dienkripsi menggunakan CEK.
  3. CEK kemudian dibungkus (dienkripsi) menggunakan kunci enkripsi kunci (KEK) yang kami tentukan dalam ClientSideEncryptionOptions. Dalam contoh ini, KEK adalah pasangan kunci asimetris yang disimpan dalam sumber daya Azure Key Vault yang ditentukan. Klien blob itu sendiri tidak pernah memiliki akses ke KEK, hanya memanggil algoritma pembungkusan kunci yang disediakan oleh Key Vault.
  4. Data blob terenkripsi kemudian diunggah ke akun penyimpanan.

Tambahkan kode berikut untuk mengenkripsi blob dan mengunggahnya ke akun penyimpanan Azure Anda:

// Upload the encrypted contents to the blob
Stream blobContent = BinaryData.FromString("Ready for encryption, Captain.").ToStream();
await blob.UploadAsync(blobContent);

Setelah blob diunggah, Anda dapat melihat blob di akun penyimpanan Anda untuk melihat konten terenkripsi bersama dengan metadata enkripsi.

Mendekripsi blob dan mengunduh

Pustaka klien Azure Storage mengasumsikan bahwa pengguna mengelola KEK baik secara lokal atau di brankas kunci. Pengguna tidak perlu mengetahui kunci spesifik yang digunakan untuk enkripsi. Pemecah masalah kunci yang ditentukan ClientSideEncryptionOptions akan digunakan untuk mengatasi pengidentifikasi kunci saat data blob diunduh dan didekripsi.

BlobClient Ketika objek memanggil metode unduhan, beberapa langkah terjadi untuk mendekripsi data blob terenkripsi:

  1. Pustaka klien mengunduh data blob terenkripsi, termasuk metadata enkripsi, dari akun penyimpanan.
  2. CEK yang dibungkus kemudian dibongkar (didekripsi) menggunakan KEK. Pustaka klien tidak memiliki akses ke KEK selama proses ini, tetapi hanya memanggil algoritma pembongkaran kunci yang ditentukan dalam ClientSideEncryptionOptions. Kunci privat pasangan kunci RSA tetap berada di brankas kunci, sehingga kunci terenkripsi dari metadata blob yang berisi CEK dikirim ke brankas kunci untuk dekripsi.
  3. Pustaka klien menggunakan CEK untuk mendekripsi data blob terenkripsi.

Tambahkan kode berikut untuk mengunduh dan mendekripsi blob yang sebelumnya Anda unggah.

// Download and decrypt the encrypted contents from the blob
Response<BlobDownloadInfo>  response = await blob.DownloadAsync();
BlobDownloadInfo downloadInfo = response.Value;
Console.WriteLine((await BinaryData.FromStreamAsync(downloadInfo.Content)).ToString());

Langkah berikutnya

Dalam tutorial ini, Anda mempelajari cara menggunakan pustaka klien .NET untuk melakukan enkripsi sisi klien untuk operasi pengunggahan dan pengunduhan blob.

Untuk gambaran umum yang luas tentang enkripsi sisi klien untuk blob, termasuk instruksi untuk memigrasikan data terenkripsi ke versi 2, lihat Enkripsi sisi klien untuk blob.

Untuk informasi selengkapnya tentang Azure Key Vault, lihat halaman gambaran umum Azure Key Vault