Azure Cosmos DB için Always Encrypted ile istemci tarafı şifrelemesi kullanma
UYGULANANLAR: NoSQL
Önemli
Şifreleme paketlerimizin 1.0 sürümüyle hataya neden olan bir değişiklik kullanıma sunulmuştur. Önceki sürümlerle veri şifreleme anahtarları ve şifreleme özellikli kapsayıcılar oluşturduysanız, istemci kodunuzu 1.0 paketlerine geçirdikten sonra veritabanlarınızı ve kapsayıcılarınızı yeniden oluşturmanız gerekir.
Always Encrypted, Azure Cosmos DB'de depolanan kredi kartı numaraları veya ulusal/bölgesel kimlik numaraları (örneğin, ABD sosyal güvenlik numaraları) gibi hassas verileri korumak için tasarlanmış bir özelliktir. Always Encrypted, istemcilerin istemci uygulamaları içindeki hassas verileri şifrelemesine olanak tanır ve şifreleme anahtarlarını veritabanına hiçbir zaman göstermez.
Always Encrypted, Azure Cosmos DB'ye istemci tarafı şifreleme özellikleri getirir. Aşağıdaki senaryolarda veri istemci tarafınızı şifrelemek gerekebilir:
- Belirli gizlilik özelliklerine sahip hassas verileri koruma: Always Encrypted, istemcilerin uygulamalarında hassas verileri şifrelemesine ve düz metin verilerini veya şifreleme anahtarlarını Azure Cosmos DB hizmetine hiçbir zaman göstermemesini sağlar.
- Özellik başına erişim denetimi uygulama: Şifreleme, Azure Key Vault'tan sahip olduğunuz ve yönettiğiniz anahtarlarla denetlendiğinden, her istemcinin hangi hassas özelliklere erişimi olduğunu denetlemek için erişim ilkeleri uygulayabilirsiniz.
Kavramlar
Azure Cosmos DB için Always Encrypted, istemci tarafı şifrelemenizin yapılandırmasında yer alan bazı yeni kavramlar sağlar.
Şifreleme anahtarları
Veri şifreleme anahtarları
Always Encrypted kullanılırken veriler önceden oluşturulması gereken veri şifreleme anahtarları (DEK) ile şifrelenir. Bu DEK'ler Azure Cosmos DB hizmetinde depolanır ve veritabanı düzeyinde tanımlanır, bu nedenle DEK birden çok kapsayıcı arasında paylaşılabilir. DEK'lerin oluşturulması, Azure Cosmos DB SDK'sı kullanılarak istemci tarafında gerçekleştirilir.
Şunları yapabilirsiniz:
- Şifrelemek için özellik başına bir DEK oluşturun veya
- Birden çok özelliği şifrelemek için aynı DEK'yi kullanın.
Müşteri tarafından yönetilen anahtarlar
DEK'ler Azure Cosmos DB'de depolanmadan önce, müşteri tarafından yönetilen bir anahtar (CMK) tarafından sarmalanmıştır. CMK'ler, DEK'lerin sarmalanıp çıkarılma işlemlerini denetleyerek ilgili DEK'lerle şifrelenmiş verilere erişimi etkili bir şekilde denetler. CMK depolama, genişletilebilir olarak tasarlanmıştır ve bunların Azure Key Vault'ta depolanmasını bekleyen varsayılan bir uygulamadır.
Şifreleme ilkesi
Dizin oluşturma ilkesine benzer şekilde, şifreleme ilkesi de JSON özelliklerinin nasıl şifrelenmesi gerektiğini açıklayan kapsayıcı düzeyinde bir belirtimdir. Kapsayıcı oluşturulduğunda ve sabit olduğunda bu ilke sağlanmalıdır. Geçerli sürümde şifreleme ilkesini güncelleştiremezsiniz.
Şifrelemek istediğiniz her özellik için şifreleme ilkesi şunları tanımlar:
- özelliğinin biçimindeki
/property
yolu. Şu anda yalnızca en üst düzey yollar desteklenir, gibi/path/to/property
iç içe yerleştirilmiş yollar desteklenmez. - Özelliği şifrelerken ve şifresini çözerken kullanılacak DEK'nin kimliği.
- Şifreleme türü. Rastgele veya belirlenebilir.
- Özelliği şifrelerken kullanılacak şifreleme algoritması. Belirtilen algoritma, uyumluysa anahtarı oluştururken tanımlanan algoritmayı geçersiz kılabilir.
Rastgele ve belirleyici şifreleme karşılaştırması
Azure Cosmos DB hizmeti, Always Encrypted ile şifrelenmiş özelliklerin düz metnini hiçbir zaman görmez. Ancak, bir özellik için kullanılan şifreleme türüne bağlı olarak şifrelenmiş veriler üzerinde bazı sorgulama özelliklerini desteklemeye devam eder. Always Encrypted aşağıdaki iki şifreleme türünü destekler:
Belirleyici şifreleme: Belirli bir düz metin değeri ve şifreleme yapılandırması için her zaman aynı şifrelenmiş değeri oluşturur. Belirlenmci şifrelemenin kullanılması sorguların şifrelenmiş özelliklerde eşitlik filtreleri gerçekleştirmesine olanak tanır. Ancak, saldırganların şifrelenmiş özellikteki desenleri inceleyerek şifrelenmiş değerler hakkındaki bilgileri tahmin etmelerine izin verebilir. Bu durum özellikle True/False veya Kuzey/Güney/Doğu/Batı bölgesi gibi küçük bir dizi olası şifrelenmiş değer varsa geçerlidir.
Rastgele şifreleme: Verileri daha az tahmin edilebilir bir şekilde şifreleyen bir yöntem kullanır. Rastgele şifreleme daha güvenlidir, ancak sorguların şifrelenmiş özelliklere göre filtrelenmesini engeller.
Always Encrypted'da belirlenimci ve rastgele şifreleme hakkında daha fazla bilgi edinmek için bkz . Başlatma vektöru (IV) oluşturma.
Azure Key Vault kurulumu
Always Encrypted'ı kullanmaya başlamanın ilk adımı, Azure Key Vault'ta CMK'lerinizi oluşturmaktır:
- Yeni bir Azure Key Vault örneği oluşturun veya var olan bir örneği bulun.
- Anahtarlar bölümünde yeni bir anahtar oluşturun.
- Anahtar oluşturulduktan sonra geçerli sürümüne göz atın ve tam anahtar tanımlayıcısını kopyalayın:
https://<my-key-vault>.vault.azure.net/keys/<key>/<version>
. Anahtar tanımlayıcısının sonundaki anahtar sürümünü atlarsanız anahtarın en son sürümü kullanılır.
Ardından Azure Cosmos DB SDK'sının Azure Key Vault örneğine nasıl erişeceğini yapılandırmanız gerekir. Bu kimlik doğrulaması bir Microsoft Entra kimliği aracılığıyla yapılır. Büyük olasılıkla, istemci kodunuzla Azure Key Vault örneğiniz arasında ara sunucu olarak bir Microsoft Entra uygulamasının veya yönetilen kimliğin kimliğini kullanırsınız, ancak her türlü kimlik kullanılabilir. Ara sunucu olarak Microsoft Entra kimliğinizi kullanmak için aşağıdaki adımları kullanın:
Azure Key Vault örneğinizden Erişim ilkeleri bölümüne gidin ve yeni bir ilke ekleyin:
- Anahtar izinleri bölümünde Al, Listele, Anahtarı Çöz, Anahtarı Kaydır, Doğrula ve İmzala'yı seçin.
- Sorumlu seçin bölümünde Microsoft Entra kimliğinizi arayın.
CMK'nizi yanlışlıkla silinmeye karşı koruma
CMK'niz yanlışlıkla silindikten sonra şifrelenmiş verilerinize erişimi kaybetmediğinizden emin olmak için Azure Key Vault örneğinizde iki özellik ayarlamanız önerilir: Geçici Silme ve Temizleme Koruması.
Yeni bir Azure Key Vault örneği oluşturursanız oluşturma sırasında şu özellikleri etkinleştirin:
Mevcut bir Azure Key Vault örneği kullanıyorsanız, Azure portalındaki Özellikler bölümüne bakarak bu özelliklerin etkinleştirildiğini doğrulayabilirsiniz. Bu özelliklerden herhangi biri etkinleştirilmediyse, aşağıdaki makalelerden birinde "Geçici silmeyi etkinleştirme" ve "Temizleme Korumasını Etkinleştirme" bölümlerine bakın:
SDK'yi başlatma
Not
Azure Cosmos DB için Always Encrypted şu anda desteklenmektedir:
Always Encrypted'ı kullanmak için bir örneğinin KeyResolver
Azure Cosmos DB SDK örneğine eklenmesi gerekir. Ad alanında tanımlanan bu sınıf, CMK'lerinizi Azure.Security.KeyVault.Keys.Cryptography
barındıran anahtar deposuyla etkileşime geçmek için kullanılır.
Aşağıdaki kod parçacıkları, Azure Key Vault örneğine erişirken kullanılacak Microsoft Entra kimliğini almak için sınıfını kullanır DefaultAzureCredential
. Farklı sınıf türleri TokenCredential
oluşturmaya ilişkin örnekleri burada bulabilirsiniz.
Not
Sınıflara erişmek için ek Azure.Identity paketine TokenCredential
ihtiyacınız olacaktır.
var tokenCredential = new DefaultAzureCredential();
var keyResolver = new KeyResolver(tokenCredential);
var client = new CosmosClient("<connection-string>")
.WithEncryption(keyResolver, KeyEncryptionKeyResolverName.AzureKeyVault);
Veri şifreleme anahtarı oluşturma
Verilerin kapsayıcıda şifrelenmeden önce üst veritabanında bir veri şifreleme anahtarı oluşturulması gerekir.
Yeni veri şifreleme anahtarı oluşturma işlemi yöntemi çağrılarak CreateClientEncryptionKeyAsync
ve geçirilerek gerçekleştirilir:
- Veritabanında anahtarı benzersiz olarak tanımlayan bir dize tanımlayıcısı.
- Anahtarla birlikte kullanılması amaçlanan şifreleme algoritması. Şu anda yalnızca bir algoritma desteklenmektedir.
- Azure Key Vault'ta depolanan CMK'nin anahtar tanımlayıcısı. Bu parametre genel bir
EncryptionKeyWrapMetadata
nesnede geçirilir ve burada:- anahtar
type
çözümleyicinin türünü tanımlar (örneğin, Azure Key Vault). name
, istediğiniz herhangi bir kolay ad olabilir.value
anahtar tanımlayıcısı olmalıdır.
Önemli
Anahtar oluşturulduktan sonra geçerli sürümüne gidin ve tam anahtar tanımlayıcısını kopyalayın:
https://<my-key-vault>.vault.azure.net/keys/<key>/<version>
. Anahtar tanımlayıcısının sonundaki anahtar sürümünü atlarsanız anahtarın en son sürümü kullanılır.- anahtar
algorithm
şifreleme anahtarını müşteri tarafından yönetilen anahtarla sarmak için hangi algoritmanın kullanılacağını tanımlar.
- anahtar
var database = client.GetDatabase("my-database");
await database.CreateClientEncryptionKeyAsync(
"my-key",
DataEncryptionAlgorithm.AeadAes256CbcHmacSha256,
new EncryptionKeyWrapMetadata(
KeyEncryptionKeyResolverName.AzureKeyVault,
"akvKey",
"https://<my-key-vault>.vault.azure.net/keys/<key>/<version>",
EncryptionAlgorithm.RsaOaep.ToString()));
Şifreleme ilkesiyle kapsayıcı oluşturma
Kapsayıcıyı oluştururken kapsayıcı düzeyinde şifreleme ilkesini belirtin.
var path1 = new ClientEncryptionIncludedPath
{
Path = "/property1",
ClientEncryptionKeyId = "my-key",
EncryptionType = EncryptionType.Deterministic.ToString(),
EncryptionAlgorithm = DataEncryptionAlgorithm.AeadAes256CbcHmacSha256
};
var path2 = new ClientEncryptionIncludedPath
{
Path = "/property2",
ClientEncryptionKeyId = "my-key",
EncryptionType = EncryptionType.Randomized.ToString(),
EncryptionAlgorithm = DataEncryptionAlgorithm.AeadAes256CbcHmacSha256
};
await database.DefineContainer("my-container", "/partition-key")
.WithClientEncryptionPolicy()
.WithIncludedPath(path1)
.WithIncludedPath(path2)
.Attach()
.CreateAsync();
Şifrelenmiş verileri okuma ve yazma
Veriler nasıl şifrelenir?
Bir belge Azure Cosmos DB'ye her yazıldıktan sonra SDK, hangi özelliklerin şifrelenmesinin gerektiğini ve nasıl şifrelenmesinin gerektiğini bulmak için şifreleme ilkesini arar. Şifrelemenin sonucu bir temel 64 dizesidir.
Karmaşık türlerin şifrelenmesini:
Şifreleme özelliği bir JSON dizisi olduğunda, dizinin her girişi şifrelenir.
Şifreleme özelliği bir JSON nesnesi olduğunda, yalnızca nesnenin yaprak değerleri şifrelenir. Ara alt özellik adları düz metin biçiminde kalır.
Şifrelenmiş öğeleri okuma
Nokta okumaları (kimliği ve bölüm anahtarıyla tek bir öğeyi getirme), sorgular veya değişiklik akışını okurken şifrelenmiş özelliklerin şifresini çözmek için açık bir eylem gerekmez. Bunun nedeni:
- SDK, hangi özelliklerin şifresinin çözülmesi gerektiğini bulmak için şifreleme ilkesini arar.
- Şifrelemenin sonucu, değerin özgün JSON türünü ekler.
Şifrelenmiş özelliklerin çözümünün ve bunların sonraki şifre çözme işlemlerinin yalnızca isteklerinizden döndürülen sonuçlara dayandığını unutmayın. Örneğin, şifrelenmişse ancak ()SELECT property1 AS property2 FROM c
olarak property2
yansıtılıyorsaproperty1
, SDK tarafından alındığında şifrelenmiş özellik olarak tanımlanmamıştır.
Şifrelenmiş özelliklerdeki sorguları filtreleme
Şifrelenmiş özelliklere göre filtreleyen sorgular yazarken, sorgu parametresinin değerini geçirmek için belirli bir yöntem kullanılmalıdır. Bu yöntem aşağıdaki bağımsız değişkenleri alır:
- Sorgu parametresinin adı.
- Sorguda kullanılacak değer.
- Şifrelenmiş özelliğin yolu (şifreleme ilkesinde tanımlandığı gibi).
Önemli
Şifrelenmiş özellikler yalnızca eşitlik filtrelerinde (WHERE c.property = @Value
) kullanılabilir. Diğer tüm kullanımlar tahmin edilemeyen ve yanlış sorgu sonuçları döndürür. Bu kısıtlama SDK'nın sonraki sürümlerinde daha iyi uygulanır.
var queryDefinition = container.CreateQueryDefinition(
"SELECT * FROM c where c.property1 = @Property1");
await queryDefinition.AddParameterAsync(
"@Property1",
1234,
"/property1");
Özelliklerin yalnızca bir alt kümesinin şifresinin çözülebildiği belgeleri okuma
İstemcinin özellikleri şifrelemek için kullanılan tüm CMK'lere erişimi olmadığı durumlarda, veriler yeniden okunduğunda özelliklerin yalnızca bir alt kümesinin şifresi çözülebilir. Örneğin, anahtar1 ile şifrelendiyse ve property2
anahtar2 ile şifrelendiyseproperty1
, yalnızca key1'e erişimi olan bir istemci uygulaması verileri okumaya devam edebilir, ancak okuyamayabilirproperty2
. Böyle bir durumda, VERILERINIZI SQL sorguları aracılığıyla okumanız ve istemcinin şifresini çözemeyebileceği özellikleri yansıtmanız gerekir: SELECT c.property1, c.property3 FROM c
.
CMK döndürme
Geçerli CMK'nin gizliliğinin ihlal edildiğini düşünüyorsanız CMK'nizi "döndürmek" isteyebilirsiniz (geçerli CMK yerine yeni bir CMK kullanın). CMK'yi düzenli olarak döndürmek de yaygın bir güvenlik uygulamasıdır. Bu döndürmeyi gerçekleştirmek için, yalnızca belirli bir DEK'yi sarmak için kullanılması gereken yeni CMK'nin anahtar tanımlayıcısını sağlamanız gerekir. Bu işlemin verilerinizin şifrelenmesini değil DEK'nin korunmasını etkilediğini unutmayın. Döndürme tamamlanana kadar önceki CMK'ye erişim iptal edilmemelidir.
await database.RewrapClientEncryptionKeyAsync(
"my-key",
new EncryptionKeyWrapMetadata(
KeyEncryptionKeyResolverName.AzureKeyVault,
"akvKey",
"https://<my-key-vault>.vault.azure.net/keys/<new-key>/<version>",
EncryptionAlgorithm.RsaOaep.ToString()));
DEK döndürme
Veri şifreleme anahtarını döndürme özelliği, anahtar teslimi özelliği olarak sunulmaz. Bunun nedeni, DEK'nin güncelleştirilmesi için bu anahtarın kullanıldığı tüm kapsayıcıların taranıp bu anahtarla şifrelenen tüm özelliklerin yeniden şifrelenmesi gerekir. Bu işlem yalnızca Azure Cosmos DB hizmeti DEK'nin düz metin değerini depolamadığından veya bunlara erişmediğinden istemci tarafında gerçekleşebilir.
Uygulamada DEK döndürme işlemi, etkilenen kapsayıcılardan yeni kapsayıcılara veri geçişi gerçekleştirilerek gerçekleştirilebilir. Yeni kapsayıcılar, özgün kapsayıcılarla tam olarak aynı şekilde oluşturulabilir. Bu tür bir veri geçişi konusunda size yardımcı olmak için GitHub'da tek başına bir geçiş aracı bulabilirsiniz.
Ek şifrelenmiş özellikler ekleme
Mevcut bir şifreleme ilkesine ek şifrelenmiş özellikler eklenmesi, yukarıdaki bölümde açıklanan nedenlerle desteklenmez. Bu işlem, özelliklerin tüm örneklerinin düzgün bir şekilde şifrelendiğinden emin olmak için kapsayıcının tam taramasını gerektirir ve bu yalnızca istemci tarafında gerçekleşebilen bir işlemdir. Dek döndürmede olduğu gibi, uygun bir şifreleme ilkesine sahip yeni bir kapsayıcıya veri geçişi gerçekleştirilerek ek şifrelenmiş özellikler eklenebilir.
Şema açısından yeni şifrelenmiş özelliklerin eklenme şekli konusunda esnekliğiniz varsa, Azure Cosmos DB'nin şemadan bağımsız doğasından da yararlanabilirsiniz. Şifreleme ilkenizde "özellik paketi" olarak tanımlanan bir özellik kullanıyorsanız, kısıtlama olmadan aşağıda daha fazla özellik ekleyebilirsiniz. Örneğin, bunun property1
şifreleme ilkenizde tanımlandığını ve başlangıçta belgelerinizde yazdığınızı property1.property2
düşünelim. Daha sonraki bir aşamada şifrelenmiş özellik olarak eklemeniz property3
gerekiyorsa, belgelerinizde yazmaya property1.property3
başlayabilirsiniz ve yeni özellik de otomatik olarak şifrelenir. Bu yaklaşım herhangi bir veri geçişi gerektirmez.
Sonraki adımlar
- Bekleyen şifreleme için müşteri tarafından yönetilen anahtarlar hakkında daha fazla bilgi edinin