Manajemen kunci di ASP.NET Core
Sistem perlindungan data secara otomatis mengelola masa pakai kunci master yang digunakan untuk melindungi dan membatalkan perlindungan payload. Setiap kunci dapat ada dalam salah satu dari empat tahap:
Dibuat - kunci ada di cincin kunci tetapi belum diaktifkan. Kunci tidak boleh digunakan untuk operasi Lindungi baru sampai waktu yang memadai telah berlalu bahwa kunci telah memiliki kesempatan untuk menyebar ke semua mesin yang menggunakan cincin kunci ini.
Aktif - kunci ada di cincin kunci dan harus digunakan untuk semua operasi Lindungi baru.
Kedaluwarsa - kunci telah menjalankan masa pakai alaminya dan tidak boleh lagi digunakan untuk operasi Lindungi baru.
Dicabut - kunci disusupi dan tidak boleh digunakan untuk operasi Lindungi baru.
Kunci yang dibuat, aktif, dan kedaluwarsa semuanya dapat digunakan untuk membuka proteksi payload masuk. Kunci yang dicabut secara default mungkin tidak digunakan untuk membatalkan perlindungan payload, tetapi pengembang aplikasi dapat mengambil alih perilaku ini jika perlu.
Peringatan
Pengembang mungkin tergoda untuk menghapus kunci dari cincin kunci (misalnya dengan menghapus file yang sesuai dari sistem file). Pada saat itu, semua data yang dilindungi oleh kunci secara permanen tidak dapat didefinisikan, dan tidak ada penimpaan darurat seperti ada kunci yang dicabut. Menghapus kunci adalah perilaku yang benar-benar merusak.
Pilihan kunci default
Ketika sistem perlindungan data membaca cincin kunci dari repositori cadangan, sistem akan mencoba menemukan kunci "default" dari cincin kunci. Kunci default digunakan untuk operasi Lindungi baru.
Heuristik umum adalah bahwa sistem perlindungan data memilih kunci dengan tanggal aktivasi terbaru sebagai kunci default. (Ada faktor fudge kecil untuk memungkinkan ke condong jam server-ke-server.) Jika kunci kedaluwarsa atau dicabut, dan jika aplikasi belum menonaktifkan pembuatan kunci otomatis, maka kunci baru akan dibuat dengan aktivasi segera per kedaluwarsa kunci dan kebijakan bergulir di bawah ini.
Alasan sistem perlindungan data menghasilkan kunci baru segera daripada kembali ke kunci yang berbeda adalah bahwa pembuatan kunci baru harus diperlakukan sebagai kedaluwarsa implisit dari semua kunci yang diaktifkan sebelum kunci baru. Ide umumnya adalah bahwa kunci baru mungkin telah dikonfigurasirest dengan algoritma atau mekanisme enkripsi yang berbeda dari kunci lama, dan sistem harus lebih memilih konfigurasi saat ini daripada mundur.
Ada pengecualian. Jika pengembang aplikasi telah menonaktifkan pembuatan kunci otomatis, maka sistem perlindungan data harus memilih sesuatu sebagai kunci default. Dalam skenario fallback ini, sistem akan memilih kunci yang tidak dicabut dengan tanggal aktivasi terbaru, dengan preferensi yang diberikan kepada kunci yang memiliki waktu untuk menyebar ke komputer lain dalam kluster. Sistem fallback mungkin akhirnya memilih kunci default yang kedaluwarsa sebagai hasilnya. Sistem fallback tidak akan pernah memilih kunci yang dicabut sebagai kunci default, dan jika cincin kunci kosong atau setiap kunci telah dicabut maka sistem akan menghasilkan kesalahan setelah inisialisasi.
Kedaluwarsa dan bergulir kunci
Saat kunci dibuat, kunci secara otomatis diberi tanggal aktivasi { now + 2 days } dan tanggal kedaluwarsa { now + 90 days }. Penundaan 2 hari sebelum aktivasi memberikan waktu kunci untuk disebarluaskan melalui sistem. Artinya, ini memungkinkan aplikasi lain yang menunjuk ke penyimpanan backing untuk mengamati kunci pada periode refresh otomatis berikutnya, sehingga memaksimalkan kemungkinan bahwa ketika cincin kunci menjadi aktif, itu telah disebarkan ke semua aplikasi yang mungkin perlu menggunakannya.
Jika kunci default akan kedaluwarsa dalam waktu 2 hari dan jika cincin kunci belum memiliki kunci yang akan aktif setelah kedaluwarsa kunci default, maka sistem perlindungan data akan secara otomatis mempertahankan kunci baru ke cincin kunci. Kunci baru ini memiliki tanggal aktivasi { tanggal kedaluwarsa kunci default } dan tanggal kedaluwarsa { sekarang + 90 hari }. Ini memungkinkan sistem untuk secara otomatis menggulung kunci secara teratur tanpa gangguan layanan.
Mungkin ada keadaan di mana kunci akan dibuat dengan aktivasi segera. Salah satu contohnya adalah ketika aplikasi belum berjalan selama satu waktu dan semua kunci dalam cincin kunci kedaluwarsa. Ketika ini terjadi, kunci diberikan tanggal aktivasi { now } tanpa penundaan aktivasi normal 2 hari.
Masa pakai kunci default adalah 90 hari, meskipun ini dapat dikonfigurasi seperti dalam contoh berikut.
services.AddDataProtection()
// use 14-day lifetime instead of 90-day lifetime
.SetDefaultKeyLifetime(TimeSpan.FromDays(14));
Administrator juga dapat mengubah seluruh sistem default, meskipun panggilan eksplisit untuk SetDefaultKeyLifetime
akan mengambil alih kebijakan di seluruh sistem. Masa pakai kunci default tidak boleh lebih pendek dari 7 hari.
Refresh cincin kunci otomatis
Ketika sistem perlindungan data diinisialisasi, sistem ini membaca cincin kunci dari repositori yang mendasar dan menyimpannya dalam memori. Cache ini memungkinkan operasi Lindungi dan Buka proteksi untuk melanjutkan tanpa mencapai penyimpanan backing. Sistem akan secara otomatis memeriksa penyimpanan pendukung untuk perubahan kira-kira setiap 24 jam atau ketika kunci default saat ini kedaluwarsa, mana yang lebih dulu.
Peringatan
Pengembang harus sangat jarang (jika pernah) perlu menggunakan API manajemen kunci secara langsung. Sistem perlindungan data akan melakukan manajemen kunci otomatis seperti yang dijelaskan di atas.
Sistem perlindungan data mengekspos antarmuka IKeyManager
yang dapat digunakan untuk memeriksa dan membuat perubahan pada cincin kunci. Sistem DI yang menyediakan instans IDataProtectionProvider
juga dapat memberikan instans IKeyManager
untuk konsumsi Anda. Atau, Anda dapat menarik langsung IKeyManager
dari IServiceProvider
seperti dalam contoh di bawah ini.
Setiap operasi yang memodifikasi cincin kunci (membuat kunci baru secara eksplisit atau melakukan pencabutan) akan membatalkan cache dalam memori. Panggilan berikutnya ke Protect
atau Unprotect
akan menyebabkan sistem perlindungan data membaca ulang cincin kunci dan membuat ulang cache.
Sampel di bawah ini menunjukkan penggunaan IKeyManager
antarmuka untuk memeriksa dan memanipulasi cincin kunci, termasuk mencabut kunci yang ada dan menghasilkan kunci baru secara manual.
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
*/
Jika Anda ingin melihat komentar kode yang diterjemahkan ke bahasa selain bahasa Inggris, beri tahu kami dalam masalah diskusi GitHub ini.
Penyimpanan kunci
Sistem perlindungan data memiliki heuristik di mana ia mencoba untuk menyimpulkan lokasi penyimpanan kunci yang sesuai dan mekanisme enkripsi-pada-secararest otomatis. Mekanisme persistensi kunci juga dapat dikonfigurasi oleh pengembang aplikasi. Dokumen berikut membahas implementasi dalam kotak mekanisme ini:
ASP.NET Core