Encriptar arquivo web.config

Se você está receoso em manter informações criticas no arquivo web.config,então você deve encripta-lo — ou pelo menos as partes que você mais se importa.

Eu gosto de manter minhas informações na seção appSettings do meu arquivo web.config,isso me permite mudar o comportamento
de um web site inteiro apenas mudando alguns valores no arquivo.Eu especialmente gosto de manter strings de conexão no elemento
ConnectionStrings(isso garante que eu mantenha o número de conexões minimo,o que aumenta as performances de pooling).

Meus clientes nem sempre concordam em manter dados no web.config.Pra ser mais especifico meus clientes,ficam receosos em manter
informações sensiveis(como connectionStrings)num arquivo de texto.Eu digo a meus clientes que se  pessoas podem acessar arquivos
de texto dos seus servidores web,então eles tem problemas,que nem mesmo eu posso resolver.

Meus clientes não consideram esse um argumento válido.

E pra ser honesto,eles tem razão.Uma porcentagem significativa,de brechas de segurança são feitas por pessoas dentro das
empresas .Então eu sugeri aos meu cliente encriptar o arquivo web.config.

Encriptando Seções

Esse é o código que eu utilizei para encriptar,uma sessão especifica do web.config.Eu primeiro selecionei uma seção utilizando,
o objeto de configuração da seção de coleções.Nesse caso eu estou selecionando a seção ConnectionString:


System.Configuration.Configuration configFile;
ConfigurationSection configSection;

configFile = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
configSection = configFile.Sections[“connectionStrings”];

Esse código presume que você está executando através de uma página do site por isso usei a propriedade ApplicationPath no objeto
Request para recuperar o caminho fisico para a pasta do web.config.

Agora que tenho a seção,vou encripta-la,especificando o sistema de encriptação que quero usar.O último passo é salvar a versão
encriptada de volta no web.config:

configSection.SectionInformation.ProtectSection(“RsaProtectedConfigurationProvider”);
configFile.Save();

O resultado aparece assim no web.config:

<connectionStrings
configProtectionProvider=”DataProtectionConfigurationProvider”>
<EncryptedData>
<CipherData>
<CipherValue>…encrypted data… </CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>

A boa noticia é que quando você usa a coleção ConnectionString do ConfigurationManager para recuperar uma conexão encriptada,
essa conexão é automaticamente decriptada para você.Esse código funciona tanto se a conexão estiver encriptada ou não.


string conection = System.Web.Configuration.WebConfigurationManager.ConnectionStrings[“minhaConexao”].ConnectionString;

Uma vez que as strings são encriptadas usando a chave privada para o Web server,mesmo que o arquivo seja roubado do site,
não pode ser decriptado em nenhuma máquina,a não ser no web server.Isso significa também que você não pode encriptar a connection
string até que o arquivo tenha sido movido para o servidor.Se você encriptar a connection string no servidor de teste e depois
mover seu site para o servidor de produção,o ASP.NET não poderá decriptar a connection string usando a chave privada do servidor
de produção.

Dependendo da ocasião,você poderá precisar decriptar a seção do web.config apenas pra checar o que o arquivo na verdade contém.
Esse código faz o serviço:

System.Configuration.Configuration configFile;
ConfigurationSection configSection;

configFile = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
configSection = configFile1.Sections[“connectionStrings”];

configSection.SectionInformation.UnprotectSection();

configFile.Save();

Encriptação por linha de comando:

Se você preferir não utilizar código,você pode encriptar ou decriptar seções do seu arquivo web.config,usando o aspnet_regiis utility.
Você deve passar ao utilitario o parametro -pe para especificar a seção que deverá ser encriptada junto com o caminho para,
a pasta do arquivo de configuração.Você também deve passar o parametro -prov para especificar o esquema de encriptação:

aspnet_regiis.exe -pef section physical_directory -prov provider

Esse exemplo encripta a seção configurationStrings para um arquivo de configuração em c:\NorthwindCRM folder:

aspnet_regiis.exe -pef configurationStrings c:\NorthwindCRM
-prov “RsaProtectedConfigurationProvider”

Você também pode usar o aspnet_regiis utility para decriptar uma seção usando parametro -pdf ao invés de -pef.
Ou você também poderia se  certificar que ninguém poderia roubar arquivos de texto do seu web server.

Anúncios