Compartilhar via


Armazenar segredos do aplicativo com segurança durante o desenvolvimento

Dica

Esse conteúdo é um trecho do eBook, arquitetura de microsserviços do .NET para aplicativos .NET em contêineres, disponível em do .NET Docs ou como um PDF para download gratuito que pode ser lido offline.

miniatura da capa do eBook sobre arquitetura de microsserviços do .NET para aplicativos .NET em contêineres.

Para se conectar com recursos protegidos e outros serviços, os aplicativos do ASP.NET Core normalmente precisam usar cadeias de conexão, senhas ou outras credenciais que contenham informações confidenciais. Essas informações confidenciais são chamadas de segredos. É uma prática recomendada não incluir segredos no código-fonte e não armazenar segredos no controle do código-fonte. Em vez disso, você deve usar o modelo de configuração do ASP.NET Core para ler os segredos de locais mais seguros.

Você deve separar os segredos para acessar recursos de desenvolvimento e preparo daqueles usados para acessar recursos de produção, pois diferentes indivíduos precisarão de acesso a esses diferentes conjuntos de segredos. Para armazenar segredos usados durante o desenvolvimento, as abordagens comuns são armazenar segredos em variáveis de ambiente ou usando a ferramenta ASP.NET Core Secret Manager. Para um armazenamento mais seguro em ambientes de produção, os microsserviços podem armazenar segredos em um Azure Key Vault.

Armazenar segredos em variáveis de ambiente

Uma maneira de manter segredos fora do código-fonte é que os desenvolvedores definam segredos baseados em cadeia de caracteres como variáveis de ambiente em seus computadores de desenvolvimento. Ao usar variáveis de ambiente para armazenar segredos com nomes hierárquicos, como os aninhados em seções de configuração, você deve nomear as variáveis para incluir a hierarquia completa de suas seções, delimitada com dois-pontos (:).

Por exemplo, definir uma variável Logging:LogLevel:Default de ambiente como Debug valor seria equivalente a um valor de configuração do seguinte arquivo JSON:

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

Para acessar esses valores a partir de variáveis de ambiente, o aplicativo precisa apenas chamar AddEnvironmentVariables em seu ConfigurationBuilder ao construir um objeto IConfigurationRoot.

Observação

As variáveis de ambiente geralmente são armazenadas como texto sem formatação, portanto, se o computador ou o processo com as variáveis de ambiente estiverem comprometidos, os valores da variável de ambiente ficarão visíveis.

Armazenar segredos com o ASP.NET Core Secret Manager

A ferramenta ASP.NET Core Secret Manager fornece outro método de manter segredos fora do código-fonte durante o desenvolvimento. Para usar a ferramenta Gerenciador de Segredos, instale o pacote Microsoft.Extensions.Configuration.UserSecrets no arquivo de projeto. Depois que essa dependência estiver presente e tiver sido restaurada, o dotnet user-secrets comando poderá ser usado para definir o valor dos segredos da linha de comando. Esses segredos serão armazenados em um arquivo JSON no diretório de perfil do usuário (os detalhes variam de acordo com o sistema operacional), longe do código-fonte.

Os segredos definidos pela ferramenta Gerenciador de Segredos são organizados pela UserSecretsId propriedade do projeto que está usando os segredos. Portanto, você deve ter certeza de definir a propriedade UserSecretsId em seu arquivo de projeto, conforme mostrado no snippet abaixo. O valor padrão é um GUID atribuído pelo Visual Studio, mas a cadeia de caracteres real não é importante desde que seja exclusiva em seu computador.

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

O uso de segredos armazenados com o Secret Manager em um aplicativo é realizado chamando AddUserSecrets<T> na instância ConfigurationBuilderpara incluir os segredos do aplicativo em sua configuração. O parâmetro T genérico deve ser um tipo do assembly ao qual o UserSecretId foi aplicado. Normalmente, usar AddUserSecrets<Startup> é bom.

AddUserSecrets<Startup>() está incluído nas opções padrão para o ambiente de desenvolvimento ao usar o método CreateDefaultBuilder em Program.cs.