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, verilerinizi korumada 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 Gelişmiş Şifreleme Standardı 'nı (AES) kullanır. İstemci kitaplığında istemci tarafı şifrelemenin iki sürümü vardır:
- Sürüm 2, AES ile Galois/Counter Mode (GCM) modunu kullanır.
- Sürüm 1, AES ile Şifreleme Blok Zinciri (CBC) modunu kullanı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 . Güvenlik açığını gidermek için SDK'da azure depolama 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 kılavuz 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 birkaçı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 atılması 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... Şifresini çözmek için şifrelenmiş verileri indirin, 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... Şifresini çözmek için şifrelenmiş verileri indirin, 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:
- Ö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 depolama hesaplarınızı ö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 farklı 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 |
Not
İstemci tarafı şifreleme v2.1, 12.27.0 ve üzeri sürümler için Java SDK'sında kullanılabilir. Bu sürüm, kimliği doğrulanmış şifreleme için bölge uzunluğunu 16 bayttan 1 GiB'ye kadar yapılandırmanıza olanak tanır. Daha fazla bilgi için Örnek: İstemci tarafı şifreleme v2 ile bir blobu şifreleme ve şifresini çözme altındaki Java örneğine bakın.
Uygulamanız .NET, Java veya Python istemci kitaplığının önceki bir sürümüyle istemci tarafı şifreleme 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 bir blobu şifreleme ve şifresini çözme.
İstemci tarafı şifreleme nasıl çalışır?
Azure Blob Depolama istemci kitaplıkları, istemci tarafında 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'a güvenir. Azure Key Vault hakkında daha fazla bilgi için bkz . Azure Key Vault nedir?.
Zarf tekniğiyle şifreleme ve şifre çözme
Zarf tekniğiyle şifreleme aşağıdaki gibi çalışır:
Azure Depolama istemci kitaplığı, tek seferlik kullanılan bir simetrik anahtar olan bir içerik şifreleme anahtarı (CEK) oluşturur.
Kullanıcı verileri CEK kullanılarak şifrelenir.
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'ta depolayabilirsiniz.
Azure Depolama istemci kitaplığının kendisi keke hiçbir zaman erişemez. Kitaplık, Key Vault tarafından sağlanan anahtar sarmalama algoritmasını çağırır. Kullanıcılar isterseniz anahtar sarmalama/açma için özel sağlayıcılar kullanmayı seçebilir.
Ş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:
- Azure Depolama istemci kitaplığı, kullanıcının KEK'yi yerel olarak veya bir Azure Key Vault'ta 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.
- İstemci kitaplığı şifrelenmiş verileri ve Azure Depolama'da depolanan tüm şifreleme malzemelerini indirir.
- Sarmalanan CEK daha sonra KEK kullanılarak çözülür (şifresi çözülür). İstemci kitaplığının bu işlem sırasında KEK'ye erişimi yoktur, ancak yalnızca Azure Key Vault'un veya diğer anahtar deposunun açılmayan algoritmasını çağırır.
- İ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. İstemci tarafı şifreleme v2, verileri yalnızca bütün olarak dönüştürülebilen 4 MiB arabelleğe alınmış kimliği doğrulanmış şifreleme bloğuna ayırır. Öbek boyutunu ayarlamak için SDK'nın istemci tarafı şifreleme v2.1'i destekleyen en son sürümünü kullandığınızdan emin olun. Bölge uzunluğu 16 bayttan 1 GiB'ye kadar yapılandırılabilir.
Ş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ış olur 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şleminin çağrılması her zaman tüm blob meta verilerinin yerini alır.
Şifrelenmiş bir blobdan okurken veya bu bloba yazarken, Blobu Koy gibi blob 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ş bir bloba yazmaktan kaçının. Şifrelenmiş bir blobda bu işlemlerin çağrılması, 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 örneğe bakın.
.NET kodunuzdan istemci tarafı şifrelemesini kullanmak için Blob Depolama istemci kitaplığına başvurun. 12.13.0 veya sonraki bir sürümü kullandığınızdan emin olun. 11.x sürümünden 12.13.0 sürümüne geçiş yapmanız gerekiyorsa Geçiş kılavuzuna bakın.
İstemci tarafı şifreleme 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şvurıldığından emin olun.
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'in 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 belirtilen yaklaşımı kullanabilirsiniz.
Geliştiriciler anahtar, anahtar çözümleyici veya hem anahtar hem de anahtar çözümleyici sağlayabilir. Anahtarlar, CEK'yi sarmalama ve açma 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 bir 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 anahtarın olmaması hatayla sonuçlanır.
Şifre çözmede, anahtar belirtilirse ve tanımlayıcısı gerekli anahtar tanımlayıcısıyla eşleşirse, şifre çözme için bu anahtar 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
(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);
BlobClientOptions nesnelerini kabul eden bir BlobServiceClient, BlobContainerClient veya 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, önceden şifrelenmiş verileri istemci tarafı şifreleme v2 ile yeniden şifreleme bölümünde açıklandığı gibi mevcut şifrelenmiş verilerin şifresini çözdüğünüzden 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ı şifrelemesi ve performansı
Depolama verilerinizi şifrelemenin ek performans ek 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.