Bagikan melalui


Manajemen dan masa pakai kunci Perlindungan Data di ASP.NET Core

Oleh Rick Anderson

Manajemen kunci

Aplikasi ini mencoba mendeteksi lingkungan operasionalnya dan menangani konfigurasi kunci sendiri.

  1. Jika aplikasi dihosting di Azure Apps, kunci dipertahankan ke folder %HOME%\ASP.NET\DataProtection-Keys. Folder ini didukung oleh penyimpanan jaringan dan disinkronkan di semua mesin yang menghosting aplikasi.

    • Kunci tidak dilindungi di rest.
    • Folder DataProtection-Keys menyediakan cincin kunci ke semua instans aplikasi dalam satu slot penyebaran.
    • Pisahkan slot penyebaran, seperti Pentahapan dan Produksi, jangan bagikan cincin kunci. Saat Anda bertukar antara slot penyebaran, misalnya menukar Penahapan ke Produksi atau menggunakan pengujian A/B, aplikasi apa pun yang menggunakan Perlindungan Data tidak akan dapat mendekripsi data yang disimpan menggunakan cincin kunci di dalam slot sebelumnya. Ini menyebabkan pengguna keluar dari aplikasi yang menggunakan autentikasi ASP.NET Core cookie standar, karena menggunakan Perlindungan Data untuk melindungi cookie-nya. Jika Anda menginginkan cincin kunci independen slot, gunakan penyedia cincin kunci eksternal, seperti Azure Blob Storage, Azure Key Vault, penyimpanan SQL, atau cache Redis.
  2. Jika profil pengguna tersedia, kunci dipertahankan ke folder %LOCALAPPDATA%\ASP.NET\DataProtection-Keys . Jika sistem operasi adalah Windows, kunci dienkripsi saat rest menggunakan DPAPI.

    Atribut setProfileEnvironment kelompok aplikasi juga harus diaktifkan. Nilai default setProfileEnvironment adalah true. Dalam beberapa skenario (misalnya, OS Windows), setProfileEnvironment diatur ke false. Jika kunci tidak disimpan di direktori profil pengguna seperti yang diharapkan:

    1. Buka folder %windir%/system32/inetsrv/config.
    2. Buka file applicationHost.config.
    3. Temukan <system.applicationHost><applicationPools><applicationPoolDefaults><processModel> elemennya.
    4. Konfirmasikan bahwa atribut setProfileEnvironment tidak ada, yang membuat nilai diatur ke default true, atau secara eksplisit mengatur nilai atribut ke true.
  3. Jika aplikasi dihosting di IIS, kunci dipertahankan ke registri HKLM dalam kunci registri khusus yang ACLed hanya ke akun proses pekerja. Kunci dienkripsi saat rest menggunakan DPAPI.

  4. Jika tidak ada kondisi ini yang cocok, kunci tidak bertahan di luar proses saat ini. Saat proses dimatikan, semua kunci yang dihasilkan akan hilang.

Pengembang selalu dalam kontrol penuh dan dapat mengambil alih bagaimana dan di mana kunci disimpan. Tiga opsi pertama di atas harus memberikan default yang baik untuk sebagian besar aplikasi yang mirip dengan cara kerja rutinitas pembuatan otomatis machineKey> ASP.NET <di masa lalu. Opsi mundur akhir adalah satu-satunya skenario yang mengharuskan pengembang menentukan konfigurasi di muka jika mereka menginginkan persistensi kunci, tetapi fallback ini hanya terjadi dalam situasi yang jarang terjadi.

Saat menghosting dalam kontainer Docker, kunci harus disimpan di folder yang merupakan volume Docker (volume bersama atau volume yang dipasang host yang bertahan di luar masa pakai kontainer) atau di penyedia eksternal, seperti Azure Key Vault atau Redis. Penyedia eksternal juga berguna dalam skenario farm web jika aplikasi tidak dapat mengakses volume jaringan bersama (lihat PersistKeysToFileSystem untuk informasi selengkapnya).

Peringatan

Jika pengembang mengambil alih aturan yang diuraikan di atas dan mengarahkan sistem Perlindungan Data pada repositori kunci tertentu, enkripsi otomatis kunci di dinonaktifkan rest . rest Perlindungan pada dapat diaktifkan kembali melalui konfigurasi.

Masa pakai kunci

Kunci memiliki masa pakai 90 hari secara default. Saat kunci kedaluwarsa, aplikasi secara otomatis menghasilkan kunci baru dan mengatur kunci baru sebagai kunci aktif. Selama kunci yang dihentikan tetap ada di sistem, aplikasi Anda dapat mendekripsi data apa pun yang dilindungi dengannya. Lihat manajemen kunci untuk informasi selengkapnya.

Algoritma default

Algoritma perlindungan payload default yang digunakan adalah AES-256-CBC untuk kerahasiaan dan HMACSHA256 untuk keaslian. Kunci master 512-bit, diubah setiap 90 hari, digunakan untuk memperoleh dua sub-kunci yang digunakan untuk algoritma ini berdasarkan per payload. Lihat derivasi subkunia untuk informasi selengkapnya.

Menghapus kunci

Menghapus kunci membuat data yang dilindungi tidak dapat diakses secara permanen. Untuk mengurangi risiko tersebut, sebaiknya jangan menghapus kunci. Akumulasi kunci yang dihasilkan umumnya memiliki dampak minimal karena kecil. Dalam kasus luar biasa, seperti layanan yang sangat berjalan lama, kunci dapat dihapus. Hanya hapus kunci:

  • Itu sudah lama (tidak lagi digunakan).
  • Ketika Anda dapat menerima risiko kehilangan data sebagai imbalan penghematan penyimpanan.

Sebaiknya jangan menghapus kunci perlindungan data.

using Microsoft.AspNetCore.DataProtection.KeyManagement;

var services = new ServiceCollection();
services.AddDataProtection();

var serviceProvider = services.BuildServiceProvider();

var keyManager = serviceProvider.GetService<IKeyManager>();

if (keyManager is IDeletableKeyManager deletableKeyManager)
{
    var utcNow = DateTimeOffset.UtcNow;
    var yearAgo = utcNow.AddYears(-1);

    if (!deletableKeyManager.DeleteKeys(key => key.ExpirationDate < yearAgo))
    {
        Console.WriteLine("Failed to delete keys.");
    }
    else
    {
        Console.WriteLine("Old keys deleted successfully.");
    }
}
else
{
    Console.WriteLine("Key manager does not support deletion.");
}

Sumber Daya Tambahan:

Manajemen kunci

Aplikasi ini mencoba mendeteksi lingkungan operasionalnya dan menangani konfigurasi kunci sendiri.

  1. Jika aplikasi dihosting di Azure Apps, kunci dipertahankan ke folder %HOME%\ASP.NET\DataProtection-Keys. Folder ini didukung oleh penyimpanan jaringan dan disinkronkan di semua mesin yang menghosting aplikasi.

    • Kunci tidak dilindungi di rest.
    • Folder DataProtection-Keys menyediakan cincin kunci ke semua instans aplikasi dalam satu slot penyebaran.
    • Pisahkan slot penyebaran, seperti Pentahapan dan Produksi, jangan bagikan cincin kunci. Saat Anda bertukar antara slot penyebaran, misalnya menukar Penahapan ke Produksi atau menggunakan pengujian A/B, aplikasi apa pun yang menggunakan Perlindungan Data tidak akan dapat mendekripsi data yang disimpan menggunakan cincin kunci di dalam slot sebelumnya. Ini menyebabkan pengguna keluar dari aplikasi yang menggunakan autentikasi ASP.NET Core cookie standar, karena menggunakan Perlindungan Data untuk melindungi cookie-nya. Jika Anda menginginkan cincin kunci independen slot, gunakan penyedia cincin kunci eksternal, seperti Azure Blob Storage, Azure Key Vault, penyimpanan SQL, atau cache Redis.
  2. Jika profil pengguna tersedia, kunci dipertahankan ke folder %LOCALAPPDATA%\ASP.NET\DataProtection-Keys . Jika sistem operasi adalah Windows, kunci dienkripsi saat rest menggunakan DPAPI.

    Atribut setProfileEnvironment kelompok aplikasi juga harus diaktifkan. Nilai default setProfileEnvironment adalah true. Dalam beberapa skenario (misalnya, OS Windows), setProfileEnvironment diatur ke false. Jika kunci tidak disimpan di direktori profil pengguna seperti yang diharapkan:

    1. Buka folder %windir%/system32/inetsrv/config.
    2. Buka file applicationHost.config.
    3. Temukan <system.applicationHost><applicationPools><applicationPoolDefaults><processModel> elemennya.
    4. Konfirmasikan bahwa atribut setProfileEnvironment tidak ada, yang membuat nilai diatur ke default true, atau secara eksplisit mengatur nilai atribut ke true.
  3. Jika aplikasi dihosting di IIS, kunci dipertahankan ke registri HKLM dalam kunci registri khusus yang ACLed hanya ke akun proses pekerja. Kunci dienkripsi saat rest menggunakan DPAPI.

  4. Jika tidak ada kondisi ini yang cocok, kunci tidak bertahan di luar proses saat ini. Saat proses dimatikan, semua kunci yang dihasilkan akan hilang.

Pengembang selalu dalam kontrol penuh dan dapat mengambil alih bagaimana dan di mana kunci disimpan. Tiga opsi pertama di atas harus memberikan default yang baik untuk sebagian besar aplikasi yang mirip dengan cara kerja rutinitas pembuatan otomatis machineKey> ASP.NET <di masa lalu. Opsi mundur akhir adalah satu-satunya skenario yang mengharuskan pengembang menentukan konfigurasi di muka jika mereka menginginkan persistensi kunci, tetapi fallback ini hanya terjadi dalam situasi yang jarang terjadi.

Saat menghosting dalam kontainer Docker, kunci harus disimpan di folder yang merupakan volume Docker (volume bersama atau volume yang dipasang host yang bertahan di luar masa pakai kontainer) atau di penyedia eksternal, seperti Azure Key Vault atau Redis. Penyedia eksternal juga berguna dalam skenario farm web jika aplikasi tidak dapat mengakses volume jaringan bersama (lihat PersistKeysToFileSystem untuk informasi selengkapnya).

Peringatan

Jika pengembang mengambil alih aturan yang diuraikan di atas dan mengarahkan sistem Perlindungan Data pada repositori kunci tertentu, enkripsi otomatis kunci di dinonaktifkan rest . rest Perlindungan pada dapat diaktifkan kembali melalui konfigurasi.

Masa pakai kunci

Kunci memiliki masa pakai 90 hari secara default. Saat kunci kedaluwarsa, aplikasi secara otomatis menghasilkan kunci baru dan mengatur kunci baru sebagai kunci aktif. Selama kunci yang dihentikan tetap ada di sistem, aplikasi Anda dapat mendekripsi data apa pun yang dilindungi dengannya. Lihat manajemen kunci untuk informasi selengkapnya.

Algoritma default

Algoritma perlindungan payload default yang digunakan adalah AES-256-CBC untuk kerahasiaan dan HMACSHA256 untuk keaslian. Kunci master 512-bit, diubah setiap 90 hari, digunakan untuk memperoleh dua sub-kunci yang digunakan untuk algoritma ini berdasarkan per payload. Lihat derivasi subkunia untuk informasi selengkapnya.

Sumber Daya Tambahan: