Aracılığıyla paylaş


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 anahtarları

Ş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 /propertyyolu. Ş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:

  1. Yeni bir Azure Key Vault örneği oluşturun veya var olan bir örneği bulun.
  2. Anahtarlar bölümünde yeni bir anahtar oluşturun.
  3. 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:

  1. Azure Key Vault örneğinizden Erişim ilkeleri bölümüne gidin ve yeni bir ilke ekleyin:

    1. Anahtar izinleri bölümünde Al, Listele, Anahtarı Çöz, Anahtarı Kaydır, Doğrula ve İmzala'yı seçin.
    2. 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:

Yeni bir Azure Key Vault örneğinin geçici silme ve temizleme koruma özelliklerinin ekran görüntüsü.

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:

  • Microsoft.Azure.Cosmos.Encryption paketiyle .NET'te.
  • Azure.cosmos.encryption paketiyle Java'da.

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 TokenCredentialoluşturmaya ilişkin örnekleri burada bulabilirsiniz.

Not

Sınıflara erişmek için ek Azure.Identity paketineTokenCredential 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.
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

  • Azure Cosmos DB'de verilere güvenli erişime genel bir bakış edinin.
  • Bekleyen şifreleme için müşteri tarafından yönetilen anahtarlar hakkında daha fazla bilgi edinin