Gerenciamento de chaves de proteção de dados e o tempo de vida no ASP.NET CoreData Protection key management and lifetime in ASP.NET Core

Por Rick AndersonBy Rick Anderson

Gerenciamento de chavesKey management

O aplicativo tenta detectar seu ambiente operacional e lidar com a configuração de chave por conta própria.The app attempts to detect its operational environment and handle key configuration on its own.

  1. Se o aplicativo estiver hospedado em aplicativos do Azure, as chaves são persistidas para o %HOME%\ASP.NET\DataProtection-Keys pasta.If the app is hosted in Azure Apps, keys are persisted to the %HOME%\ASP.NET\DataProtection-Keys folder. Essa pasta é apoiada pelo repositório de rede e é sincronizada em todos os computadores que hospedam o aplicativo.This folder is backed by network storage and is synchronized across all machines hosting the app.

    • As chaves não são protegidas em repouso.Keys aren't protected at rest.
    • O DataProtection chaves pasta fornece o anel de chave a todas as instâncias de um aplicativo em um único slot de implantação.The DataProtection-Keys folder supplies the key ring to all instances of an app in a single deployment slot.
    • Slots de implantação separados, como de preparo e produção, não compartilham um anel de chave.Separate deployment slots, such as Staging and Production, don't share a key ring. Quando você alternar entre os slots de implantação, por exemplo, trocar o preparo e produção ou usando um teste a / B, qualquer aplicativo usando a proteção de dados não será capaz de descriptografar dados armazenados usando o anel de chave dentro do slot anterior.When you swap between deployment slots, for example swapping Staging to Production or using A/B testing, any app using Data Protection won't be able to decrypt stored data using the key ring inside the previous slot. Isso leva a usuários que estão sendo conectados fora de um aplicativo que usa a autenticação de cookie padrão do ASP.NET Core, pois ele usa a proteção de dados para proteger seus cookies.This leads to users being logged out of an app that uses the standard ASP.NET Core cookie authentication, as it uses Data Protection to protect its cookies. Se desejar que os anéis de chave independente de slot, use um provedor de anel de chave externo, como o armazenamento de BLOBs Azure, Azure Key Vault, um repositório SQL ou do cache Redis.If you desire slot-independent key rings, use an external key ring provider, such as Azure Blob Storage, Azure Key Vault, a SQL store, or Redis cache.
  2. Se o perfil do usuário estiver disponível, as chaves são persistidas para o %LOCALAPPDATA%\ASP.NET\DataProtection-Keys pasta.If the user profile is available, keys are persisted to the %LOCALAPPDATA%\ASP.NET\DataProtection-Keys folder. Se o sistema operacional for Windows, as chaves são criptografadas em repouso usando a DPAPI.If the operating system is Windows, the keys are encrypted at rest using DPAPI.

    O atributo setProfileEnvironment do pool de aplicativos também deve ser habilitado.The app pool's setProfileEnvironment attribute must also be enabled. O valor padrão de setProfileEnvironment é true.The default value of setProfileEnvironment is true. Em alguns cenários (por exemplo, um SO Windows), setProfileEnvironment é definido como false.In some scenarios (for example, Windows OS), setProfileEnvironment is set to false. Se as chaves não estiverem armazenadas no diretório do perfil do usuário como esperado:If keys aren't stored in the user profile directory as expected:

    1. navegue até a pasta %windir%/system32/inetsrv/config.Navigate to the %windir%/system32/inetsrv/config folder.
    2. Abra o arquivo applicationHost.config.Open the applicationHost.config file.
    3. Localize o elemento <system.applicationHost><applicationPools><applicationPoolDefaults><processModel>.Locate the <system.applicationHost><applicationPools><applicationPoolDefaults><processModel> element.
    4. Confirme se o atributo setProfileEnvironment não está presente, que tem como padrão o valor true, ou defina explicitamente o valor do atributo como true.Confirm that the setProfileEnvironment attribute isn't present, which defaults the value to true, or explicitly set the attribute's value to true.
  3. Se o aplicativo estiver hospedado no IIS, as chaves são mantidas no registro HKLM em uma chave de registro especial que tem a ACL acessível apenas para a conta de processo de trabalho.If the app is hosted in IIS, keys are persisted to the HKLM registry in a special registry key that's ACLed only to the worker process account. As chaves são criptografadas em repouso usando a DPAPI.Keys are encrypted at rest using DPAPI.

  4. Se nenhuma dessas condições corresponderem, as chaves não são persistidas fora do processo atual.If none of these conditions match, keys aren't persisted outside of the current process. Quando o processo é encerrado, todas geradas chaves forem perdidas.When the process shuts down, all generated keys are lost.

O desenvolvedor está sempre no controle total e pode substituir como e onde as chaves são armazenadas.The developer is always in full control and can override how and where keys are stored. As três primeiras opções acima devem fornecer bons padrões para a maioria dos aplicativos de forma semelhante a como o ASP.NET <machineKey > rotinas de geração automática funcionavam no passado.The first three options above should provide good defaults for most apps similar to how the ASP.NET <machineKey> auto-generation routines worked in the past. A opção de fallback final é o único cenário que exige que o desenvolvedor especifique configuração antecipado se quiserem persistência de chave, mas essa fallback só ocorre em situações raras.The final, fallback option is the only scenario that requires the developer to specify configuration upfront if they want key persistence, but this fallback only occurs in rare situations.

Ao hospedar em um contêiner do Docker, as chaves devem ser persistentes em uma pasta que é um volume do Docker (um volume compartilhado ou um volume montado de host que persiste além do tempo de vida do contêiner) ou em um provedor externo, como Azure Key Vault ou Redis.When hosting in a Docker container, keys should be persisted in a folder that's a Docker volume (a shared volume or a host-mounted volume that persists beyond the container's lifetime) or in an external provider, such as Azure Key Vault or Redis. Um provedor externo também é útil em cenários de web farm se os aplicativos não podem acessar um volume compartilhado de rede (consulte PersistKeysToFileSystem para obter mais informações).An external provider is also useful in web farm scenarios if apps can't access a shared network volume (see PersistKeysToFileSystem for more information).

Aviso

Se o desenvolvedor substitui as regras descritas acima e aponta o sistema de proteção de dados em um repositório de chave específico, a criptografia automática de chaves em repouso está desabilitada.If the developer overrides the rules outlined above and points the Data Protection system at a specific key repository, automatic encryption of keys at rest is disabled. Proteção em repouso pode ser reabilitada por meio configuração.At-rest protection can be re-enabled via configuration.

Vida útil da chaveKey lifetime

Por padrão, as chaves têm um tempo de vida de 90 dias.Keys have a 90-day lifetime by default. Quando uma chave expira, o aplicativo gera uma nova chave automaticamente e define a nova chave como a chave ativa.When a key expires, the app automatically generates a new key and sets the new key as the active key. Chaves obsoletos permanecerão no sistema, desde que seu aplicativo pode descriptografar todos os dados protegidos com eles.As long as retired keys remain on the system, your app can decrypt any data protected with them. Ver gerenciamento de chaves para obter mais informações.See key management for more information.

Algoritmos padrãoDefault algorithms

O algoritmo de proteção de conteúdo padrão usado é AES-256-CBC para confidencialidade e HMACSHA256 autenticidade.The default payload protection algorithm used is AES-256-CBC for confidentiality and HMACSHA256 for authenticity. Uma chave mestra de 512 bits, alterada a cada 90 dias, é usada para derivar as duas chaves de subpropriedades usadas para esses algoritmos em uma base por carga.A 512-bit master key, changed every 90 days, is used to derive the two sub-keys used for these algorithms on a per-payload basis. Ver subchave derivação para obter mais informações.See subkey derivation for more information.

Recursos adicionaisAdditional resources