1. Introdução
Ao criar aplicativos ASP.NET 2.0, os desenvolvedores geralmente armazenam informações confidenciais de configuração no arquivo Web.config. O exemplo mais típico é a cadeia de conexão do banco de dados, mas outras informações confidenciais incluídas no arquivo Web.config incluem informações de conexão do servidor SMTP e dados de credenciais do usuário, etc. Embora o ASP.NET possa ser configurado por padrão para negar todas as solicitações HTTP para recursos de arquivo com extensão .config, se um hacker conseguir acessar o sistema de arquivos do seu servidor web, informações confidenciais ainda poderão ser roubadas. Por exemplo, talvez você acidentalmente tenha permitido acesso FTP anônimo ao seu site, permitindo assim que um hacker simplesmente baixe seu arquivo Web.config por meio do protocolo FTP.
Felizmente, o ASP.NET 2.0 ajuda a aliviar esse problema, permitindo criptografar partes selecionadas do arquivo Web.config, como a seção <connectionStrings> ou alguma seção de configuração personalizada usada pelo seu aplicativo. As seções de configuração podem ser facilmente pré-criptografadas usando codificação ou aspnet_regiis.exe (um programa de linha de comando). Depois de criptografadas, as configurações do Web.config ficam protegidas de olhares indiscretos. Além disso, ao recuperar programaticamente as definições de configuração criptografadas da sua página ASP.NET, o ASP.NET descriptografa automaticamente a parte criptografada que lê. Resumindo, depois que as informações de configuração forem criptografadas, você não precisará escrever nenhum outro código ou realizar nenhuma ação adicional em seu aplicativo para usar os dados criptografados.
Neste artigo, discutiremos como criptografar e descriptografar programaticamente esta seção de definições de configuração e examinaremos o uso do programa de linha de comando aspnet_regiis.exe. Avaliaremos então as opções de criptografia fornecidas pelo ASP.NET 2.0. Além disso, discutiremos brevemente como criptografar informações de configuração no ASP.NET versão 1.x.
2. Premissa
Antes de começarmos a discutir como criptografar informações de configuração do ASP.NET 2.0, lembre-se dos seguintes pontos:
1. Todas as formas de criptografia contêm algum tipo de segredo, e esse segredo é usado ao criptografar e descriptografar dados. Os algoritmos de criptografia simétrica usam a mesma chave ao criptografar e descriptografar uma mensagem, enquanto os algoritmos de criptografia assimétrica usam chaves diferentes para criptografar e descriptografar. Não importa qual tecnologia seja usada, o mais importante é o quão segura é a chave de descriptografia.
2. A tecnologia de criptografia de configuração fornecida pelo ASP.NET 2.0 foi projetada para evitar que hackers consigam recuperar seus arquivos de configuração de alguma forma. A ideia é que, se houver o seu arquivo Web.config no computador do hacker, ele não poderá quebrar a parte criptografada. No entanto, quando uma página ASP.NET no servidor web solicita informações de um arquivo de configuração criptografado, os dados devem ser descriptografados antes de poderem ser usados (e isso acontece sem que você escreva nenhum código). Portanto, se um hacker conseguir fazer upload de uma página da web ASP.NET em seu sistema que consulte o arquivo de configuração e exiba seus resultados, ele poderá visualizar as configurações criptografadas como texto simples. (Para obter detalhes, consulte o exemplo de página ASP.NET fornecido neste artigo, que mostra como criptografar e descriptografar várias partes do arquivo Web.config; como você pode ver, uma página ASP.NET pode acessar (e exibir) os dados criptografados (formato de texto comum)
3. Criptografar e descriptografar informações de configuração requer um certo custo de desempenho. Portanto, é comum criptografar apenas as partes da configuração que contêm informações confidenciais. Por exemplo, pode não haver necessidade de criptografar as seções de configuração <compilação> ou <autorização>.
3. Que tipo de informação pode ser criptografada
Antes de analisarmos como criptografar as informações de configuração do ASP.NET 2.0, vamos primeiro dar uma olhada em quais informações de configuração podem ser criptografadas. Usando bibliotecas fornecidas pelo .NET Framework 2.0, os desenvolvedores podem criptografar a maioria das seções de configuração em um arquivo Web.config ou machine.config. Essas partes de configuração são elementos XML que são nós filhos do elemento <configuration> ou <system.web>. Por exemplo, o arquivo Web.config de amostra a seguir contém três definições de configuração, definidas explicitamente como:
<connectionStrings>, <compilation> e <authentication>.
<?xml versão="1.0"?>
<configuração xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<strings de conexão>
<adicionar nome="MembershipConnectionString" connectionString="connectionString"/>
</strings de conexão>
<sistema.web>
<compilação debug="true"/>
<modo de autenticação="Formulários" />
</system.web>
Cada uma dessas seções pode ser opcionalmente criptografada, de forma programática ou via aspnet_regiis.exe (uma ferramenta de linha de comando). Quando criptografado, o texto criptografado é armazenado diretamente no arquivo de configuração. Por exemplo, se criptografássemos a seção <connectionStrings> acima, o arquivo Web.config resultante poderia ter esta aparência: (Observação: devido a limitações de espaço, omitimos uma grande parte de <CipherValue>)
<?xml version= "1.0"?>
<configuração xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<Dados Criptografados>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
</CipherData>
</Dados Criptografados>
</strings de conexão>
<sistema.web>
<compilação debug="true"/>
<modo de autenticação="Formulários" />
</system.web>
Além disso, existem algumas partes de configuração que você não pode criptografar usando esta técnica:
· <processModel>
· <tempo de execução>
· <mscorlib>
·<inicialização>
· <system.runtime.remoting>
· <configProtectedData>
· <montagens de satélites>
· <Configurações de criptografia>
· <cryptoNameMapping>
· <cryptoClasses>
Para criptografar essas partes da configuração, você deve criptografar esses valores e armazená-los no registro. Existe uma ferramenta de linha de comando aspnet_setreg.exe que pode ajudá-lo neste processo; discutiremos essa ferramenta posteriormente neste artigo;
[Dica] A diferença entre Web.Config e Machine.Config:
O arquivo Web.config especifica as definições de configuração para um aplicativo da web específico e está localizado no diretório raiz do aplicativo, enquanto o arquivo machine.config especifica todas as definições de configuração localizadas; no servidor web. Configurações do site localizadas no diretório $WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG.
4. Opções de criptografia
Os desenvolvedores podem usar o modelo de provedor ASP.NET 2.0 para proteger as informações da seção de configuração, o que permite que qualquer implementação seja perfeitamente conectada à API. O .NET Framework 2.0 fornece dois provedores integrados para proteger as informações da seção de configuração:
· Provedor DPAPI (Windows Data Protection API) (DataProtectionConfigurationProvider): esse provedor usa a tecnologia de criptografia integrada do Windows para criptografar e descriptografar seções de configuração. Por padrão, esse provedor usa a chave nativa. Você também pode usar chaves de usuário, mas isso requer um pouco de personalização.
· Provedor de configuração protegida RSA (RSAProtectedConfigurationProvider): usa criptografia de chave pública RSA para criptografar e descriptografar seções de configuração. Usando esse provedor, você precisa criar um contêiner de chaves que armazene as chaves públicas e privadas usadas para criptografar e descriptografar informações de configuração. Você pode usar o RSA em um farm de vários servidores criando contêineres de chaves exportáveis.
Claro, você também pode criar seu próprio provedor de configurações de proteção, se necessário.
Neste artigo, discutiremos apenas o uso de chaves no nível da máquina usando o provedor DPAPI. Este é de longe o método mais simples, pois não requer a criação de chaves ou contêineres de chaves. A desvantagem, claro, é que um arquivo de configuração criptografado só pode ser usado no servidor web que implementou a criptografia em primeiro lugar, além disso, o uso de uma chave de máquina permitirá que o texto criptografado seja descriptografado por qualquer site no servidor web;
5. Criptografe a seção de configuração programaticamente
A classe System.Configuration.SectionInformation abstrai a descrição de uma seção de configuração. Para criptografar uma seção de configuração, basta utilizar o método ProtectSection(provider) da classe SectionInformation, passando o nome do provedor que deseja utilizar para realizar a criptografia. Para acessar uma seção de configuração específica no arquivo Web.config do seu aplicativo, você pode usar a classe WebConfigurationManager (no namespace System.Web.Configuration) para referenciar seu arquivo Web.config e, em seguida, usar seu GetSection. O método (sectionName) retorna um Instância de ConfigurationSection. Finalmente, você pode obter um objeto SectionInformation por meio da propriedade SectionInformation da instância ConfigurationSection.
Abaixo, ilustramos o problema através de um exemplo de código simples:
privatevoid ProtectSection(string sectionName, string Provider)
{
Configuração configuração = WebConfigurationManager.
OpenWebConfiguration(Request.ApplicationPath);
Seção ConfigurationSection = config.GetSection(sectionName);
if (seção! = nulo &&! seção.SectionInformation.IsProtected)
{
seção.SectionInformation.ProtectSection(provedor);
config.Salvar();
}
}
private void UnProtectSection(string nomedaseção) {
Configuração config =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
Seção ConfigurationSection = config.GetSection n(sectionName);
if (seção! = null && seção.SectionInformation.IsProtected)
{
seção.SectionInformation.UnprotectSection();
config.Salvar();
}
Você pode chamar esse método ProtectSection(sectionName, provedor) de uma página ASP.NET, seus parâmetros correspondentes são um nome de seção (como connectionStrings) e um provedor (como DataProtectionConfigurationProvider) e ele abre o arquivo Web.config, referenciando Nesta seção, o método ProtectSection(provider) do objeto SectionInformation é chamado e, finalmente, as alterações de configuração são salvas.
Por outro lado, o método UnProtectSection(provider) implementa a descriptografia de uma seção de configuração específica. Aqui, apenas a seção a ser descriptografada precisa ser passada - não precisamos incomodar o provedor, pois essa informação já está armazenada na tag que acompanha a seção criptografada (ou seja, a seção <connectionStrings> no exemplo acima, que é criptografado posteriormente, inclui o provedor: <connectionStringsconfigProtectionProvider="DataProtectionConfigurationProvider">).
Lembre-se de que, uma vez criptografados esses dados, ao lê-los de uma página ASP.NET (ou seja, ler as informações da string de conexão de um controle SqlDataSource ou programaticamente via ConfigurationManager.ConnectionStrings[connStringName].ConnectionString) , o ASP.NET descriptografará automaticamente o string de conexão e retornar um valor de texto simples. Em outras palavras, você não precisa alterar seu código após implementar a criptografia. Muito legal, certo?
No site de exemplo do ASP.NET 2.0 baixado deste artigo, você encontrará uma página de exemplo que exibe o arquivo Web.config do site, que possui um TextBox de várias linhas e botões de controle da Web correspondentes para configuração de criptografia de várias partes do site. arquivo. Este exemplo também usa os métodos ProtectSection() e UnProtectSection() discutidos acima.
6. Use a ferramenta de linha de comando aspnet_regiis.exe
Você também pode usar a ferramenta de linha de comando aspnet_regiis.exe para criptografar e descriptografar a parte de configuração do arquivo Web.config. Você pode encontrar isso em "%WINDOWSDIR%Microsoft.Net. Diretório Frameworkversão". ferramenta. Para criptografar uma seção no arquivo Web.config, você pode usar a chave de máquina DPAPI nesta ferramenta de linha de comando da seguinte maneira:
Uma forma comum de criptografar um arquivo Web.config para um site específico:
aspnet_regiis.exe -pef seção Physical_directory - provedor prov
ou:
aspnet_regiis.exe -pe seção -app virtual_directory -prov
Uma instância específica do provedor criptografando o arquivo Web.config de um site específico:
aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov "DataProtectionConfigurationProvider"
ou:
aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
Uma forma comum de descriptografar o arquivo Web.config de um site específico:
aspnet_regiis.exe -pdf seçãophysical_directory
ou:
aspnet_regiis. exe -pd Seção -app virtual_directory
Exemplo específico de descriptografia do arquivo Web.config de um site específico:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
ou:
Você também pode especificar que aspnet_regiis.exe seja executado machine.config Criptografia/descriptografia de arquivo.
[Dica] Criptografando definições de configuração no ASP.NET versão 1.x
Para proteger as definições de configuração no ASP.NET versão 1.x, os desenvolvedores precisam criptografar e armazenar configurações confidenciais no registro do servidor web e usar um armazenamento de chave "forte". método. Em vez de armazenar conteúdo criptografado (como no ASP.NET 2.0), o arquivo de configuração simplesmente contém uma referência à chave de registro onde o valor criptografado está armazenado. Por exemplo:
<identidade personificar="true"
userName="registro:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,userName"
password="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,password" />
A Microsoft fornece aos desenvolvedores a ferramenta de linha de comando aspnet_setreg.exe para criptografar informações de configuração confidenciais e movê-las para uma entrada de registro "forte". Infelizmente, essa ferramenta só funciona em configurações específicas. Em contraste, o ASP.NET 2.0 permite que qualquer seção de configuração seja criptografada.
Para obter mais informações sobre como usar aspnet_setreg.exe em um aplicativo ASP.NET 1.x, consulte KB#32990 no MSDN. Infelizmente, este programa de linha de comando só pode criptografar seções predefinidas nas definições de configuração e não permite criptografar cadeias de conexão de banco de dados e outras informações confidenciais que você mesmo adiciona.
7. Conclusão
Neste artigo, aprendemos como usar as diferentes opções de criptografia fornecidas pelo ASP.NET 2.0 para proteger as informações da seção de configuração. Também discutimos como usar técnicas de programação e aspnet_regiis.exe para criptografar a seção de configuração no Web.config, respectivamente. . Proteger suas configurações confidenciais ajuda a garantir que seu site seja mais difícil de ser hackeado, tornando mais difícil descobrir configurações confidenciais. Hoje, o ASP.NET 2.0 já fornece tecnologia de criptografia e descriptografia relativamente fácil, e não há razão para os desenvolvedores não usarem esse método para proteger suas configurações confidenciais.