Öğretici: Azure Anahtar Kasasını kullanarak blob’ları şifreleme ve şifre çözme

Bu öğreticide, Azure Key Vault ile depolanan bir anahtarı kullanarak blobları şifrelemek ve şifresini çözmek için istemci tarafı şifrelemeyi kullanmayı öğreneceksiniz.

Azure 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.

.NET için Azure Blob Depolama istemci kitaplığı, Azure Depolama'a yüklemeden ve istemciye indirilirken verilerin şifresini çözmeden önce uygulamalar içinde istemci tarafı veri şifrelemesini destekler. Kitaplık, anahtar yönetimi için Azure Key Vault ile tümleştirmeyi de destekler.

Bu öğretici şunların nasıl yapıldığını gösterir:

  • Azure Key Vault kaynağı için izinleri yapılandırma
  • .NET istemci kitaplıklarını kullanarak kaynaklarla etkileşim kurmak için bir konsol uygulaması oluşturma
  • Anahtar kasasına anahtar ekleme
  • Anahtar kasasında depolanan bir anahtarı kullanarak istemci tarafı şifreleme seçeneklerini yapılandırma
  • İstemci tarafı şifrelemesi etkin bir blob hizmeti istemci nesnesi oluşturma
  • Şifrelenmiş blobu karşıya yükleyin, ardından blobu indirip şifresini çözme

Ön koşullar

Microsoft Entra kullanıcınıza rol atama

Yerel olarak geliştirirken, anahtar kasasına erişen kullanıcı hesabının doğru izinlere sahip olduğundan emin olun. Anahtar oluşturmak ve anahtar kasasındaki anahtarlar üzerinde eylemler gerçekleştirmek için Key Vault Şifreleme Yetkilisi rolüne ihtiyacınız olacaktır. Azure portalı, Azure CLI veya Azure PowerShell'i kullanarak kullanıcıya Azure RBAC rolleri atayabilirsiniz. Rol atamaları için kullanılabilir kapsamlar hakkında daha fazla bilgiyi kapsam genel bakış sayfasından öğrenebilirsiniz.

Bu senaryoda, En Az Ayrıcalık İlkesi'ni izlemek için anahtar kasası kapsamındaki kullanıcı hesabınıza izinler atayacaksınız. Bu uygulama kullanıcılara yalnızca gereken minimum izinleri verir ve daha güvenli üretim ortamları oluşturur.

Aşağıdaki örnek, bu öğreticiyi tamamlamak için ihtiyacınız olan erişimi sağlayan Key Vault Şifreleme Yetkilisi rolünü kullanıcı hesabınıza nasıl atayabileceğinizi gösterir.

Önemli

Çoğu durumda rol atamasının Azure'a yayılması bir veya iki dakika sürer, ancak nadir durumlarda sekiz dakikaya kadar sürebilir. Kodunuzu ilk kez çalıştırdığınızda kimlik doğrulama hataları alıyorsanız, birkaç dakika bekleyin ve yeniden deneyin.

  1. Azure portalında ana arama çubuğunu veya sol gezintiyi kullanarak anahtar kasanızı bulun.

  2. Anahtar kasasına genel bakış sayfasında sol taraftaki menüden Erişim denetimi (IAM) öğesini seçin.

  3. Erişim denetimi (IAM) sayfasında Rol atamaları sekmesini seçin.

  4. Üst menüden + Ekle'yi seçin ve ardından açılan menüden Rol ataması ekle'yi seçin.

    A screenshot showing how to assign a role in Azure portal.

  5. Sonuçları istenen role göre filtrelemek için arama kutusunu kullanın. Bu örnek için Key Vault Şifreleme Yetkilisi'ni arayın ve eşleşen sonucu seçin ve ardından İleri'yi seçin.

  6. Erişim ata'nın altında Kullanıcı, grup veya hizmet sorumlusu'na tıklayın ve ardından + Üye seç'e tıklayın.

  7. İletişim kutusunda Microsoft Entra kullanıcı adınızı (genellikle user@domain e-posta adresiniz) arayın ve iletişim kutusunun alt kısmındaki Seç'i seçin.

  8. Son sayfaya gitmek için Gözden geçir + ata'yı seçin ve ardından işlemi tamamlamak için Gözden geçir + yeniden ata'yı seçin.

Projenizi ayarlama

  1. Konsol penceresinde (PowerShell veya Bash gibi) komutunu kullanarak dotnet new BlobEncryptionKeyVault adlı yeni bir konsol uygulaması oluşturun. Bu komut, tek bir kaynak dosyası olan basit bir "Merhaba Dünya" C# projesi oluşturur: Program.cs.

    dotnet new console -n BlobEncryptionKeyVault
    
  2. Yeni oluşturulan BlobEncryptionKeyVault dizinine geçin.

    cd BlobEncryptionKeyVault
    
  3. Projeyi istediğiniz kod düzenleyicisinde açın. Projeyi şu şekilde açmak için:

    • Visual Studio'da dosyayı bulun ve çift tıklayın BlobEncryptionKeyVault.csproj .
    • Visual Studio Code, aşağıdaki komutu çalıştırın:
    code .
    

Bu örnekteKi Azure hizmetleriyle etkileşim kurmak için kullanarak dotnet add packageaşağıdaki istemci kitaplıklarını yükleyin.

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Keys
dotnet add package Azure.Storage.Blobs

Aşağıdaki using yönergeleri ekleyin ve projeye bir başvuru System.Configuration eklediğinizden emin olun.

using Azure;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Keys;
using Azure.Security.KeyVault.Keys.Cryptography;
using Azure.Storage;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;

Ortam değişkenini ayarlama

Bu uygulama, anahtar kasanızın adını almak için adlı KEY_VAULT_NAME bir ortam değişkeni arar. Ortam değişkenini ayarlamak için bir konsol penceresi açın ve işletim sisteminizin yönergelerini izleyin. değerini anahtar kasanızın adıyla değiştirin <your-key-vault-name> .

Windows:

Windows için ortam değişkenlerini komut satırından ayarlayabilirsiniz. Ancak, bu yaklaşımı kullanırken değerler o işletim sisteminde çalışan tüm uygulamalar tarafından erişilebilir ve dikkatli değilseniz çakışmalara neden olabilir. Ortam değişkenleri kullanıcı veya sistem düzeyinde ayarlanabilir:

setx KEY_VAULT_NAME "<your-key-vault-name>"

Windows'da ortam değişkenini ekledikten sonra komut penceresinin yeni bir örneğini başlatmanız gerekir. Windows üzerinde Visual Studio kullanıyorsanız, değişikliğin algılanması için ortam değişkenini oluşturduktan sonra Visual Studio'yu yeniden başlatmanız gerekebilir.

Linux:

export KEY_VAULT_NAME=<your-key-vault-name>

Azure Key Vault'ta anahtar ekleme

Bu örnekte bir anahtar oluşturup Azure Key Vault istemci kitaplığını kullanarak anahtar kasasına ekleyeceğiz. Ayrıca Azure CLI, Azure portalı veya PowerShell kullanarak anahtar kasası oluşturabilir ve anahtar kasasına ekleyebilirsiniz.

Aşağıdaki örnekte, belirtilen kasa için bir KeyClient nesnesi oluşturacağız. Nesne KeyClient daha sonra belirtilen kasada yeni bir RSA anahtarı oluşturmak için kullanılır.

var keyName = "testRSAKey";
var keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");

// URI for the key vault resource
var keyVaultUri = $"https://{keyVaultName}.vault.azure.net";

TokenCredential tokenCredential = new DefaultAzureCredential();

// Create a KeyClient object
var keyClient = new KeyClient(new Uri(keyVaultUri), tokenCredential);

// Add a key to the key vault
var key = await keyClient.CreateKeyAsync(keyName, KeyType.Rsa);

Anahtar ve anahtar çözümleyici örnekleri oluşturma

Ardından, şifreleme istemcisini ve anahtar çözümleyici örneklerini oluşturmak için kasaya yeni eklediğimiz anahtarı kullanacağız. CryptographyClient, IKeyEncryptionKey uygular ve Azure Key Vault'ta depolanan anahtarlarla şifreleme işlemleri gerçekleştirmek için kullanılır. KeyResolver, IKeyEncryptionResolver uygular ve anahtar tanımlayıcısından anahtar şifreleme anahtarlarını alır ve anahtarı çözümler.

// Cryptography client and key resolver instances using Azure Key Vault client library
CryptographyClient cryptoClient = keyClient.GetCryptographyClient(key.Value.Name, key.Value.Properties.Version);
KeyResolver keyResolver = new (tokenCredential);

Kasada şifrelemek istediğiniz bir anahtarınız varsa URI'yi geçirerek anahtar ve anahtar çözümleyici örneklerini oluşturabilirsiniz:

var keyVaultKeyUri = $"https://{keyVaultName}.vault.azure.net/keys/{keyName}";
CryptographyClient cryptoClient = new CryptographyClient(new Uri(keyVaultKeyUri), tokenCredential);

Şifreleme seçeneklerini yapılandırma

Şimdi blob yükleme ve indirme için kullanılacak şifreleme seçeneklerini yapılandırmamız gerekiyor. İstemci tarafı şifrelemesini kullanmak için önce bir ClientSideEncryptionOptions nesnesi oluşturup ile SpecializedBlobClientOptionsistemci oluşturmada ayarlayacağız.

ClientSideEncryptionOptions sınıfı, istemci tarafı şifreleme kullanarak Blob Depolama bağlanmak için istemci yapılandırma seçeneklerini sağlar. KeyEncryptionKey , karşıya yükleme işlemleri için gereklidir ve oluşturulan içerik şifreleme anahtarını sarmak için kullanılır. İndirme işlemleri için KeyResolver gereklidir ve indirilen içerik şifreleme anahtarını açmak için doğru anahtar şifreleme anahtarını getirir. Karşıya yüklemeler için KeyWrapAlgorithm gereklidir ve içerik şifreleme anahtarı sarmalanırken kullanılacak algoritma tanımlayıcısını belirtir.

Önemli

Sürüm 1'deki bir güvenlik açığı nedeniyle, sürüm parametresi için kullanarak ClientSideEncryptionVersion.V2_0 nesnesinin ClientSideEncryptionOptions oluşturması önerilir. Uygulamalarınızdaki güvenlik açığını azaltma hakkında daha fazla bilgi edinmek için bkz . Uygulamalarınızdaki güvenlik açığını azaltma. 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.

// Configure the encryption options to be used for upload and download
ClientSideEncryptionOptions encryptionOptions = new (ClientSideEncryptionVersion.V2_0)
{
    KeyEncryptionKey = cryptoClient,
    KeyResolver = keyResolver,
    // String value that the client library will use when calling IKeyEncryptionKey.WrapKey()
    KeyWrapAlgorithm = "RSA-OAEP"
};

// Set the encryption options on the client options.
BlobClientOptions options = new SpecializedBlobClientOptions() { ClientSideEncryption = encryptionOptions };

İstemci nesnesini istemci tarafı şifreleme kullanacak şekilde yapılandırma

Bu örnekte, istemci tarafı şifreleme yapılandırma seçeneklerini bir BlobServiceClient nesneye uygularız. Hizmet istemcisi düzeyinde uygulandığında, bu şifreleme seçenekleri hizmet istemcisinden kapsayıcı istemcilerine ve kapsayıcı istemcilerinden blob istemcilerine geçirilir. BlobClient Nesne bir karşıya yükleme veya indirme işlemi gerçekleştirdiğinde, Azure Blob Depolama istemci kitaplıkları istemci tarafındaki blobları şifrelemek ve şifresini çözmek için zarf şifrelemesi kullanır. Zarf şifrelemesi bir anahtarı bir veya daha fazla ek anahtarla şifreler.

// Create a blob client with client-side encryption enabled.
// 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.
Uri blobUri = new (string.Format($"https://{accountName}.blob.core.windows.net"));
BlobClient blob = new BlobServiceClient(blobUri, tokenCredential, options).GetBlobContainerClient("test-container").GetBlobClient("testBlob");

Blobu şifreleme ve karşıya yükleme

BlobClient Nesne bir karşıya yükleme yöntemini çağırdığında, istemci tarafı şifrelemesini gerçekleştirmek için birkaç adım gerçekleşir:

  1. Azure Depolama istemci kitaplığı, 16 baytlık rastgele bir başlatma vektör (IV) ve 32 baytlık rastgele içerik şifreleme anahtarı (CEK) oluşturur ve bu bilgileri kullanarak blob verilerinin zarf şifrelemesini gerçekleştirir.
  2. Blob verileri CEK kullanılarak şifrelenir.
  3. CEK daha sonra içinde belirttiğimiz ClientSideEncryptionOptionsanahtar şifreleme anahtarı (KEK) kullanılarak sarmalanır (şifrelenir). Bu örnekte KEK, belirtilen Azure Key Vault kaynağında depolanan asimetrik bir anahtar çiftidir. Blob istemcisinin keke hiçbir zaman erişimi yoktur, yalnızca Key Vault tarafından sağlanan anahtar sarmalama algoritmasını çağırır.
  4. Şifrelenmiş blob verileri daha sonra depolama hesabına yüklenir.

Blobu şifrelemek ve Azure depolama hesabınıza yüklemek için aşağıdaki kodu ekleyin:

// Upload the encrypted contents to the blob
Stream blobContent = BinaryData.FromString("Ready for encryption, Captain.").ToStream();
await blob.UploadAsync(blobContent);

Blob karşıya yüklendikten sonra, şifreleme meta verileriyle birlikte şifrelenmiş içerikleri görmek için blobu depolama hesabınızda görüntüleyebilirsiniz.

Blob ve indirmenin şifresini çözme

Azure Depolama istemci kitaplığı, kullanıcının KEK'yi yerel olarak veya bir anahtar kasasında yönettiğini varsayar. Kullanıcının şifreleme için kullanılan belirli anahtarı bilmesi gerekmez. blob verileri indirildiğinde ve şifresi çözildiğinde anahtar tanımlayıcılarını çözümlemek için içinde belirtilen ClientSideEncryptionOptions anahtar çözümleyici kullanılır.

BlobClient Nesne bir indirme yöntemini çağırdığında şifrelenmiş blob verilerinin şifresini çözmek için birkaç adım gerçekleşir:

  1. İstemci kitaplığı, şifreleme meta verileri de dahil olmak üzere şifrelenmiş blob verilerini depolama hesabından indirir.
  2. 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 içinde ClientSideEncryptionOptionsbelirtilen anahtar açma algoritmasını çağırır. Bu RSA anahtar çiftinin özel anahtarı anahtar kasasında kalır, bu nedenle CEK'yi içeren blob meta verilerinden şifrelenmiş anahtar şifre çözme için anahtar kasasına gönderilir.
  3. İstemci kitaplığı şifrelenmiş blob verilerinin şifresini çözmek için CEK kullanır.

Daha önce karşıya yüklediğiniz blobu indirmek ve şifresini çözmek için aşağıdaki kodu ekleyin.

// Download and decrypt the encrypted contents from the blob
Response<BlobDownloadInfo>  response = await blob.DownloadAsync();
BlobDownloadInfo downloadInfo = response.Value;
Console.WriteLine((await BinaryData.FromStreamAsync(downloadInfo.Content)).ToString());

Sonraki adımlar

Bu öğreticide blob yükleme ve indirme işlemleri için istemci tarafı şifreleme gerçekleştirmek üzere .NET istemci kitaplıklarını kullanmayı öğrendiniz.

Şifrelenmiş verileri sürüm 2'ye geçirme yönergeleri de dahil olmak üzere bloblar için istemci tarafı şifrelemesine genel bir genel bakış için bkz . Bloblar için istemci tarafı şifreleme.

Azure Key Vault hakkında daha fazla bilgi için bkz. Azure Key Vault'a genel bakış sayfası