Bloblar için istemci tarafı şifrelemesi

.NET için Azure Blob Depolama istemci kitaplığı, Azure Depolama'ya yüklemeden önce istemci uygulamalarındaki verilerin şifrelenmesi ve istemciye indirilirken verilerin şifresinin çözülmesini destekler. Kitaplık, depolama hesabı anahtar yönetimi için Azure Key Vault ile tümleştirmeyi de destekler.

Önemli

Blob Depolama hem hizmet tarafı hem de istemci tarafı şifrelemeyi destekler. Çoğu senaryoda Microsoft, verilerinizin korunmasında kullanım kolaylığı için hizmet tarafı şifreleme özelliklerinin kullanılmasını önerir. Hizmet tarafı şifrelemesi hakkında daha fazla bilgi edinmek için bkz. Bekleyen veriler için Azure Depolama şifrelemesi.

İstemci tarafı şifreleme ve Azure Key Vault kullanarak blobları şifreleme işleminde size yol gösteren adım adım öğretici için bkz. Azure Key Vault kullanarak Microsoft Azure Depolama blobları şifreleme ve şifresini çözme.

İstemci tarafı şifrelemesi hakkında

Azure Blob Depolama istemci kitaplığı, kullanıcı verilerini şifrelemek için AES kullanır. İstemci kitaplığında istemci tarafı şifrelemenin iki sürümü vardır:

Uyarı

İstemci kitaplığının CBC modu uygulamasındaki bir güvenlik açığı nedeniyle istemci tarafı şifrelemenin 1. sürümünün kullanılması artık önerilmez. Bu güvenlik açığı hakkında daha fazla bilgi için bkz. Azure Depolama, güvenlik açığını gidermek için SDK'da istemci tarafı şifrelemesini güncelleştirme. Şu anda sürüm 1 kullanıyorsanız, uygulamanızı sürüm 2'yi kullanacak şekilde güncelleştirmenizi ve verilerinizi geçirmenizi öneririz. Daha fazla rehberlik için uygulamalarınızdaki güvenlik açığını azaltma başlıklı aşağıdaki bölüme bakın.

Uygulamalarınızdaki güvenlik açığını azaltma

Blob Depolama istemci kitaplığının CBC modu uygulamasında bulunan bir güvenlik açığı nedeniyle Microsoft, aşağıdaki eylemlerden birini veya daha fazlasını hemen gerçekleştirmenizi önerir:

  • İstemci tarafı şifrelemesi yerine hizmet tarafı şifreleme özelliklerini kullanmayı göz önünde bulundurun. Hizmet tarafı şifreleme özellikleri hakkında daha fazla bilgi için bkz. Bekleyen veriler için Azure Depolama şifrelemesi.

  • İstemci tarafı şifreleme kullanmanız gerekiyorsa, uygulamalarınızı istemci tarafı şifreleme v1'den istemci tarafı şifreleme v2'ye geçirin.

Aşağıdaki tabloda, uygulamalarınızı istemci tarafı şifreleme v2'ye geçirmeyi seçerseniz uygulamanız gereken adımlar özetlenmiştir:

İstemci tarafı şifreleme durumu Önerilen eylemler
Uygulama, istemci tarafı şifrelemeyi istemci kitaplığının yalnızca istemci tarafı şifreleme v1'i destekleyen bir sürümünü kullanıyor. uygulamanızı istemci kitaplığının istemci tarafı şifreleme v2'yi destekleyen bir sürümünü kullanacak şekilde güncelleştirin. Desteklenen sürümlerin listesi için bkz. İstemci tarafı şifreleme için SDK destek matrisi . Daha fazla bilgi edinin...

kodunuzu istemci tarafı şifreleme v2 kullanacak şekilde güncelleştirin. Daha fazla bilgi edinin...

Şifrelerini çözmek için şifrelenmiş verileri indirin ve ardından istemci tarafı şifreleme v2 ile yeniden şifreleyin. Daha fazla bilgi edinin...
Uygulama, istemci tarafı şifreleme v2'yi destekleyen bir istemci kitaplığı sürümüyle istemci tarafı şifrelemesi kullanıyor. kodunuzu istemci tarafı şifreleme v2 kullanacak şekilde güncelleştirin. Daha fazla bilgi edinin...

Şifrelerini çözmek için şifrelenmiş verileri indirin ve ardından istemci tarafı şifreleme v2 ile yeniden şifreleyin. Daha fazla bilgi edinin...

Ayrıca Microsoft, verilerinizin güvenliğini sağlamaya yardımcı olmak için aşağıdaki adımları gerçekleştirmenizi önerir:

  • Depolama hesaplarınızı özel bir bağlantı üzerinden sanal ağınız (VNet) ile depolama hesabınız arasındaki tüm trafiğin güvenliğini sağlamak için özel uç noktaları kullanacak şekilde yapılandırın. Daha fazla bilgi için bkz . Azure Depolama için özel uç noktaları kullanma.
  • Ağ erişimini yalnızca belirli ağlara sınırlayın.

İstemci tarafı şifreleme için SDK destek matrisi

Aşağıdaki tabloda .NET, Java ve Python için istemci kitaplıklarının hangi sürümlerinin istemci tarafı şifrelemenin hangi sürümlerini desteklediği gösterilmektedir:

.NET Java Python
İstemci tarafı şifreleme v2 ve v1 Sürüm 12.13.0 ve üzeri Sürüm 12.18.0 ve üzeri Sürüm 12.13.0 ve üzeri
Yalnızca istemci tarafı şifreleme v1 Sürüm 12.12.0 ve öncesi Sürüm 12.17.0 ve öncesi Sürüm 12.12.0 ve öncesi

Uygulamanız .NET, Java veya Python istemci kitaplığının önceki bir sürümüyle istemci tarafı şifrelemesi kullanıyorsa, önce kodunuzu istemci tarafı şifreleme v2'yi destekleyen bir sürüme yükseltmeniz gerekir. Ardından, verilerinizin şifresini çözmeniz ve istemci tarafı şifreleme v2 ile yeniden şifrelemeniz gerekir. Gerekirse, kodunuzu geçirirken istemci kitaplığının önceki bir sürümüyle istemci tarafı şifreleme v2'yi destekleyen bir istemci kitaplığı sürümünü kullanabilirsiniz. Kod örnekleri için bkz . Örnek: İstemci tarafı şifreleme v2 ile blobu şifreleme ve şifresini çözme.

İstemci tarafı şifrelemesi nasıl çalışır?

Azure Blob Depolama istemci kitaplıkları, istemci tarafındaki verilerinizi şifrelemek ve şifresini çözmek için zarf şifrelemesi kullanır. Zarf şifrelemesi bir anahtarı bir veya daha fazla ek anahtarla şifreler.

Blob Depolama istemci kitaplıkları, istemci tarafı şifreleme için kullanılan anahtarları korumak için Azure Key Vault kullanır. Azure Key Vault hakkında daha fazla bilgi için bkz. Azure Key Vault nedir?.

Zarf tekniği aracılığıyla şifreleme ve şifre çözme

Zarf tekniğiyle şifreleme aşağıdaki gibi çalışır:

  1. Azure Depolama istemci kitaplığı, tek seferlik kullanılan bir simetrik anahtar olan bir içerik şifreleme anahtarı (CEK) oluşturur.

  2. Kullanıcı verileri CEK kullanılarak şifrelenir.

  3. CEK daha sonra anahtar şifreleme anahtarı (KEK) kullanılarak sarmalanır (şifrelenir). KEK bir anahtar tanımlayıcısı ile tanımlanır ve asimetrik anahtar çifti veya simetrik anahtar olabilir. KEK'yi yerel olarak yönetebilir veya bir Azure Key Vault depolayabilirsiniz.

    Azure Depolama istemci kitaplığının keke hiçbir zaman erişimi olmaz. Kitaplık, Key Vault tarafından sağlanan anahtar sarmalama algoritmasını çağırır. Kullanıcılar, istenirse anahtar sarmalama/sarmayı kaldırma için özel sağlayıcılar kullanmayı seçebilir.

  4. Şifrelenmiş veriler daha sonra Azure Blob Depolama yüklenir. Sarmalanan anahtar, bazı ek şifreleme meta verileriyle birlikte blobda meta veri olarak depolanır.

Zarf tekniğiyle şifre çözme işlemi aşağıdaki gibi çalışır:

  1. Azure Depolama istemci kitaplığı, kullanıcının KEK'yi yerel olarak veya azure Key Vault yönettiğini varsayar. Kullanıcının şifreleme için kullanılan belirli anahtarı bilmesi gerekmez. Bunun yerine, anahtarlar için farklı anahtar tanımlayıcılarını çözümleyen bir anahtar çözümleyici ayarlanabilir ve kullanılabilir.
  2. İstemci kitaplığı, şifrelenmiş verileri ve Azure Depolama'da depolanan tüm şifreleme malzemelerini indirir.
  3. Sarmalanan CEK), KEK kullanılarak sarmalanmamış (şifresi çözülmüş) olur. İstemci kitaplığının bu işlem sırasında KEK'ye erişimi yoktur, ancak yalnızca Azure Key Vault veya diğer anahtar deposunun açılmamış algoritmasını çağırır.
  4. İstemci kitaplığı şifrelenmiş kullanıcı verilerinin şifresini çözmek için CEK kullanır.

Blob karşıya yükleme/indirmede şifreleme/şifre çözme

Blob Depolama istemci kitaplığı, yalnızca karşıya yükleme sırasında tüm blobların şifrelenmesini destekler. İndirmeler için hem eksiksiz hem de aralıklı indirmeler desteklenir.

Şifreleme sırasında, istemci kitaplığı 16 baytlık rastgele bir başlatma vektöru (IV) ve 32 baytlık rastgele bir CEK oluşturur ve bu bilgileri kullanarak blob verilerinin zarf şifrelemesini gerçekleştirir. Sarmalanan CEK ve bazı ek şifreleme meta verileri daha sonra şifrelenmiş blob ile birlikte blob meta verileri olarak depolanır.

İstemci bir blob'un tamamını indirdiğinde sarmalanan CEK sarmalanmamıştır ve şifresi çözülen verileri istemciye döndürmek için IV ile birlikte kullanılır.

Şifrelenmiş blobda rastgele bir aralığın indirilmesi, istenen aralığın şifresini başarıyla çözmek için kullanılabilecek az miktarda ek veri almak için kullanıcılar tarafından sağlanan aralığın ayarlanmasını içerir.

Tüm blob türleri (blok blobları, sayfa blobları ve ekleme blobları) bu düzen kullanılarak şifrelenebilir/şifresi çözülebilir.

Uyarı

Blob için kendi meta verilerinizi düzenliyor veya karşıya yüklüyorsanız, şifreleme meta verilerinin korundığından emin olmanız gerekir. Şifreleme meta verilerini de korumadan yeni meta verileri karşıya yüklerseniz sarmalanan CEK, IV ve diğer meta veriler kaybolur ve blobun içeriğini alamazsınız. Blob Meta Verilerini Ayarla işlemini çağırmak her zaman tüm blob meta verilerinin yerini alır.

Şifrelenmiş bir blobdan okurken veya bu bloba yazarken Blobu Koy gibi blob karşıya yükleme komutlarının tamamını ve Blob Al gibi aralık veya blob indirme komutlarının tamamını kullanın. Blok Koy, Blok Listesini Koy, Sayfa Koy veya Bloğu Ekle gibi protokol işlemlerini kullanarak şifrelenmiş bloba yazmaktan kaçının. Bu işlemleri şifrelenmiş bir blobda çağırmak blobu bozabilir ve okunamaz hale getirir.

Örnek: İstemci tarafı şifreleme v2 ile blobu şifreleme ve şifresini çözme

Bu bölümdeki kod örneği, bir blobu şifrelemek ve şifresini çözmek için istemci tarafı şifreleme v2'nin nasıl kullanılacağını gösterir.

Önemli

Daha önce istemci tarafı şifreleme v1 ile şifrelenmiş verileriniz varsa bu verilerin şifresini çözmeniz ve istemci tarafı şifreleme v2 ile yeniden şifrelemeniz gerekir. Aşağıdaki istemci kitaplığınız için kılavuza ve örniğe bakın.

.NET kodunuzdan istemci tarafı şifrelemesi kullanmak için Blob Depolama istemci kitaplığına başvurun. 12.13.0 veya sonraki bir sürümü kullandığınızdan emin olun. Sürüm 11.x'ten sürüm 12.13.0'a geçmeniz gerekiyorsa Geçiş kılavuzuna bakın.

İstemci tarafı şifrelemesi için Azure Key Vault tümleştirmesi için iki ek paket gerekir:

  • Azure.Core paketi ve IKeyEncryptionKeyResolver arabirimlerini sağlarIKeyEncryptionKey. .NET için Blob Depolama istemci kitaplığı bu derlemeyi zaten bir bağımlılık olarak tanımlar.

  • Azure.Security.KeyVault.Keys paketi (sürüm 4.x ve üzeri), Key Vault REST istemcisini ve istemci tarafı şifreleme ile kullanılan şifreleme istemcilerini sağlar. Anahtar deponuz olarak Azure Key Vault kullanıyorsanız projenizde bu pakete başvuruldığından emin olmanız gerekir.

    Azure Key Vault yüksek değerli ana anahtarlar için tasarlanmıştır ve anahtar kasası başına azaltma sınırları bu tasarımı yansıtır. Azure.Security.KeyVault.Keys 4.1.0 sürümünden IKeyEncryptionKeyResolver itibaren arabirim anahtar önbelleğe almayı desteklemez. Azaltma nedeniyle önbelleğe alma gerekliyse, bir örneğe önbelleğe alma katmanı Azure.Security.KeyVault.Keys.Cryptography.KeyResolver eklemek için bu örnekte açıklanan yaklaşımı kullanabilirsiniz.

Geliştiriciler bir anahtar, anahtar çözümleyici veya hem anahtar hem de anahtar çözümleyici sağlayabilir. Anahtarlar, sarmalama ve CEK'ye dokunma mantığını sağlayan bir anahtar tanımlayıcısı kullanılarak tanımlanır. Şifre çözme işlemi sırasında bir anahtarı çözümlemek için anahtar çözümleyicisi kullanılır. Anahtar çözümleyicisi, anahtar tanımlayıcısı verilen anahtarı döndüren bir çözüm yöntemi tanımlar. Çözümleyici, kullanıcılara birden çok konumda yönetilen birden çok anahtar arasından seçim yapma olanağı sağlar.

Şifrelemede anahtar her zaman kullanılır ve bir anahtarın olmaması hataya neden olur.

Şifre çözmede, anahtar belirtilirse ve tanımlayıcısı gerekli anahtar tanımlayıcısıyla eşleşirse, bu anahtar şifre çözme için kullanılır. Aksi takdirde, istemci kitaplığı çözümleyiciyi çağırmaya çalışır. Herhangi bir çözümleyici belirtilmemişse, istemci kitaplığı bir hata oluşturur. Bir çözümleyici belirtilirse anahtarı almak için anahtar çözümleyicisi çağrılır. Çözümleyici belirtilirse ancak anahtar tanımlayıcısı için eşlemesi yoksa, istemci kitaplığı bir hata oluşturur.

İstemci tarafı şifrelemeyi kullanmak için bir ClientSideEncryptionOptions nesnesi oluşturun ve Bunu SpecializedBlobClientOptions ile istemci oluşturma sırasında ayarlayın. Şifreleme seçeneklerini API temelinde ayarlayamazsınız. Diğer her şey istemci kitaplığı tarafından dahili olarak işlenir.

// 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);

BlobServiceClient, BlobContainerClient veya BlobClient nesnelerini kabul eden BlobClient oluşturucularına şifreleme seçenekleri uygulayabilirsiniz.

Kodunuzda bir BlobClient nesnesi zaten varsa ancak istemci tarafı şifreleme seçenekleri yoksa, verilen ClientSideEncryptionOptions ile bu nesnenin bir kopyasını oluşturmak için bir uzantı yöntemi kullanabilirsiniz. Bu uzantı yöntemi, sıfırdan yeni bir BlobClient nesnesi oluşturma yükünü önler.

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

kodunuzu istemci tarafı şifreleme v2 kullanacak şekilde güncelleştirdikten sonra, daha önce şifrelenmiş verileri istemci tarafı şifreleme v2 ile yeniden şifreleme bölümünde açıklandığı gibi mevcut şifrelenmiş verilerin şifresini kaldırdığınızdan ve yeniden şifrelediğinizden emin olun.

İstemci tarafı şifreleme v2 ile önceden şifrelenmiş verileri yeniden şifreleme

Daha önce istemci tarafı şifreleme v1 ile şifrelenen tüm verilerin şifresi çözülmelidir ve güvenlik açığını azaltmak için istemci tarafı şifreleme v2 ile yeniden şifrelenmelidir. Şifre çözme, verilerin indirilmesini ve yeniden şifrelemenin blob depolamaya yeniden yüklenmesini gerektirir.

verileri istemci tarafı şifreleme v1'den v2'ye geçirmeyi ve .NET'te istemci tarafı şifreleme v2 ile verileri şifrelemeyi gösteren örnek bir proje için bkz . Şifreleme geçişi örnek projesi.

İstemci tarafı şifreleme ve performans

Depolama verilerinizi şifrelemenin ek performans yüküne neden olduğunu unutmayın. Uygulamanızda istemci tarafı şifreleme kullandığınızda, istemci kitaplığının CEK ve IV'yi güvenli bir şekilde oluşturması, içeriğin kendisini şifrelemesi, anahtar sarmalama için seçtiğiniz anahtar deposuyla iletişim kurması ve ek meta verileri biçimlendirmesi ve karşıya yüklemesi gerekir. Bu ek yük, şifrelenen veri miktarına bağlı olarak değişir. Müşterilerin geliştirme sırasında uygulamalarını her zaman performans açısından test etmelerini öneririz.

Sonraki adımlar