ASP.NET Core'da anahtar yönetimi

Veri koruma sistemi, yükleri korumak ve korumasını silmek için kullanılan ana anahtarların ömrünü otomatik olarak yönetir. Her anahtar dört aşamadan birinde bulunabilir:

  • Oluşturuldu - anahtar, anahtar halkasında var ancak henüz etkinleştirilmedi. Anahtarın bu anahtar kademesini kullanan tüm makinelere yayılma şansı olduğu yeterli süre dolana kadar anahtarın yeni Koruma işlemleri için kullanılmaması gerekir.

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

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

  • İptal edilmiş - anahtarın güvenliği aşıldı ve yeni Koruma işlemleri için kullanılmamalıdır.

Oluşturulan, etkin ve süresi dolmuş anahtarların tümü gelen yüklerin korumasını silmek için kullanılabilir. Varsayılan olarak iptal edilen anahtarlar yüklerin korumasını kaldırma amacıyla kullanılamayabilir, ancak gerekirse uygulama geliştiricisi bu davranışı geçersiz kılabilir.

Uyarı

Geliştirici anahtar halkasından bir anahtarı silmek isteyebilir (örneğin, ilgili dosyayı dosya sisteminden silerek). Bu noktada anahtar tarafından korunan tüm veriler kalıcı olarak çözülemez ve iptal edilen anahtarlar gibi acil durum geçersiz kılması yoktur. Anahtarın silinmesi 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 kullanıma sunmaz.

Varsayılan anahtar seçimi

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

Genel buluşsal, veri koruma sisteminin anahtarı varsayılan anahtar olarak en son etkinleştirme tarihiyle seçmesidir. (Sunucudan sunucuya saat dengesizliği için küçük bir fudge faktörü vardır.) Anahtarın süresi dolduysa veya iptal edilmişse ve uygulama otomatik anahtar oluşturmayı devre dışı bırakmazsa, aşağıdaki anahtar süre sonu ve sıralı 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şturmasının nedeni, yeni anahtar oluşturma işleminin yeni anahtardan önce etkinleştirilen tüm anahtarların örtük bir süre sonu olarak ele alınmasıdır. Genel fikir, yeni anahtarların eski anahtarlardan farklı algoritmalarla veya bekleyen şifreleme mekanizmalarıyla yapılandırılmış olabileceği ve sistemin geri dönmek yerine geçerli yapılandırmayı tercih etmesi gerektiğidir.

Bir istisna var. Uygulama geliştiricisi otomatik anahtar oluşturmayı devre dışı bırakmışsa, veri koruma sisteminin varsayılan anahtar olarak bir şey seçmesi gerekir. Bu geri dönüş senaryosunda sistem, kümedeki diğer makinelere yayılma zamanı olan anahtarlara tercih edilen en son etkinleştirme tarihine sahip iptal edilmemiş anahtarı seçer. Geri dönüş sistemi, sonuç olarak süresi dolmuş bir varsayılan anahtar seçmeye başlayabilir. Geri dönüş sistemi hiçbir zaman varsayılan anahtar olarak iptal edilmiş bir anahtar seçmez ve anahtar halkası boşsa veya her anahtar iptal edilmişse, sistem başlatma sonrasında bir hata oluşturur.

Anahtar süre sonu ve sıralı

Bir anahtar oluşturulduğunda, otomatik olarak { now + 2 days } etkinleştirme tarihi ve { now + 90 days } son kullanma tarihi verilir. Etkinleştirmeden önceki 2 günlük gecikme, anahtara sisteme yayılma süresi verir. Başka bir deyişle, yedekleme deposuna işaret eden diğer uygulamaların bir sonraki otomatik yenileme döneminde anahtarı gözlemlemesini sağlar, böylece anahtar halkası etkin olduğunda anahtarı kullanması gerekebilecek tüm uygulamalara yayılma olasılığını en üst düzeye çıkarır.

Varsayılan anahtarın süresi 2 gün içinde dolacaksa ve anahtar kademesinde varsayılan anahtarın süresi dolduğunda etkin olacak bir anahtar yoksa, veri koruma sistemi otomatik olarak anahtar halkasına yeni bir anahtar kalıcı hale getirilir. Bu yeni anahtarın etkinleştirme tarihi { varsayılan anahtarın son kullanma tarihi } ve son kullanma tarihi { şimdi + 90 gün } olur. Bu, sistemin hizmet kesintisi olmadan anahtarları düzenli aralıklarla otomatik olarak almasına olanak tanır.

Anında etkinleştirme ile anahtarın oluşturulacağı durumlar olabilir. Bir örnek, uygulamanın bir süredir çalışmadığı ve anahtar kademesindeki tüm anahtarların süresinin dolması 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));

Yönetici, varsayılan sistem genelindeki varsayılan ilkeyi de değiştirebilir, ancak açıkça yapılan bir çağrı SetDefaultKeyLifetime , sistem genelindeki tüm ilkeleri geçersiz kılar. Varsayılan anahtar ömrü 7 günden kısa olamaz.

Otomatik anahtar halkası yenileme

Veri koruma sistemi başlatıldığında, temel alınan depodan anahtar halkasını okur ve bellekte önbelleğe alır. Bu önbellek, Koruma ve Korumayı Kaldır işlemlerinin yedekleme deposuna çarpmadan devam etmesini sağlar. Sistem, yaklaşık her 24 saatte bir veya geçerli varsayılan anahtarın süresi dolduğunda (hangisi önce gerçekleşirse) yedekleme deposunun değişikliklerini otomatik olarak denetler.

Uyarı

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

Veri koruma sistemi, anahtar halkasını incelemek ve değişiklik yapmak için kullanılabilecek bir arabirim IKeyManager sunar. örneğini IDataProtectionProvider sağlayan DI sistemi, kullanımınız için bir örneği IKeyManager de sağlayabilir. Alternatif olarak, aşağıdaki örnekte olduğu gibi doğrudan öğesini IServiceProvider çekebilirsinizIKeyManager.

Anahtar halkasını değiştiren herhangi bir işlem (açıkça yeni bir anahtar oluşturma veya iptal etme) bellek içi önbelleği geçersiz kılacak. Sonraki veya çağrısı ProtectUnprotect , veri koruma sisteminin anahtar halkasını yeniden okumasına ve önbelleği yeniden oluşturmasına neden olur.

Aşağıdaki örnekte, mevcut anahtarları iptal etme ve el ile yeni bir anahtar oluşturma da dahil olmak üzere anahtar halkasını incelemek ve işlemek için arabirimin kullanılması IKeyManager gösterilmektedir.

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
 */

Kod açıklamalarının İngilizce dışındaki dillere çevirisini görmek isterseniz, bunu bu GitHub tartışma konusunda bize bildirin.

Anahtar depolama

Veri koruma sistemi, uygun bir anahtar depolama konumu ve bekleyen şifreleme mekanizmasını otomatik olarak ortaya çıkarma girişiminde bulunduğu bir buluşsal sisteme sahiptir. Anahtar kalıcılık mekanizması, uygulama geliştiricisi tarafından da yapılandırılabilir. Aşağıdaki belgelerde, bu mekanizmaların yerleşik uygulamaları ele alınıyor: