Delen via


Sleutelbeheer en levensduur van gegevensbescherming in ASP.NET Core

Door Rick Anderson

Sleutelbeheer

De app probeert de operationele omgeving te detecteren en de sleutelconfiguratie zelf af te handelen.

  1. Als de app wordt gehost in Azure Apps, blijven sleutels behouden in de map %HOME%\ASP.NET\DataProtection-Keys. Deze map wordt ondersteund door netwerkopslag en wordt gesynchroniseerd op alle computers waarop de app wordt gehost.

    • Sleutels zijn niet beveiligd in opgeslagen toestand.
    • De map DataProtection-Keys zorgt voor de sleutelring aan alle exemplaren van een app in één implementatieslot.
    • Afzonderlijke implementatieslots, zoals Staging en Productie, delen geen sleutelring. Wanneer u wisselt tussen implementatieslots, bijvoorbeeld het verwisselen van staging naar productie of het gebruik van A/B-tests, kan elke app die Data Protection gebruikt, opgeslagen gegevens niet ontsleutelen met behulp van de sleutelring in het vorige slot. Dit leidt ertoe dat gebruikers worden afgemeld bij een app die gebruikmaakt van de standaardverificatie ASP.NET Core cookie, omdat deze gebruikmaakt van Gegevensbescherming om de cookies te beveiligen. Als u sleufonafhankelijke sleutelringen nodig hebt, gebruikt u een externe sleutelringprovider, zoals Azure Blob Storage, Azure Key Vault, een SQL-archief of Redis-cache.
  2. Als het gebruikersprofiel beschikbaar is, blijven sleutels behouden in de map %LOCALAPPDATA%\ASP.NET\DataProtection-Keys. Als het besturingssysteem Windows is, worden de sleutels in rust versleuteld met DPAPI.

    Het kenmerk setProfileEnvironment van de app-pool moet ook zijn ingeschakeld. De standaardwaarde van setProfileEnvironment is true. In sommige scenario's (bijvoorbeeld het Windows-besturingssysteem) is setProfileEnvironment ingesteld op false. Als sleutels niet zijn opgeslagen in de gebruikersprofielmap zoals verwacht:

    1. Navigeer naar de map %windir%/system32/inetsrv/config.
    2. Open het bestand applicationHost.config.
    3. Zoek het element <system.applicationHost><applicationPools><applicationPoolDefaults><processModel>.
    4. Controleer of het kenmerk setProfileEnvironment niet aanwezig is. Deze waarde wordt standaard ingesteld op trueof stel de waarde van het kenmerk expliciet in op true.
  3. Als de app wordt gehost in IIS, worden sleutels opgeslagen in het HKLM-register in een speciale registersleutel die met een ACL alleen toegankelijk is voor het werkprocesaccount. Sleutels worden in inactieve toestand versleuteld met DPAPI.

  4. Als geen van deze voorwaarden overeenkomt, worden sleutels niet buiten het huidige proces bewaard. Wanneer het proces wordt afgesloten, gaan alle gegenereerde sleutels verloren.

De ontwikkelaar heeft altijd volledige controle en kan overschrijven hoe en waar sleutels worden opgeslagen. De eerste drie bovenstaande opties moeten goede standaardwaarden bieden voor de meeste apps, vergelijkbaar met de manier waarop de ASP.NET <machineKey> routines voor automatisch genereren in het verleden hebben gewerkt. De laatste terugvaloptie is het enige scenario waarbij de ontwikkelaar vooraf de configuratie moet opgeven als hij/zij sleutelpersistentie wenst, maar deze terugval treedt alleen op in zeldzame situaties.

Bij het hosten in een Docker-container moeten sleutels worden bewaard in een map die een Docker-volume is (een gedeeld volume of een door een host gekoppeld volume dat na de levensduur van de container blijft bestaan) of in een externe provider, zoals Azure Key Vault- of Redis-. Een externe provider is ook handig in webfarmscenario's als apps geen toegang hebben tot een gedeeld netwerkvolume (zie PersistKeysToFileSystem voor meer informatie).

Waarschuwing

Als de ontwikkelaar de hierboven beschreven regels overschrijft en het gegevensbeveiligingssysteem in een specifieke sleutelopslagplaats verwijst, wordt automatische versleuteling van sleutels in rust uitgeschakeld. At-rest-beveiliging kan opnieuw worden ingeschakeld via configuratie.

Sleutellevensduur

Sleutels hebben standaard een levensduur van 90 dagen. Wanneer een sleutel verloopt, genereert de app automatisch een nieuwe sleutel en stelt de nieuwe sleutel in als de actieve sleutel. Zolang buiten gebruik gestelde sleutels op het systeem blijven staan, kan uw app alle gegevens ontsleutelen die met deze sleutels zijn beveiligd. Zie sleutelbeheer voor meer informatie.

Standaardalgoritmen

Het standaard algoritme voor payloadbeveiliging is AES-256-CBC voor vertrouwelijkheid en HMACSHA256 voor echtheid. Een 512-bits hoofdsleutel, die elke 90 dagen wordt gewijzigd, wordt gebruikt om de twee subsleutels af te leiden die per payload voor deze algoritmen worden gebruikt. Zie subsleutelafleiding voor meer informatie.

Sleutels verwijderen

Als u een sleutel verwijdert, zijn de beveiligde gegevens permanent niet toegankelijk. Om dit risico te beperken, raden we u aan sleutels niet te verwijderen. De resulterende accumulatie van sleutels heeft over het algemeen minimale impact omdat ze klein zijn. In uitzonderlijke gevallen, zoals extreem langlopende diensten, kunnen sleutels worden verwijderd. Alleen sleutels verwijderen:

  • Die zijn oud (niet meer in gebruik).
  • Wanneer u het risico op gegevensverlies in ruil voor opslagbesparing kunt accepteren.

U wordt aangeraden geen sleutels voor gegevensbeveiliging te verwijderen.

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.");
}

Aanvullende informatiebronnen

Sleutelbeheer

De app probeert de operationele omgeving te detecteren en de sleutelconfiguratie zelf af te handelen.

  1. Als de app wordt gehost in Azure Apps, blijven sleutels behouden in de map %HOME%\ASP.NET\DataProtection-Keys. Deze map wordt ondersteund door netwerkopslag en wordt gesynchroniseerd op alle computers waarop de app wordt gehost.

    • Sleutels zijn niet beveiligd in rust.
    • De map DataProtection-Keys levert de sleutelring aan alle exemplaren van een app in één implementatieslot.
    • Afzonderlijke implementatieslots, zoals Staging en Productie, delen hun sleutelring niet. Wanneer u wisselt tussen implementatieslots, bijvoorbeeld het verwisselen van staging naar productie of het gebruik van A/B-tests, zal elke app die Data Protection gebruikt opgeslagen gegevens niet kunnen ontsleutelen met behulp van de sleutelring in het vorige slot. Dit leidt ertoe dat gebruikers worden afgemeld bij een app die gebruikmaakt van de standaardverificatie ASP.NET Core cookie, omdat deze gebruikmaakt van Gegevensbescherming om de cookies te beveiligen. Als u sleufonafhankelijke sleutelringen nodig hebt, gebruikt u een externe sleutelringprovider, zoals Azure Blob Storage, Azure Key Vault, een SQL-archief of Redis-cache.
  2. Als het gebruikersprofiel beschikbaar is, blijven sleutels behouden in de map %LOCALAPPDATA%\ASP.NET\DataProtection-Keys. Als het besturingssysteem Windows is, worden de sleutels in rust versleuteld met DPAPI.

    Het kenmerk setProfileEnvironment van de app-pool moet ook zijn ingeschakeld. De standaardwaarde van setProfileEnvironment is true. In sommige scenario's (bijvoorbeeld het Windows-besturingssysteem) is setProfileEnvironment ingesteld op false. Als sleutels niet zijn opgeslagen in de gebruikersprofielmap zoals verwacht:

    1. Navigeer naar de map %windir%/system32/inetsrv/config.
    2. Open het bestand applicationHost.config.
    3. Zoek het element <system.applicationHost><applicationPools><applicationPoolDefaults><processModel>.
    4. Controleer of het kenmerk setProfileEnvironment niet aanwezig is. Deze waarde wordt standaard ingesteld op trueof stel de waarde van het kenmerk expliciet in op true.
  3. Als de app wordt gehost in IIS, worden cryptografische sleutels opgeslagen in het HKLM-register in een speciale registersleutel die alleen toegankelijk is voor het werkprocesaccount. Sleutels worden versleuteld wanneer ze niet in gebruik zijn met DPAPI.

  4. Als geen van deze voorwaarden overeenkomt, worden sleutels niet buiten het huidige proces bewaard. Wanneer het proces wordt afgesloten, gaan alle gegenereerde sleutels verloren.

De ontwikkelaar heeft altijd volledige controle en kan overschrijven hoe en waar sleutels worden opgeslagen. De eerste drie bovenstaande opties moeten goede standaardwaarden bieden voor de meeste apps, vergelijkbaar met de manier waarop de ASP.NET <machineKey> routines voor automatisch genereren in het verleden hebben gewerkt. De laatste optie voor terugval is het enige scenario waarvoor de ontwikkelaar configuratie vooraf moet opgeven als ze sleutelpersistentie willen, maar deze terugval treedt alleen op in zeldzame situaties.

Bij het hosten in een Docker-container moeten sleutels worden bewaard in een map die een Docker-volume is (een gedeeld volume of een door een host gekoppeld volume dat na de levensduur van de container blijft bestaan) of in een externe provider, zoals Azure Key Vault- of Redis-. Een externe provider is ook handig in webfarmscenario's als apps geen toegang hebben tot een gedeeld netwerkvolume (zie PersistKeysToFileSystem voor meer informatie).

Waarschuwing

Als de ontwikkelaar de hierboven beschreven regels overschrijft en het gegevensbeveiligingssysteem in een specifieke sleutelopslagplaats verwijst, wordt automatische versleuteling van sleutels in rust uitgeschakeld. Bescherming in rust kan opnieuw worden ingeschakeld via de -configuratie.

Sleutellevensduur

Sleutels hebben standaard een levensduur van 90 dagen. Wanneer een sleutel verloopt, genereert de app automatisch een nieuwe sleutel en stelt de nieuwe sleutel in als de actieve sleutel. Zolang buiten gebruik gestelde sleutels op het systeem blijven staan, kan uw app alle gegevens ontsleutelen die met deze sleutels zijn beveiligd. Zie sleutelbeheer voor meer informatie.

Standaardalgoritmen

Het standaard algoritme voor payloadbeveiliging is AES-256-CBC voor vertrouwelijkheid en HMACSHA256 voor echtheid. Een 512-bits hoofdsleutel, die elke 90 dagen wordt gewijzigd, wordt gebruikt om de twee subsleutels af te leiden die per payload voor deze algoritmen worden gebruikt. Zie -subsleutelafleiding voor meer informatie.

Aanvullende informatiebronnen