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 Advanced Encryption Standard (AES) untuk mengenkripsi data pengguna. Ada dua versi enkripsi sisi klien yang tersedia di pustaka klien:
- Versi 2 menggunakan mode Galois/Counter Mode (GCM) dengan AES.
- Versi 1 menggunakan mode Cipher Block Chaining (CBC) dengan AES.
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 ini meringkas langkah-langkah yang harus diambil jika Anda 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 ini memperlihatkan versi pustaka klien mana untuk .NET, Java, dan Python yang mendukung versi enkripsi sisi klien yang berbeda:
.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 |
Catatan
Enkripsi sisi klien v2.1 tersedia di Java SDK untuk versi 12.27.0 dan yang lebih baru. Versi ini memungkinkan Anda mengonfigurasi panjang wilayah untuk enkripsi terautentikasi, dari 16 byte hingga 1 GiB. Untuk informasi selengkapnya, lihat contoh Java di Contoh: Mengenkripsi dan mendekripsi blob dengan enkripsi sisi klien v2.
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 secara berdampingan dengan versi pustaka klien yang lebih lama saat Anda 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 mengetahui 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:
Pustaka klien Azure Storage menghasilkan kunci enkripsi konten (CEK), yang merupakan kunci simetris sekali pakai.
Data pengguna dienkripsi menggunakan CEK.
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. Pustaka tersebut hanya memanggil algoritma pembungkus kunci yang disediakan oleh Key Vault. Pelanggan dapat memilih untuk menggunakan penyedia layanan kustom untuk pembungkusan/pembongkaran jika ingin.
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:
- 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.
- Pustaka klien mengunduh data terenkripsi bersama dengan materi enkripsi apa pun yang disimpan di Azure Storage.
- CEK yang dibungkus kemudian dibongkar (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.
- 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. Enkripsi sisi klien v2 memotong data menjadi blok enkripsi terautentikasi buffer 4 MiB yang hanya dapat diubah secara keseluruhan. Untuk menyesuaikan ukuran gugus, pastikan Anda menggunakan versi terbaru SDK yang mendukung enkripsi sisi klien v2.1. Panjang wilayah dapat dikonfigurasi dari 16 byte hingga 1 GiB.
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 arbitrer dalam blob terenkripsi melibatkan penyesuaian rentang yang disediakan oleh pengguna untuk mendapatkan sejumlah kecil data tambahan yang dapat digunakan untuk berhasil 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 mengenkripsinya kembali 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
danIKeyEncryptionKeyResolver
. 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. Pastikan paket ini direferensikan dalam proyek Anda jika Anda 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 instansAzure.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 menghasilkan 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. Segala sesuatu yang lain 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
(new Uri($"https://{accountName}.blob.core.windows.net"), new DefaultAzureCredential(), 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 data terenkripsi yang ada, seperti yang dijelaskan dalam Mengenkripsi ulang data yang dienkripsi sebelumnya dengan enkripsi sisi klien v2.
Mengenkripsi 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 pengisian 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.