ASP.NET Core'da anahtar yönetimi

Veri koruma sistemi, yüklerini korumak ve korumasını geri yüklemek için kullanılan ana anahtarların ömrünü otomatik olarak yönetir. Her anahtar dört aşamadan biri olabilir:

  • Oluşturuldu - anahtar anahtar halkası içinde mevcut ancak henüz etkinleştirilmemiş. Anahtarın, anahtarın bu anahtar halkayı tüketen tüm makinelere yayma şansı olduğu yeterli zaman geçene kadar yeni Koruma işlemleri için kullanılmaması gerekir.

  • Etkin - anahtar anahtar halkası içinde mevcuttur ve tüm yeni Koruma işlemleri için kullanılmalıdır.

  • Süresi Doldu - anahtar doğal ömrünü çalıştırdı ve artık yeni Koruma işlemleri için kullanılmamalı.

  • İptal edildi - anahtarın güvenliği tehlikeye girer ve yeni Koruma işlemleri için kullanılmamaları gerekir.

Oluşturulan, etkin ve süresi dolmuş anahtarların hepsi gelen yüklerin korumasını geri yüklemek için kullanılabilir. Varsayılan olarak iptal edilen anahtarlar, yük korumasını geri yüklemek için kullanılamaz, ancak gerekirse uygulama geliştiricisi bu davranışı geçersiz kabilirsiniz.

Uyarı

Geliştirici, anahtar halkası üzerinden (örneğin, ilgili dosyayı dosya sisteminden silerek) bir anahtarı silmek istiyor olabilir. Bu noktada, anahtarla korunan tüm veriler kalıcı olarak şifre edilemez ve iptal edilmiş anahtarlarla olduğu gibi acil durum geçersiz kılma yoktur. Anahtarı silmek gerçekten yıkıcı bir davranıştır ve sonuç olarak veri koruma sistemi bu işlemi gerçekleştirmek için birinci sınıf API'yi ortaya çıkarmaz.

Varsayılan anahtar seçimi

Veri koruma sistemi, anahtar halkasını backing deposundan okuduğunda, anahtar halkası'nın "varsayılan" anahtarını bulmaya çalışacak. Yeni Koruma işlemleri için varsayılan anahtar kullanılır.

Genel yöntemi, veri koruma sisteminin varsayılan anahtar olarak en son etkinleştirme tarihine sahip anahtarı seçmesidir. (Sunucudan sunucuya saat eğriltmesine olanak sağlayan küçük bir fudge faktörü vardır.) Anahtarın süresi dolduğunda veya iptal edildiyseniz ve uygulama otomatik anahtar oluşturma özelliğini devre dışı bırakmıyorsa, aşağıdaki anahtar süre sonu ve kayan ilke başına anında etkinleştirme ile yeni bir anahtar oluşturulur.

Veri koruma sisteminin farklı bir anahtara geri dönmek yerine hemen yeni bir anahtar oluşturmanın nedeni, yeni anahtar oluşturmanın yeni anahtardan önce etkinleştirilen tüm anahtarların örtülü bir süre sonu olarak kabul edilmiş olmasıdır. Genel fikir, yeni anahtarların eski anahtarlardan farklı algoritmalar veya beklemede şifreleme mekanizmalarıyla yapılandırılmış olması ve sistemin geri dönmek yerine geçerli yapılandırmayı tercih ettiğidir.

Bir özel durum vardır. Uygulama geliştiricisi otomatik anahtar oluşturma özelliğini devre dışıbırakarak veri koruma sisteminin varsayılan anahtar olarak bir şey seçmesi gerekir. Bu geri dönüş senaryosunda sistem, en son etkinleştirme tarihine sahip iptal edilmemiş anahtarı seçecek ve tercih, kümede diğer makinelere yayma zamanı olan anahtarlara verilecek. Sonuç olarak geri dönüş sistemi süresi dolmuş bir varsayılan anahtar seçebilir. Geri dönüş sistemi, varsayılan anahtar olarak hiçbir zaman iptal edilen anahtarı seçmez ve anahtar halkası boşsa veya her anahtar iptal edildi ise, sistem başlatma sonrasında bir hata üretir.

Anahtar süre sonu ve devam ediyor

Bir anahtar oluşturulduğunda, otomatik olarak etkinleştirme tarihi { now + 2 days } ve son kullanma tarihi { now + 90 days } olarak verilir. Etkinleştirmeden önceki 2 günlük gecikme, anahtara sistemden yayılması için zaman verir. Başka bir ifadeyle, diğer uygulamaların destek deposuna işaret eden diğer uygulamaların anahtarı bir sonraki otomatik yenileme döneminde gözlemleyerek anahtar halkası etkin hale geldiğinde onu kullanması gerektirilen tüm uygulamalara yayılma ihtimalini en üst düzeye çıkarmalarına olanak sağlar.

Varsayılan anahtarın süresi 2 gün içinde dolacaksa ve anahtar halkası varsayılan anahtarın sona erdiğinde etkin olacak bir anahtarı yoksa, veri koruma sistemi otomatik olarak anahtar halkası için yeni bir anahtar kalıcı olur. Bu yeni anahtarın etkinleştirme tarihi { varsayılan anahtarın sona erme tarihi } ve son kullanma tarihi { şimdi + 90 gün } olur. Bu, sistemin hizmet kesintisi olmadan anahtarları düzenli aralıklarla otomatik olarak almalarına olanak sağlar.

Bir anahtarın anında etkinleştirme ile oluşturulacak durumlar olabilir. Uygulamanın bir süredir çalışmamış olması ve anahtar halkası içinde tüm anahtarların süresinin dolması buna bir örnek olabilir. Bu durumda, anahtara normal 2 günlük etkinleştirme gecikmesi olmadan { now } etkinleştirme tarihi verilir.

Varsayılan anahtar ömrü 90 gündür, ancak bu, aşağıdaki örnekte olduğu gibi yapılandırılabilir.

services.AddDataProtection()
       // use 14-day lifetime instead of 90-day lifetime
       .SetDefaultKeyLifetime(TimeSpan.FromDays(14));

Bir yönetici varsayılan sistem genelinde de değiştirebilir, ancak açık bir çağrısı herhangi bir sistem SetDefaultKeyLifetime genelindeki ilkeyi geçersiz kılar. Varsayılan anahtar ömrü 7 günden kısa olamaz.

Otomatik anahtar halkası yenileme

Veri koruma sistemi başlatılırken, temel alınan depodan anahtar halkasını okur ve bellekte önbelleğe kullanır. Bu önbellek, Koruma ve Korumayı GeriDan Korumasız işlemlerinin, destek deposuna isabet etmeden devamsını sağlar. Sistem, yaklaşık 24 saatte bir veya geçerli varsayılan anahtarın süresi dolduğunda (hangisi önce geliyorsa) değişiklikleri otomatik olarak arka depoya kontrol eder.

Uyarı

Geliştiricilerin anahtar yönetimi API'lerini doğrudan kullanmaları çok nadirdir (varsa). Veri koruma sistemi, yukarıda açıklandığı gibi otomatik anahtar yönetimi gerçekleştirecek.

Veri koruma sistemi, anahtar halkasını IKeyManager incelemek ve üzerinde değişiklik yapmak için kullanılmaktadır. örneğini sağlayan DI sistemi, IDataProtectionProvider tüketiminiz için bir örneği IKeyManager de sağlar. Alternatif olarak, aşağıdaki örnekte IKeyManager olduğu gibi IServiceProvider doğrudan 'den çekebilirsiniz.

Anahtar halkasını değiştiren herhangi bir işlem (açıkça yeni anahtar oluşturma veya iptal gerçekleştirme) bellek içinde önbelleği geçersiz hale gelecektir. veya çağrısı, Protect veri koruma sisteminin anahtar halkasını yeniden okumasını ve önbelleği yeniden Unprotect oluşturulmasını sağlar.

Aşağıdaki örnekte, mevcut anahtarları iptal etmek ve el ile yeni bir anahtar oluşturmak da dahil olmak üzere anahtar halkalarını incelemek ve işlemek için IKeyManager arabiriminin kullanımı gösterilmiştir.

using System;
using System.IO;
using System.Threading;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.Extensions.DependencyInjection;

public class Program
{
    public static void Main(string[] args)
    {
        var serviceCollection = new ServiceCollection();
        serviceCollection.AddDataProtection()
            // point at a specific folder and use DPAPI to encrypt keys
            .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp-keys"))
            .ProtectKeysWithDpapi();
        var services = serviceCollection.BuildServiceProvider();

        // perform a protect operation to force the system to put at least
        // one key in the key ring
        services.GetDataProtector("Sample.KeyManager.v1").Protect("payload");
        Console.WriteLine("Performed a protect operation.");
        Thread.Sleep(2000);

        // get a reference to the key manager
        var keyManager = services.GetService<IKeyManager>();

        // list all keys in the key ring
        var allKeys = keyManager.GetAllKeys();
        Console.WriteLine($"The key ring contains {allKeys.Count} key(s).");
        foreach (var key in allKeys)
        {
            Console.WriteLine($"Key {key.KeyId:B}: Created = {key.CreationDate:u}, IsRevoked = {key.IsRevoked}");
        }

        // revoke all keys in the key ring
        keyManager.RevokeAllKeys(DateTimeOffset.Now, reason: "Revocation reason here.");
        Console.WriteLine("Revoked all existing keys.");

        // add a new key to the key ring with immediate activation and a 1-month expiration
        keyManager.CreateNewKey(
            activationDate: DateTimeOffset.Now,
            expirationDate: DateTimeOffset.Now.AddMonths(1));
        Console.WriteLine("Added a new key.");

        // list all keys in the key ring
        allKeys = keyManager.GetAllKeys();
        Console.WriteLine($"The key ring contains {allKeys.Count} key(s).");
        foreach (var key in allKeys)
        {
            Console.WriteLine($"Key {key.KeyId:B}: Created = {key.CreationDate:u}, IsRevoked = {key.IsRevoked}");
        }
    }
}

/*
 * SAMPLE OUTPUT
 *
 * Performed a protect operation.
 * The key ring contains 1 key(s).
 * Key {1b948618-be1f-440b-b204-64ff5a152552}: Created = 2015-03-18 22:20:49Z, IsRevoked = False
 * Revoked all existing keys.
 * Added a new key.
 * The key ring contains 2 key(s).
 * Key {1b948618-be1f-440b-b204-64ff5a152552}: Created = 2015-03-18 22:20:49Z, IsRevoked = True
 * Key {2266fc40-e2fb-48c6-8ce2-5fde6b1493f7}: Created = 2015-03-18 22:20:51Z, IsRevoked = False
 */

Ingilizce dışındaki dillere çevrilmiş kod açıklamalarını görmek isterseniz, Bu GitHub tartışma sorununubize tanıyın.

Anahtar depolama

Veri koruma sistemi, uygun bir anahtar depolama konumunu ve bekleme sırasında şifreleme mekanizmasını otomatik olarak çözmeyi denemesi ile bir ürkücüye sahiptir. Anahtar kalıcılık mekanizması, uygulama geliştiricisi tarafından da yapılandırılabilir. Aşağıdaki belgelerde bu mekanizmaların in-box uygulamaları ele almaktadır: