Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
por Scott Mitchell
Um aplicativo ASP.NET normalmente armazena informações de configuração em um arquivo Web.config. Algumas destas informações são sensíveis e merecem proteção. Por padrão, esse arquivo não será servido a um visitante do site, mas um administrador ou um hacker pode obter acesso ao sistema de arquivos do servidor Web e exibir o conteúdo do arquivo. Neste tutorial, aprendemos que o ASP.NET 2.0 nos permite proteger informações confidenciais criptografando seções do arquivo Web.config.
Introdução
As informações de configuração para ASP.NET aplicativos geralmente são armazenadas em um arquivo XML chamado Web.config. Ao longo destes tutoriais, atualizamos o Web.config punhado de vezes. Ao criar o Northwind DataSet Tipado no primeiro tutorial, por exemplo, as informações da cadeia de conexão foram adicionadas automaticamente na Web.config<connectionStrings> seção . Mais tarde, no tutorial Páginas Mestras e Navegação no Site , atualizamos Web.configmanualmente, adicionando um <pages> elemento indicando que todas as páginas ASP.NET em nosso projeto devem usar o DataWebControls Tema.
Uma vez que Web.config pode conter dados confidenciais, como cadeias de conexão, é importante que o conteúdo de Web.config seja mantido seguro e oculto de utilizadores não autorizados. Por padrão, qualquer solicitação HTTP para um arquivo com a .config extensão é manipulada pelo mecanismo de ASP.NET, que retorna a mensagem Este tipo de página não é servida mostrada na Figura 1. Isso significa que os visitantes não podem visualizar o conteúdo do seu Web.config arquivo simplesmente entrando http://www.YourServer.com/Web.config na barra de endereços do navegador.
Figura 1: Visitar Web.config através de um navegador retorna a mensagem "Este tipo de página não pode ser exibido" (Clique para ver a imagem em tamanho real)
Mas e se um invasor for capaz de encontrar alguma outra exploração que lhe permita visualizar o conteúdo do seu Web.config ficheiro? O que um invasor poderia fazer com essas informações e quais medidas podem ser tomadas para proteger ainda mais as informações confidenciais contidas no Web.config? Felizmente, a maioria das seções em Web.config não contém informações confidenciais. Que danos pode causar um atacante se souber o nome do Tema predefinido utilizado pelas suas páginas ASP.NET?
No entanto, certas Web.config seções contêm informações confidenciais que podem incluir cadeias de conexão, nomes de usuário, senhas, nomes de servidores, chaves de criptografia e assim por diante. Essas informações geralmente são encontradas nas seguintes Web.config seções:
<appSettings><connectionStrings><identity><sessionState>
Neste tutorial, examinaremos as técnicas para proteger essas informações confidenciais de configuração. Como veremos, o .NET Framework versão 2.0 inclui um sistema de configurações protegidas que facilita a criptografia e descriptografia programaticamente de seções de configuração selecionadas.
Observação
Este tutorial conclui com uma olhada nas recomendações da Microsoft para se conectar a um banco de dados a partir de um aplicativo ASP.NET. Além de criptografar suas cadeias de conexão, você pode ajudar a fortalecer seu sistema, garantindo que você esteja se conectando ao banco de dados de forma segura.
Etapa 1: Explorando as opções de configuração protegidas do ASP.NET 2.0 s
ASP.NET 2.0 inclui um sistema de configuração protegido para encriptar e desencriptar informações de configuração. Isso inclui métodos no .NET Framework que podem ser usados para criptografar ou descriptografar informações de configuração programaticamente. O sistema de configuração protegida usa o modelo de provedor que permite aos desenvolvedores escolher qual implementação criptográfica é usada.
O .NET Framework é fornecido com dois provedores de configuração protegidos:
-
RSAProtectedConfigurationProvider- utiliza o algoritmo assimétrico RSA para encriptação e desencriptação. -
DPAPIProtectedConfigurationProvider- usa a API de Proteção de Dados do Windows (DPAPI) para criptografia e descriptografia.
Como o sistema de configuração protegida implementa o padrão de design do provedor, é possível criar seu próprio provedor de configuração protegido e conectá-lo ao seu aplicativo. Consulte Implementando um provedor de configuração protegido para obter mais informações sobre esse processo.
Os provedores RSA e DPAPI usam chaves para suas rotinas de criptografia e descriptografia, e essas chaves podem ser armazenadas no nível da máquina ou do usuário. As chaves no nível da máquina são ideais para cenários em que o aplicativo Web é executado em seu próprio servidor dedicado ou se houver vários aplicativos em um servidor que precisam compartilhar informações criptografadas. As chaves de nível de usuário são uma opção mais segura em ambientes de hospedagem compartilhada onde outros aplicativos no mesmo servidor não devem ser capazes de descriptografar as seções de configuração protegidas do seu aplicativo.
Neste tutorial, nossos exemplos usarão o provedor DPAPI e chaves no nível da máquina. Especificamente, examinaremos a criptografia da <connectionStrings> seção no Web.config, embora o sistema de configuração protegido possa ser usado para criptografar a maioria das Web.config seções. Para obter informações sobre como usar chaves de nível de usuário ou usar o provedor RSA, consulte os recursos na seção Leituras adicionais no final deste tutorial.
Observação
Os RSAProtectedConfigurationProvider e DPAPIProtectedConfigurationProvider provedores são registados no ficheiro machine.config com os nomes dos provedores RsaProtectedConfigurationProvider e DataProtectionConfigurationProvider, respectivamente. Ao criptografar ou descriptografar informações de configuração, precisaremos fornecer o nome apropriado do provedor (RsaProtectedConfigurationProvider ou DataProtectionConfigurationProvider) em vez do nome do tipo real (RSAProtectedConfigurationProvider e DPAPIProtectedConfigurationProvider). Você pode encontrar o arquivo machine.config na pasta $WINDOWS$\Microsoft.NET\Framework\version\CONFIG.
Etapa 2: Criptografando e descriptografando programaticamente as seções de configuração
Com algumas linhas de código, podemos criptografar ou descriptografar uma seção de configuração específica usando um provedor especificado. O código, como veremos em breve, simplesmente precisa referenciar programaticamente a seção de configuração apropriada, chamar seu ProtectSection ou UnprotectSection método e, em seguida, chamar o Save método para persistir as alterações. Além disso, o .NET Framework inclui um utilitário de linha de comando útil que pode criptografar e descriptografar informações de configuração. Vamos explorar este utilitário de linha de comando na Etapa 3.
Para ilustrar a proteção programática das informações de configuração, vamos criar uma página ASP.NET que inclua botões para criptografar e descriptografar a seção <connectionStrings> em Web.config.
Comece por abrir a página EncryptingConfigSections.aspx na pasta AdvancedDAL. Arraste um controle TextBox da Caixa de Ferramentas para o Designer, definindo sua ID propriedade como WebConfigContents, sua TextMode propriedade como MultiLine, e suas Width propriedades e Rows como 95% e 15, respectivamente. Este controle TextBox exibirá o conteúdo de Web.config nos permitindo ver rapidamente se o conteúdo está criptografado ou não. Claro, em um aplicativo real você nunca gostaria de exibir o conteúdo do Web.config.
Abaixo de TextBox, adicione dois controles Button chamados EncryptConnStrings e DecryptConnStrings. Defina estas propriedades de Texto como Criptografar strings de conexão e Descriptografar strings de conexão.
Neste ponto, sua tela deve ser semelhante à Figura 2.
Figura 2: Adicionar uma caixa de texto e dois controles da Web de botão à página (Clique para visualizar a imagem em tamanho real)
Em seguida, precisamos escrever um código que carregue e exiba o conteúdo de Web.config na WebConfigContents TextBox quando a página é carregada pela primeira vez. Adicione o seguinte código à classe code-behind da página. Esse código adiciona um método chamado DisplayWebConfig e o chama do Page_Load manipulador de eventos quando Page.IsPostBack é False:
Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
'On the first page visit, call DisplayWebConfig method
If Not Page.IsPostBack Then
DisplayWebConfig()
End If
End Sub
Private Sub DisplayWebConfig()
'Reads in the contents of Web.config and displays them in the TextBox
Dim webConfigStream As StreamReader = _
File.OpenText(Path.Combine(Request.PhysicalApplicationPath, "Web.config"))
Dim configContents As String = webConfigStream.ReadToEnd()
webConfigStream.Close()
WebConfigContents.Text = configContents
End Sub
O DisplayWebConfig método usa a File classe para abrir o arquivo s do Web.config aplicativo, a StreamReader classe para ler seu conteúdo em uma cadeia de caracteres e a Path classe para gerar o caminho físico para o Web.config arquivo. Essas três classes são todas encontradas no System.IO namespace. Consequentemente, você precisará adicionar uma Imports``System.IO instrução ao topo da classe code-behind ou, alternativamente, prefixar esses nomes de classe com System.IO.
Em seguida, precisamos adicionar manipuladores de eventos para os dois eventos de controles Click Button e adicionar o código necessário para criptografar e descriptografar a seção usando uma chave no nível da <connectionStrings> máquina com o provedor DPAPI. No Designer, clique duas vezes em cada um dos botões para adicionar um Click manipulador de eventos na classe code-behind e, em seguida, adicione o seguinte código:
Protected Sub EncryptConnStrings_Click(sender As Object, e As EventArgs) _
Handles EncryptConnStrings.Click
'Get configuration information about Web.config
Dim config As Configuration = _
WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)
' Let's work with the <connectionStrings> section
Dim connectionStrings As ConfigurationSection = _
config.GetSection("connectionStrings")
If connectionStrings IsNot Nothing Then
' Only encrypt the section if it is not already protected
If Not connectionStrings.SectionInformation.IsProtected Then
' Encrypt the <connectionStrings> section using the
' DataProtectionConfigurationProvider provider
connectionStrings.SectionInformation.ProtectSection( _
"DataProtectionConfigurationProvider")
config.Save()
' Refresh the Web.config display
DisplayWebConfig()
End If
End If
End Sub
Protected Sub DecryptConnStrings_Click(sender As Object, e As EventArgs) _
Handles DecryptConnStrings.Click
' Get configuration information about Web.config
Dim config As Configuration = _
WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath)
' Let's work with the <connectionStrings> section
Dim connectionStrings As ConfigurationSection = _
config.GetSection("connectionStrings")
If connectionStrings IsNot Nothing Then
' Only decrypt the section if it is protected
If connectionStrings.SectionInformation.IsProtected Then
' Decrypt the <connectionStrings> section
connectionStrings.SectionInformation.UnprotectSection()
config.Save()
' Refresh the Web.config display
DisplayWebConfig()
End If
End If
End Sub
O código usado nos dois manipuladores de eventos é quase idêntico. Ambos começam obtendo informações sobre o Web.config arquivo do aplicativo atual via classe WebConfigurationManager e método OpenWebConfiguration. Esse método retorna o arquivo de configuração da Web para o caminho virtual especificado. Em seguida, a seção Web.config do arquivo <connectionStrings> é acessada por meio do método Configuration da classe GetSection(sectionName), que retorna um objeto .
O ConfigurationSection objeto inclui uma SectionInformation propriedade que fornece informações adicionais e funcionalidade sobre a seção de configuração. Como mostra o código acima, podemos determinar se a seção de configuração está criptografada verificando a propriedade SectionInformationIsProtected. Além disso, a seção pode ser criptografada ou descriptografada através das propriedades SectionInformation e dos métodos ProtectSection(provider) e UnprotectSection.
O ProtectSection(provider) método aceita como entrada uma cadeia de caracteres especificando o nome do provedor de configuração protegido a ser usado ao criptografar. No manipulador de eventos do botão EncryptConnString, passamos o DataProtectionConfigurationProvider para o método ProtectSection(provider) para que o provedor DPAPI seja utilizado. O UnprotectSection método pode determinar o provedor que foi usado para criptografar a seção de configuração e, portanto, não requer nenhum parâmetro de entrada.
Depois de chamar o método ProtectSection(provider) ou UnprotectSection, deve chamar o método Configuration do objeto Save para persistir as alterações. Uma vez que as informações de configuração foram criptografadas ou descriptografadas e as alterações salvas, chamamos DisplayWebConfig para carregar o conteúdo atualizado Web.config no controle TextBox.
Depois de inserir o código acima, teste-o visitando a página no seu navegador através de EncryptingConfigSections.aspx. Inicialmente, deverá ver uma página que lista o conteúdo de Web.config com a seção <connectionStrings> exibida em texto simples (consulte a Figura 3).
Figura 3: Adicionar uma caixa de texto e dois controles da Web de botão à página (Clique para visualizar a imagem em tamanho real)
Agora clique no botão Criptografar cadeias de conexão. Se a validação da solicitação estiver habilitada, a marcação devolvida do WebConfigContents TextBox produzirá um HttpRequestValidationException que exibe a mensagem "Um valor potencialmente perigoso Request.Form foi detetado no cliente." A validação de solicitação, que é habilitada por padrão no ASP.NET 2.0, proíbe postbacks que incluam HTML não codificado e foi projetada para ajudar a evitar ataques de injeção de script. Essa verificação pode ser desativada no nível da página ou do aplicativo. Para desativá-lo nesta página, configure a definição ValidateRequest para False na diretiva @Page. A diretiva @Page encontra-se no topo da marcação declarativa da página.
<%@ Page ValidateRequest="False" ... %>
Para obter mais informações sobre a validação de solicitação, sua finalidade, como desativá-la no nível da página e do aplicativo, bem como codificar a marcação HTML, consulte Validação de solicitação - Prevenção de ataques de script.
Depois de desativar a validação de solicitação para a página, tente clicar no botão Criptografar cadeias de conexão novamente. Quando ocorrer o postback, o ficheiro de configuração será acedido e a sua secção <connectionStrings> será encriptada usando o fornecedor DPAPI. O TextBox é então atualizado para exibir o novo Web.config conteúdo. Como mostra a Figura 4, as <connectionStrings> informações agora estão criptografadas.
Figura 4: Clicar no botão Criptografar cadeias de conexão criptografa a seção (<connectionString> imagem em tamanho real)
Segue-se a secção encriptada <connectionStrings> gerada no meu computador, embora parte do conteúdo do <CipherData> elemento tenha sido removido por uma questão de brevidade:
<connectionStrings
configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>==</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
Observação
O <connectionStrings> elemento especifica o provedor usado para executar a criptografia (DataProtectionConfigurationProvider). Essas informações são usadas pelo UnprotectSection método quando o botão Decrypt Connection Strings é clicado.
Quando a informação da cadeia de conexão de Web.config é acessada - seja pelo código que nós escrevemos, por um controle SqlDataSource ou pelo código gerado automaticamente pelos TableAdapters nos nossos DataSets tipados - ela é automaticamente descriptografada. Em suma, não precisamos de adicionar qualquer código ou lógica extra para desencriptar a secção encriptada <connectionString> . Para demonstrar isso, visite um dos tutoriais anteriores no momento, como o tutorial de exibição simples da seção Relatórios básicos (~/BasicReporting/SimpleDisplay.aspx). Como mostra a Figura 5, o tutorial funciona exatamente como seria de esperar, indicando que as informações da cadeia de conexão criptografada estão sendo descriptografadas automaticamente pela página ASP.NET.
Figura 5: A camada de acesso a dados descriptografa automaticamente as informações da cadeia de conexão (Clique para visualizar a imagem em tamanho real)
Para reverter a <connectionStrings> seção de volta para sua representação de texto simples, clique no botão Descriptografar cadeias de conexão. No postback, você deve ver as cadeias de conexão em Web.config texto sem formatação. Neste ponto, sua tela deve ter a mesma aparência que tinha quando visitou esta página pela primeira vez (veja na Figura 3).
Etapa 3: Criptografando seções de configuração usando o aspnet_regiis.exe
O .NET Framework inclui uma variedade de ferramentas de linha de comando na $WINDOWS$\Microsoft.NET\Framework\version\ pasta. No tutorial Usando dependências de cache SQL , por exemplo, examinamos o uso da aspnet_regsql.exe ferramenta de linha de comando para adicionar a infraestrutura necessária para dependências de cache SQL. Outra ferramenta de linha de comando útil nesta pasta é a ferramenta de registro do IIS ASP.NET (aspnet_regiis.exe). Como o próprio nome indica, a ferramenta de registro do IIS ASP.NET é usada principalmente para registrar um aplicativo ASP.NET 2.0 com o servidor Web de nível profissional da Microsoft, o IIS. Além de seus recursos relacionados ao IIS, a ferramenta de registro do IIS ASP.NET também pode ser usada para criptografar ou descriptografar seções de configuração especificadas no Web.config.
A instrução a seguir demonstra a sintaxe geral usada para criptografar uma seção de configuração com a ferramenta de linha de comando aspnet_regiis.exe.
aspnet_regiis.exe -pef section physical_directory -prov provider
é a seção de configuração a ser criptografada (como connectionStrings), a physical_directory é o caminho físico completo para o diretório raiz do aplicativo Web e provider é o nome do provedor de configuração protegido a ser usado (como DataProtectionConfigurationProvider ). Como alternativa, se o aplicativo Web estiver registrado no IIS, você poderá inserir o caminho virtual em vez do caminho físico usando a seguinte sintaxe:
aspnet_regiis.exe -pe section -app virtual_directory -prov provider
O exemplo a seguir aspnet_regiis.exe criptografa a <connectionStrings> seção usando o provedor DPAPI com uma chave no nível da máquina:
aspnet_regiis.exe -pef
"connectionStrings" "C:\Websites\ASPNET_Data_Tutorial_73_VB"
-prov "DataProtectionConfigurationProvider"
Da mesma forma, a ferramenta de linha de comando aspnet_regiis.exe pode ser usada para descodificar seções de configuração. Em vez de usar o -pef interruptor, use -pdf (ou em vez de -pe, use -pd). Além disso, note que o nome do provedor não é necessário ao desencriptar.
aspnet_regiis.exe -pdf section physical_directory
-- or --
aspnet_regiis.exe -pd section -app virtual_directory
Observação
Como estamos usando o provedor DPAPI, que usa chaves específicas para o computador, você deve executar aspnet_regiis.exe a partir da mesma máquina a partir da qual as páginas da Web estão sendo servidas. Por exemplo, se você executar esse programa de linha de comando a partir de sua máquina de desenvolvimento local e, em seguida, carregar o arquivo de Web.config criptografado para o servidor de produção, o servidor de produção não poderá descriptografar as informações da cadeia de conexão, pois elas foram criptografadas usando chaves específicas para sua máquina de desenvolvimento. O provedor RSA não tem essa limitação, pois é possível exportar as chaves RSA para outra máquina.
Noções básicas sobre opções de autenticação de banco de dados
Antes que qualquer aplicativo possa emitir SELECT, INSERT, UPDATEou DELETE consultas a um banco de dados do Microsoft SQL Server, o banco de dados primeiro deve identificar o solicitante. Esse processo é conhecido como autenticação e o SQL Server fornece dois métodos de autenticação:
-
Autenticação do Windows - o processo sob o qual o aplicativo está sendo executado é usado para se comunicar com o banco de dados. Ao executar um aplicativo ASP.NET por meio do Visual Studio 2005 s ASP.NET Development Server, o aplicativo ASP.NET assume a identidade do usuário conectado no momento. Para aplicativos ASP.NET no Microsoft Internet Information Server (IIS), ASP.NET aplicativos geralmente assumem a identidade de
domainName``\MachineNameoudomainName``\NETWORK SERVICE, embora isso possa ser personalizado. - Autenticação SQL - um ID de usuário e valores de senha são fornecidos como credenciais para autenticação. Com a autenticação SQL, o ID de usuário e a senha são fornecidos na cadeia de conexão.
A autenticação do Windows é preferível à autenticação SQL porque é mais segura. Com a autenticação do Windows, a cadeia de conexão fica livre de um nome de usuário e senha e, se o servidor Web e o servidor de banco de dados residirem em duas máquinas diferentes, as credenciais não serão enviadas pela rede em texto sem formatação. Com a autenticação SQL, no entanto, as credenciais de autenticação são codificadas na cadeia de conexão e são transmitidas do servidor Web para o servidor de banco de dados em texto sem formatação.
Estes tutoriais usaram a autenticação do Windows. Você pode saber qual modo de autenticação está sendo usado inspecionando a cadeia de conexão. A cadeia de conexão para os nossos tutoriais em Web.config tem sido:
Data Source=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\NORTHWND.MDF; Integrated Security=True; User Instance=True
O Integrated Security=True e a falta de um nome de usuário e senha indicam que a autenticação do Windows está sendo usada. Em algumas cadeias de conexão, o termo Conexão Confiável=Sim ou Segurança Integrada=SSPI é usado em vez de Segurança Integrada=True, mas todos os três indicam o uso da autenticação do Windows.
O exemplo a seguir mostra uma cadeia de conexão que usa autenticação SQL. Observe as credenciais incorporadas na cadeia de conexão:
Server=serverName; Database=Northwind; uid=userID; pwd=password
Imagine que um invasor é capaz de visualizar o arquivo do Web.config seu aplicativo. Se você usar a autenticação SQL para se conectar a um banco de dados acessível pela Internet, o invasor poderá usar essa cadeia de conexão para se conectar ao seu banco de dados por meio do SQL Management Studio ou de ASP.NET páginas em seu próprio site. Para ajudar a mitigar essa ameaça, criptografe as informações da cadeia de conexão usando Web.config o sistema de configuração protegido.
Observação
Para obter mais informações sobre os diferentes tipos de autenticação disponíveis no SQL Server, consulte Criando aplicativos de ASP.NET seguros: autenticação, autorização e comunicação segura. Para obter mais exemplos de cadeia de conexão ilustrando as diferenças entre a sintaxe de autenticação do Windows e do SQL, consulte ConnectionStrings.com.
Resumo
Por padrão, os arquivos com uma .config extensão em um aplicativo ASP.NET não podem ser acessados por meio de um navegador. Esses tipos de arquivos não são retornados porque podem conter informações confidenciais, como cadeias de conexão de banco de dados, nomes de usuário e senhas, e assim por diante. O sistema de configuração protegido no .NET 2.0 ajuda a proteger ainda mais as informações confidenciais, permitindo que as seções de configuração especificadas sejam criptografadas. Há dois provedores de configuração protegidos internos: um que usa o algoritmo RSA e outro que usa a API de Proteção de Dados do Windows (DPAPI).
Neste tutorial, analisamos como criptografar e descriptografar definições de configuração usando o provedor DPAPI. Isso pode ser feito tanto programaticamente, como vimos na Etapa 2, quanto através da ferramenta de linha de comando, que foi abordada aspnet_regiis.exe na Etapa 3. Para obter mais informações sobre como usar chaves de nível de usuário ou usar o provedor RSA, consulte os recursos na seção Leitura adicional.
Feliz Programação!
Leitura adicional
Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos:
- Criando um aplicativo de ASP.NET seguro: autenticação, autorização e comunicação segura
-
Criptografando
Web.configvalores no ASP.NET 2.0 - Como: Criptografar seções de configuração no ASP.NET 2.0 usando DPAPI
- Como: Criptografar seções de configuração no ASP.NET 2.0 usando RSA
- A API de configuração no .NET 2.0
- Proteção de dados do Windows
Sobre o Autor
Scott Mitchell, autor de sete livros sobre ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias Web da Microsoft desde 1998. Scott trabalha como consultor, formador e escritor independente. Seu último livro é Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Ele pode ser contatado em mitchell@4GuysFromRolla.com.
Um agradecimento especial a
Esta série de tutoriais foi revisada por muitos revisores úteis. Os principais revisores deste tutorial foram Teresa Murphy e Randy Schmidt. Interessado em rever meus próximos artigos do MSDN? Se for o caso, envie-me uma mensagem para mitchell@4GuysFromRolla.com.