Enkripsi sisi klien untuk blob

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

Penting

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.

Untuk tutorial langkah demi langkah yang memandu Anda melalui proses enkripsi blob menggunakan enkripsi pihak klien dan Azure Key Vault, lihat Mengenkripsi dan mendekripsi blob di Microsoft Azure Storage menggunakan Azure Key Vault.

Tentang enkripsi sisi klien

Pustaka klien Azure Blob Storage menggunakan AES untuk mengenkripsi data pengguna. Ada dua versi enkripsi sisi klien yang tersedia di pustaka klien:

Peringatan

Menggunakan versi 1 enkripsi sisi klien tidak lagi disarankan karena kerentanan keamanan dalam penerapan mode CBC pustaka klien. Untuk informasi selengkapnya tentang kerentanan keamanan ini, lihat Azure Storage memperbarui enkripsi sisi klien di SDK untuk mengatasi kerentanan keamanan. Jika saat ini menggunakan versi 1, sebaiknya perbarui aplikasi Anda untuk menggunakan versi 2 dan migrasikan data Anda. Lihat bagian berikut, Mengurangi kerentanan keamanan di aplikasi Anda, untuk panduan selengkapnya.

Mengurangi kerentanan keamanan di aplikasi Anda

Karena kerentanan keamanan yang ditemukan di pustaka klien penyimpanan blob penerapan mode CBC, Microsoft menyarankan Anda mengambil satu atau beberapa tindakan berikut segera:

  • Pertimbangkan untuk menggunakan fitur enkripsi sisi layanan, bukan enkripsi sisi klien. Untuk informasi selengkapnya tentang fitur enkripsi sisi layanan, lihat Enkripsi Azure Storage untuk data tidak aktif.

  • Jika Anda perlu menggunakan enkripsi sisi klien, migrasikan aplikasi Anda dari enkripsi sisi klien v1 ke enkripsi sisi klien v2.

Tabel berikut merangkum langkah-langkah yang perlu diambil jika memilih untuk memigrasikan aplikasi Anda ke enkripsi sisi klien v2:

Status enkripsi sisi klien Tindakan yang disarankan
Aplikasi menggunakan enkripsi sisi klien versi pustaka klien yang hanya mendukung enkripsi sisi klien v1. Perbarui aplikasi Anda untuk menggunakan versi pustaka klien yang mendukung enkripsi sisi klien v2. Lihat Matriks dukungan SDK untuk enkripsi sisi klien untuk daftar versi yang didukung. Pelajari lebih lanjut...

Perbarui kode Anda untuk menggunakan enkripsi sisi klien v2. Pelajari lebih lanjut...

Unduh data terenkripsi apa pun untuk mendekripsinya, lalu enkripsi ulang dengan enkripsi sisi klien v2. Pelajari lebih lanjut...
Aplikasi menggunakan enkripsi sisi klien dengan versi pustaka klien yang mendukung enkripsi sisi klien v2. Perbarui kode Anda untuk menggunakan enkripsi sisi klien v2. Pelajari lebih lanjut...

Unduh data terenkripsi apa pun untuk mendekripsinya, lalu enkripsi ulang dengan enkripsi sisi klien v2. Pelajari lebih lanjut...

Selain itu, Microsoft menyarankan Anda mengambil langkah-langkah berikut untuk membantu mengamankan data:

  • Konfigurasikan akun penyimpanan Anda untuk menggunakan titik akhir privat guna mengamankan semua lalu lintas antara jaringan virtual (VNet) dan akun penyimpanan Anda melalui tautan pribadi. Untuk informasi selengkapnya, lihat Menggunakan titik akhir privat untuk Azure Storage.
  • Batasi akses jaringan ke jaringan tertentu saja.

Matriks dukungan SDK untuk enkripsi sisi klien

Tabel berikut menunjukkan versi pustaka klien untuk .NET, Java, dan Python mana yang mendukung versi enkripsi sisi klien:

.NET Java Python
Enkripsi sisi klien v2 dan v1 Versi 12.13.0 dan yang lebih baru Versi 12.18.0 dan yang lebih baru Versi 12.13.0 dan yang lebih baru
Khusus enkripsi sisi klien v1 Versi 12.12.0 dan sebelumnya Versi 12.17.0 dan sebelumnya Versi 12.12.0 dan sebelumnya

Jika aplikasi Anda menggunakan enkripsi sisi klien dengan versi pustaka klien .NET, Java, atau Python yang lebih lama, Anda harus meningkatkan kode terlebih dahulu ke versi yang mendukung enkripsi sisi klien v2. Selanjutnya, Anda harus mendekripsi dan mengenkripsi ulang data dengan enkripsi sisi klien v2. Jika perlu, Anda dapat menggunakan versi pustaka klien yang mendukung enkripsi sisi klien v2 berdampingan dengan versi pustaka klien sebelumnya saat memigrasikan kode Anda. Untuk contoh kode, lihat Contoh: Mengenkripsi dan mendekripsi blob dengan enkripsi sisi klien v2.

Cara kerja enkripsi sisi klien

Pustaka klien Azure Blob Storage menggunakan enkripsi amplop untuk mengenkripsi dan mendekripsi data Anda di sisi klien. Enkripsi amplop mengenkripsi kunci dengan satu atau beberapa kunci tambahan.

Pustaka klien Blob Storage mengandalkan Azure Key Vault untuk melindungi kunci yang digunakan untuk enkripsi sisi klien. Untuk informasi selengkapnya tentang Azure Key Vault, lihat Apa itu Azure Key Vault?.

Enkripsi dan dekripsi melalui teknik amplop

Teknik enkripsi melalui amplop bekerja sebagai berikut:

  1. Pustaka klien Azure Storage menghasilkan kunci enkripsi konten (CEK), yang merupakan kunci simetris sekali pakai.

  2. Data pengguna dienkripsi menggunakan CEK.

  3. CEK kemudian dibungkus (dienkripsi) menggunakan kunci enkripsi kunci (KEK). KEK diidentifikasi oleh pengidentifikasi kunci dan dapat berupa pasangan kunci asimetris atau kunci simetris. Anda dapat mengelola KEK secara lokal atau menyimpannya di Azure Key Vault.

    Pustaka klien Azure Storage sendiri tidak pernah memiliki akses ke KEK. Ini hanya memanggil algoritma pembungkus kunci yang disediakan oleh Key Vault. Pelanggan dapat memilih untuk menggunakan penyedia layanan kustom untuk pembungkusan/pembongkaran jika ingin.

  4. Data terenkripsi kemudian diunggah ke Azure Blob Storage. Kunci yang dibungkus bersama dengan beberapa metadata enkripsi tambahan disimpan sebagai metadata pada blob.

Teknik dekripsi melalui amplop bekerja sebagai berikut:

  1. Pustaka klien Azure Storage mengasumsikan bahwa pengguna mengelola KEK baik secara lokal atau di Azure Key Vault. Pengguna tidak perlu mengetahui kunci spesifik yang digunakan untuk enkripsi. Sebagai gantinya, pemecah kunci yang menyelesaikan pengidentifikasi kunci yang berbeda ke kunci dapat diatur dan digunakan.
  2. Pustaka klien mengunduh data terenkripsi bersama dengan materi enkripsi apa pun yang disimpan di Azure Storage.
  3. CEK yang dibungkus) kemudian dibuka (didekripsi) menggunakan KEK. Pustaka klien tidak memiliki akses ke KEK selama proses ini, tetapi hanya memanggil algoritma pembukaan Azure Key Vault atau penyimpanan kunci lainnya.
  4. Pustaka klien menggunakan CEK untuk mendekripsi data pengguna terenkripsi.

Enkripsi/dekripsi pada unggahan/unduhan blob

Pustaka klien Blob Storage mendukung enkripsi seluruh blob hanya saat diunggah. Untuk unduhan, baik unduhan lengkap dan rentang didukung.

Selama enkripsi, pustaka klien menghasilkan vektor inisialisasi acak (IV) 16 byte dan CEK acak 32 byte, serta melakukan enkripsi amplop data blob menggunakan informasi ini. CEK yang dibungkus dan beberapa metadata enkripsi tambahan kemudian disimpan sebagai metadata blob bersama dengan blob terenkripsi.

Saat klien mengunduh seluruh blob, CEK yang dibungkus dibuka dan digunakan bersama dengan IV untuk mengembalikan data yang didekripsi ke klien.

Mengunduh rentang acak dalam blob terenkripsi melibatkan penyesuaian rentang yang disediakan oleh pengguna untuk mendapatkan sejumlah kecil data tambahan yang dapat digunakan untuk mendekripsi rentang yang diminta.

Semua jenis blob (blob blok, blob halaman, dan blob append) dapat dienkripsi/didekripsi menggunakan skema ini.

Peringatan

Jika Anda mengedit atau mengunggah metadata Anda sendiri untuk blob, Anda harus memastikan bahwa metadata enkripsi dipertahankan. Jika Anda mengunggah metadata baru tanpa juga mempertahankan metadata enkripsi, CEK, IV, dan metadata lainnya yang dibungkus akan hilang dan Anda tidak akan dapat mengambil konten blob. Memanggil operasi Set Blob Metadata selalu menggantikan semua blob metadata.

Saat membaca dari atau menulis ke blob terenkripsi, gunakan perintah unggah blob utuh, seperti Put Blob, dan perintah range atau unduh blob utuh, seperti Get Blob. Hindari menulis ke blob terenkripsi menggunakan operasi protokol seperti Put Block, Put Block List, Put Page, atau Append Block. Memanggil operasi ini pada blob terenkripsi dapat merusaknya dan membuatnya tidak dapat dibaca.

Contoh: Mengenkripsi dan mendekripsi blob dengan enkripsi sisi klien v2

Contoh kode di bagian ini menunjukkan cara menggunakan enkripsi sisi klien v2 untuk mengenkripsi dan mendekripsi blob.

Penting

Jika Anda memiliki data yang sebelumnya telah dienkripsi dengan enkripsi sisi klien v1, maka Anda harus mendekripsi data tersebut dan mengenkripsi ulang dengan enkripsi sisi klien v2. Lihat panduan dan sampel untuk pustaka klien Anda di bawah ini.

Untuk menggunakan enkripsi sisi klien dari kode .NET Anda, referensikan ke pustaka klien Blob Storage. Pastikan Anda menggunakan versi 12.13.0 atau yang lebih baru. Jika Anda perlu bermigrasi dari versi 11.x ke versi 12.13.0, lihat Panduan migrasi.

Dua paket tambahan diperlukan untuk integrasi Azure Key Vault enkripsi sisi klien:

  • Paket Azure.Core menyediakan antarmuka IKeyEncryptionKey dan IKeyEncryptionKeyResolver. Pustaka klien Blob Storage untuk .NET sudah mendefinisikan rakitan ini sebagai dependensi.

  • Paket Azure.Security.KeyVault.Keys (versi 4.x dan yang lebih baru) menyediakan klien REST Key Vault dan klien kriptografi yang digunakan dengan enkripsi sisi klien. Anda harus memastikan bahwa paket ini direferensikan dalam proyek jika menggunakan Azure Key Vault sebagai penyimpanan kunci Anda.

    Azure Key Vault dirancang untuk kunci master bernilai tinggi, dan batas pembatasan per brankas kunci mencerminkan desain ini. Pada versi 4.1.0 Azure.Security.KeyVault.Keys, antarmuka IKeyEncryptionKeyResolver tidak mendukung penembolokan kunci. Jika penembolokan diperlukan karena pembatasan, Anda dapat menggunakan pendekatan yang ditunjukkan dalam sampel ini untuk memasukkan lapisan penembolokan ke dalam instans Azure.Security.KeyVault.Keys.Cryptography.KeyResolver.

Pengembang dapat menyediakan kunci, pemecah kunci, atau keduanya. Kunci diidentifikasi menggunakan pengidentifikasi kunci yang menyediakan logika untuk membungkus dan membuka bungkus CEK. Pemecah kunci digunakan untuk menyelesaikan kunci selama proses dekripsi. Pemecah kunci mendefinisikan metode penyelesaian yang mengembalikan kunci yang diberikan pengidentifikasi kunci. Pemecah memberi pengguna kemampuan memilih di antara beberapa kunci yang dikelola di beberapa lokasi.

Pada enkripsi, kunci selalu digunakan dan tidak adanya kunci akan mengakibatkan kesalahan.

Pada dekripsi, jika kunci ditentukan dan pengidentifikasinya cocok dengan pengidentifikasi kunci yang diperlukan, kunci tersebut digunakan untuk dekripsi. Jika tidak, pustaka klien mencoba memanggil pemecah. Jika tidak ada pemecah yang ditentukan, maka pustaka klien akan menampilkan kesalahan. Jika pemecah ditentukan, maka pemecah kunci dipanggil untuk mendapatkan kunci. Jika pemecah ditentukan tetapi tidak memiliki pemetaan untuk pengidentifikasi kunci, maka pustaka klien akan menampilkan kesalahan.

Untuk menggunakan enkripsi sisi klien, buat objek ClientSideEncryptionOptions dan atur pada pembuatan klien dengan SpecializedBlobClientOptions. Anda tidak dapat mengatur opsi enkripsi pada basis per-API. Hal lain akan ditangani oleh pustaka klien secara internal.

// Your key and key resolver instances, either through Azure Key Vault SDK or an external implementation.
IKeyEncryptionKey key;
IKeyEncryptionKeyResolver keyResolver;

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

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

// Create blob client with client-side encryption enabled.
// Client-side encryption options are passed from service clients to container clients, 
// and from container clients to blob clients.
// 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.
BlobClient blob = new BlobServiceClient(connectionString, options).GetBlobContainerClient("my-container").GetBlobClient("myBlob");

// Upload the encrypted contents to the blob.
blob.Upload(stream);

// Download and decrypt the encrypted contents from the blob.
MemoryStream outputStream = new MemoryStream();
blob.DownloadTo(outputStream);

Anda dapat menerapkan opsi enkripsi ke konstruktor BlobServiceClient, BlobContainerClient, atau BlobClient yang menerima objek BlobClientOptions.

Jika objek BlobClient sudah ada dalam kode Anda tetapi tidak memiliki opsi enkripsi sisi klien, maka Anda dapat menggunakan metode ekstensi untuk membuat salinan objek tersebut dengan ClientSideEncryptionOptions yang diberikan. Metode ekstensi ini menghindari overhead membangun objek BlobClient baru dari awal.

using Azure.Storage.Blobs.Specialized;

// An existing BlobClient instance and encryption options.
BlobClient plaintextBlob;
ClientSideEncryptionOptions encryptionOptions;

// Get a copy of the blob that uses client-side encryption.
BlobClient clientSideEncryptionBlob = plaintextBlob.WithClientSideEncryptionOptions(encryptionOptions);

Setelah memperbarui kode untuk menggunakan enkripsi sisi klien v2, pastikan Anda mendekripsi dan mengenkripsi ulang semua data terenkripsi yang ada, seperti yang dijelaskan dalam Mengenkripsi ulang data yang sebelumnya dienkripsi dengan enkripsi sisi klien v2.

Enkripsi ulang data yang sebelumnya dienkripsi dengan enkripsi sisi klien v2

Setiap data yang sebelumnya dienkripsi dengan enkripsi sisi klien v1 harus didekripsi dan kemudian dienkripsi ulang dengan enkripsi sisi klien v2 untuk mengurangi kerentanan keamanan. Dekripsi memerlukan pengunduhan data dan enkripsi ulang memerlukan pengunggahan ulang ke Blob Storage.

Untuk proyek sampel yang menunjukkan cara memigrasikan data dari enkripsi sisi klien v1 ke v2 serta cara mengenkripsi data dengan enkripsi sisi klien v2 di .NET, lihat Proyek sampel migrasi enkripsi.

Enkripsi dan performa sisi klien

Ingatlah bahwa mengenkripsi data penyimpanan Anda menghasilkan overhead performa tambahan. Saat menggunakan enkripsi sisi klien dalam aplikasi Anda, pustaka klien harus membuat CEK dan IV dengan aman, mengenkripsi konten itu sendiri, berkomunikasi dengan keystore pilihan Anda untuk pembungkusan kunci, dan memformat serta mengunggah metadata tambahan. Overhead ini bervariasi tergantung pada jumlah data yang dienkripsi. Kami menyarankan agar pelanggan selalu menguji performa aplikasi selama pengembangan.

Langkah berikutnya