Usando a criptografia para proteger senhas

por Saad Ladki

Introdução

Este documento fornece uma visão geral das etapas necessárias para definir o isolamento do pool de aplicativos e do processo de trabalho para servidores IIS 7.0 e superiores. O isolamento do pool de aplicativos envolve a proteção dos dados que o WAS (o processo do sistema local do IIS) precisa acessar. Um exemplo desses dados são as senhas do pool de aplicativos. O isolamento do processo do trabalho, por outro lado, implica a proteção dos dados que a identidade do pool de aplicativos precisa acessar. Um exemplo desses dados é a senha da conta do usuário anônimo.

Pré-requisitos

Para ajudar a simplificar esse processo, são fornecidos dois exemplos de código que:

  • Cria um novo provedor de criptografia RSA em machine.config.
  • Define o nome do provedor padrão em machine.config.

A última seção de pré-requisitos orienta você na configuração de quatro contas de usuário que serão usadas em tópicos posteriores.

Criando um novo aplicativo do provedor de criptografia RSA

  1. Abra o Bloco de Notas do Windows e crie um arquivo em um diretório de sua escolha chamado createProvider.cs que contenha o seguinte código C#:

    using System;
    using Microsoft.Web.Administration;
    using System.Configuration;
    
    namespace testingEncryption
    {   
        public class createProvider   
        {
            public static void Main(string[] args)
            {
                String keyContainerName = args[0];
                String description = args[1];
                String providerName = args[2];
                System.Configuration.Configuration machineConfig =
                System.Configuration.ConfigurationManager.OpenMachineConfiguration();
                System.Configuration.ProviderSettings settings =
                    new System.Configuration.ProviderSettings(providerName,
                    "System.Configuration.RsaProtectedConfigurationProvider,
                    System.Configuration,
                    Version=2.0.0.0, Culture=neutral,
                    PublicKeyToken=b03f5f7f11d50a3a");
                settings.Parameters["description"] = description;
                settings.Parameters["keyContainerName"] = keyContainerName;
                settings.Parameters["cspProviderName"] = String.Empty;
                settings.Parameters["useMachineContainer"] = "true";
                settings.Parameters["useOAEP"] = "false";
                settings.Parameters["name"] = providerName;
                ProtectedConfigurationSection pcSection =
                    (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection ("configProtectedData");
                pcSection.Providers.Add(settings);
                machineConfig.Save();
            }
        }
    }
    
  2. Em seguida, inicie um prompt de comandos com privilégios elevados:

    • Clique no menu Iniciar.
    • Clique com o botão direito do mouse em Prompt de Comando.
    • Selecione Executar como administrador.
  3. Na janela do prompt de comando, navegue até o local em que você salvou o arquivo createProvider.cs e execute o seguinte comando para compilar o código:
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll createProvider.cs

Esta etapa está concluída.

Criação de um aplicativo para alterar o provedor padrão

  1. Abra o Bloco de Notas do Windows e crie um arquivo em um diretório de sua escolha chamado setProvider.cs que contenha o seguinte código C#:

    using System;
    using Microsoft.Web.Administration;
    using System.Configuration;
    namespace testingEncryption 
    {
        public class setProvider
        {
            public static void Main(string[] args)
            {
                String provider = args[0];  // example: DataProtectionConfigurationProvider
                System.Configuration.Configuration machineConfig =
                    System.Configuration.ConfigurationManager.OpenMachineConfiguration();
                ProtectedConfigurationSection pcSection =
                    (System.Configuration.ProtectedConfigurationSection)machineConfig.GetSection("configProtectedData");
                string oldEncryptionProviderName = pcSection.DefaultProvider;
                Console.WriteLine("The default provider is currently: " + oldEncryptionProviderName);
                Console.WriteLine("Changing the default provider to: " + provider);
                pcSection.DefaultProvider = provider;
                machineConfig.Save();
            }
        }
    }
    
  2. Em seguida, inicie um prompt de comandos com privilégios elevados:

    • Clique no menu Iniciar.
    • Clique com o botão direito do mouse em Prompt de Comando.
    • Selecione Executar como administrador.
  3. Na janela do prompt de comando, navegue até o local em que você salvou o arquivo setProvider.cs e execute o seguinte comando para compilar o código:
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll setProvider.cs

Esta etapa está concluída.

Criando contas de usuário

Nesta etapa, criamos quatro novas contas de usuário que serão usadas ao longo deste documento.

Para começar, abra uma janela do shell de comando executada com direitos administrativos usando as etapas a seguir:

  1. Clique no menu Iniciar.
  2. Clique com o botão direito do mouse em Prompt de Comando.
  3. Selecione Executar como administrador.
  4. Na janela de comando, execute os seguintes comandos:
net user /add AppPoolIdentity1 password1
   net user /add AppPoolIdentity2 password2
   net user /add AnonymousAccount1 password3
   net user /add AnonymousAccount2 password

Esta etapa está concluída.

Isolamento do pool de aplicativos

O IIS tem um processo chamado WAS que é executado no contexto de LOCALSYSTEM e é o único processo que precisa acessar as senhas do pool de aplicativos. Nessa tarefa, nós:

  • Criaremos uma nova chave RSA (iisWasKey) à qual somente LOCALSYSTEM e Administradores tenham acesso. Essa chave será usada para criptografar as senhas de cada pool de aplicativos.
  • Crie dois pools de aplicativos.
  • Configure cada um desses pools de aplicativos para serem executados com identidades diferentes e criptografe suas senhas usando o iisWasKey.
  • Restrinja as permissões do sistema de arquivos NTFS nos arquivos principais para que somente SYSTEM e Administradores tenham acesso.

Crie a nova chave RSA

  1. Clique no menu Iniciar.
  2. Clique com o botão direito do mouse em Prompt de Comando.
  3. Selecione Executar como administrador.
  4. Na janela de comando, navegue até o local em que você salvou o createProvider.exe e execute o seguinte comando:
createProvider.exe iisWasKey RsaKeyForWAS Rsa_WAS

Verifique se essas alterações ocorreram corretamente. Abra seu %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\config\machine.config usando o Bloco de Notas do Windows e verifique se as linhas da seção estão presentes no novo provedor:

keyContainerName="NetFrameworkConfigurationKey" cspProviderName=""
useMachineContainer="true" useOAEP="false" name="RsaProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,

Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
useMachineProtection="true" keyEntropy="" name="DataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

cspProviderName="" useMachineContainer="true" useOAEP="false"
name="Rsa_WAS"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />

Criptografar as senhas do pool de aplicativos

Por padrão, sempre que uma propriedade é criptografada, o IIS usa o defaultProvider para a criptografia definida em machine.config. O valor padrão para isso é RsaProtectedConfigurationProvider.

Nesta etapa, usamos o aplicativo setProvider.exe criado anteriormente para alterar o provedor para iisWasKey e, em seguida, usaremos o IIS Manager para alterar as senhas:

  1. Clique no menu Iniciar.
  2. Clique com o botão direito do mouse em Prompt de Comando.
  3. Selecione Executar como administrador.
  4. Na janela de comando, navegue até o local em que você salvou o setProvider.exe e execute o seguinte comando:
setProvider.exe Rsa_WAS

O provedor padrão Rsa_WAS foi alterado com êxito.

Criar novos pools de aplicativos

Nesta etapa, criamos dois novos pools de aplicativos que isolamos um do outro. Para fazer isso, inicie o Gerenciador do IIS:

  1. Clique em Iniciar, digite 'INetMgr.exe' e pressione Enter (se solicitado, selecione Continuar para elevar suas permissões).

  2. Clique no botão + ao lado do nome do computador na seção Conexões.

  3. Clique em Pools de Aplicativos.

  4. Selecione a tarefa à direita intitulada Adicionar Pool de Aplicativos.

  5. Insira o Nome 'AppPool1' e pressione OK, conforme mostrado:

    Screenshot of the Add Application Pool dialog box with a focus on the O K option.

  6. Repita as etapas anteriores, mas desta vez use o nome AppPool2.

  7. Agora você verá a seguinte tela no IIS:
    Screenshot of the Application Pools screen showing a list of application pools on the server.

  8. Observe como a identidade de AppPool1 e AppPool2 é NetworkService. Para alterar as contas que criamos anteriormente, clique com o botão direito do mouse em AppPool1 e selecione Configurações Avançadas

  9. Sob o título Modelo de Processo:

    • Clique no botão à direita das palavras Identidade.

    • Na janela Identidade do Pool de Aplicativos, selecione o botão de opção "Conta personalizada" e clique no botão "Definir...".

    • Insira o nome de usuário e a senha a seguir na caixa de diálogo Definir Credenciais.

      nome de usuário: AppPoolIdentity1
      senha: password1

      Screenshot of the Set Credentials dialog, showing the User name, Password, and Confirm password fields.

  10. Agora, o valor da Identidade deve aparecer conforme mostrado abaixo:

    Screenshot of the Advanced Settings dialog box with the Identity value being highlighted in the Process Model section.

  11. Clique em OK para salvar suas alterações.

  12. Repita a etapa anterior para AppPool2 e use o nome de usuário "AppPoolIdentity2" e a senha "password2".

  13. Você vê o seguinte exibido no Gerenciador do IIS (principalmente as Identidades para os pools de aplicativos que foram alteradas):

    Screenshot of the Application Pools showing the changed identities for the applications pools.

  14. Verifique as alterações usando o Bloco de Notas do Windows e abrindo o arquivo %SystemRoot%\System32\Inetsrv\applicationHost.config. Navegue até a seção applicationPools e veja que criptografamos as senhas do pool de aplicativos usando a chave Rsa_WAS, conforme pretendido:

    password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAAUkBfhWFbUHIt/qtlo+P7CiZC10r9H0DGBvAl
                 U2mhiOxMoHXX6Dz0S8TQjKx2YTKvuE8y+SBUWrEs3JYzXKOkY45Q9z6E/3BFvru5oR9uzbjInASKF/83N
                 N1tIEsoorQWmUOjnL4XM9RNzpqkY6TgyC3CyPUGN9fR7li5+AUupHHfgVPMzcLHfCsoq+ri+X6IbEnJdu
                  cUEAYBn1P9F/Zxk=:enc]" />
                  password="[enc:Rsa_WAS:jAAAAAECAAADZgAAAKQAAEbQEa/sAmyLbryAR0hD3voip2+0RfzM44sXPekp
                  I2H7HYLzta55NfLcG8vSPHhasahKVgO4wcIcT03CLSn+5koWvAaIRdeClhXWK/X8ZQPFooOpyhOqT0TEP5v
                  jB+DXAKgq0RC6ufHFtrHMy0U69ew7/49YXEcrkF+o8OJZ1K+EkgA3J2ikHKxW0pFBU0tFvLCjt2/UXypfNI
                  0hYPe2syk=:enc]" />
    

Bloquear os Provedores de Criptografia

Por padrão, o IIS_IUSRS recebe acesso de leitura às chaves quando elas são criadas. No entanto, você pode usar a ferramenta ASPNET_REGIIS para remover esse acesso. Para fazer isso, execute os seguintes comandos no prompt de comandos com privilégios elevados:

cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr iisWasKey IIS_IUSRS

Isso removeu o IIS_IUSRS (o grupo de identidades do pool de aplicativos) da capacidade de leitura do iisWasKey, que se destina apenas ao acesso de Administradores e LOCALSYSTEM.

Isolamento do processo de trabalho

Este tópico explica como configurar o isolamento do processo de trabalho criando dois novos sites que fazem parte de pools de aplicativos diferentes e têm identidades de autenticação anônima diferentes. Em seguida, criamos um novo provedor RSA para cada pool de aplicativos para criptografar as senhas anônimas.

Criar novos sites

Nesta seção, criamos dois novos sites e adicionamos cada site a um pool de aplicativos que criamos anteriormente. Para começar, abra um shell de comando executado com direitos administrativos usando as etapas a seguir:

  1. Clique no menu Iniciar.

  2. Clique com o botão direito do mouse em Prompt de Comando.

  3. Selecione Executar como administrador.

  4. Na janela de comando, navegue até o diretório wwwroot usando o seguinte comando:

    cd /d %SystemDrive%\inetpub\wwwroot
    
  5. Crie um novo diretório chamado "one" e um diretório "two" usando os seguintes comandos:

    mkdir one
    
    mkdir two
    
  6. Crie um arquivo básico Default.htm nos diretórios "one" e "two" que contenha o seguinte código HTML:

    <html><body>Hello from site X</body></html>
    

    Observação

    Substitua "X" por "one" ou "two", dependendo do local do diretório do arquivo.

Agora, use o gerenciador do IIS para criar dois sites:

  1. Clique em Iniciar, digite INetMgr.exe e pressione Enter (se for solicitado, selecione Continuar para elevar suas permissões).

  2. Clique no botão + ao lado do nome do computador na seção Conexões.

  3. Clique com o botão direito do mouse em Site no modo de exibição de árvore, em Conexões e selecione Adicionar site.

  4. Use as informações a seguir para criar seu site:

    Nome do site: One
    Pool de aplicativos: AppPool1
    Caminho físico: {localização do seu diretório inetpub}\wwwroot\one
    Porta: 81

    Quando concluído, ele deverá ter a seguinte aparência:

    Screenshot of the Add Web Site dialog with the Site name field being populated by the One entry.

  5. Clique em OK para salvar as alterações.

  6. Repita as duas etapas anteriores, mas, desta vez, use as seguintes informações para o segundo site:

    Nome do site: Two
    Pool de aplicativos: AppPool2
    Caminho Físico: {localização do seu diretório inetpub}\wwwroot\two
    Porta: 82

Agora você criou dois novos sites chamados One e Two e os adicionou aos pools de aplicativos AppPool1 e AppPool2.

As URLs para testar seus sites são:

  • http://localhost:81 para o site One
  • http://localhost:82 para o site Two

Criar novos provedores para cada pool de aplicativos

Nesta seção, criaremos um novo provedor RSA para cada um dos pools de aplicativos:

  1. Clique no menu Iniciar.

  2. Clique com o botão direito do mouse em Prompt de Comando.

  3. Selecione Executar como administrador.

  4. Na janela de comando execute, navegar até o local em que você salvou o createProvider.exe e execute o seguinte comando:

    createProvider.exe App1Key RsaKeyForAppPool1 Rsa_app1
    createProvider.exe App2Key RsaKeyForAppPool2 Rsa_app2
    

Definir a conta anônima para o Site One

Em sua janela do prompt de comandos com privilégios elevados, execute o seguinte comando:

setProvider.exe Rsa_app1
  1. Volte ao Gerenciador do IIS e clique duas vezes no site One.

  2. Clique duas vezes no item Autenticação sob o título Nome do Recurso.

  3. Selecione Autenticação anônima e clique em Editar sob o título Tarefas no lado direito, o que abrirá a caixa de diálogo Editar Credenciais de Autenticação Anônima.

  4. Clique na opção Usuário Específico e, em seguida, no botão Configurar.

  5. Insira o nome de usuário AnonymousAccount1 e a senha password3 e selecione OK.

  6. Isso abre a seguinte caixa de diálogo:

    Screenshot of the Edit Anonymous Authentication Credentials dialog box.

  7. Pressione OK para salvar as alterações.

Defina a conta anônima para o Site Two

Em sua janela do prompt de comandos com privilégios elevados, execute o seguinte comando:

setProvider.exe Rsa_app2
  1. Volte ao Gerenciador do IIS e clique duas vezes no site Two.
  2. Clique duas vezes no item Autenticação sob o título Nome do Recurso.
  3. Selecione Autenticação Anônima e clique em Editar sob o título Tarefas no lado direito, o que abrirá a caixa de diálogo Editar Credenciais Anônimas.
  4. Clique na opção Usuário específico e clique em Configurar.
  5. Insira o nome de usuário AnonymousAccount2 e a senha password4 e selecione OK.
  6. Clique em OK para salvar suas alterações.

Redefina o provedor de criptografia para o padrão

  • Retorne à janela do prompt de comandos com privilégios elevados e execute o seguinte comando:
setProvider.exe RsaProtectedConfigurationProvider

Observação

Essa alteração garante que todas as propriedades futuras criptografadas usem o provedor de criptografia padrão.

Verificar as alterações

Verificar se o que queríamos aconteceu de fato. Usando o Bloco de Notas do Windows, abra o arquivo %SystemRoot%\System32\Inetsrv\applicationHost.config:

  • Observe que as senhas de AppPool1 e AppPool2 ainda estão protegidas com a chave Rsa_Was.

  • Observe que a senha de AnonymousAccount1 também está protegida com a chave Rsa_app1:

    password="[enc:Rsa_app1:jAAAAAECAAADZgAAAKQAAKoz4LV7HyPQuyNzXh8gspB0rPG7j3Ijvn3d+jY3/f
        gma8ZxA7AHLUxjis9b0+Qu8XkLvsGn/A+F+m1O68gY1LkWzAcSW9ks81FuiBVhpZx73FzEo6aOz2QqBduJ7Xhu
        x923KMBqmwkIVJ0mVAdzwFIm6LWymwRXxNxDE4eosKsw6QP6Rd6duC8gckaLxrTndclErQYgGdMt3W6ofxzRMlc=:enc]" />
    
  • Por fim, observe que a senha AnonymousAccount2 também está protegida com a chave Rsa_app2:

    password="[enc:Rsa_app2:jAAAAAECAAADZgAAAKQAAKmHMhCTICEUhGncSGCxQc6ll/QGXo0asEIzOf3rIjl
     sBDGRYhlDQWlf2QbFcIsBGYt8dHo9hzAQN/f03BPSlaFynevpSx4xJOg2/B8ATgPmCg4vgxpY5huZbGxongs55c
       Rr20WFXsxzlUuw1xoUZI8c1+7gQPOtF0Rwh1g8NBmb5ML/R3jAIFcMtVhaj0OOIfAP7JCjdInwztBqK0XO7FM=:enc]" />
    

Bloquear os Provedores de Criptografia

Proteja as permissões de arquivo para nossas chaves, conforme feito anteriormente. Execute os seguintes comandos no prompt de comandos com privilégios elevados:

cd /d %systemroot%
cd Microsoft.NET\Framework\v2.0.50727
aspnet_regiis.exe -pr App1Key IIS_IUSRS
aspnet_regiis.exe -pa App1Key   AppPoolIdentity1
aspnet_regiis.exe -pr App2Key IIS_IUSRS
aspnet_regiis.exe -pa App2Key   AppPoolIdentity2

Esses comandos removeram a capacidade do IIS_IUSRS de leitura das chaves e adicionaram apenas a identidade do pool de aplicativos que precisa de permissão de acesso às chaves.

Testando seus sites

Agora teste seus sites:

  • http://localhost:81
  • http://localhost:82

Tudo deve continuar funcionando como antes.

Resumo

Em resumo, realizamos as seguintes tarefas para proteger as configurações do pool de aplicativos:

  • Foram criados dois pools de aplicativos
  • Foram criadas duas contas de usuário locais e configuradas como as identidades do pool de aplicativos
  • Criamos uma chave de criptografia de administração e a usamos para proteger todas as senhas de identidades do pool de aplicativos
  • Usamos o ASPNET_REGIIS para remover o IIS_IUSRS (o grupo de identidades do pool de aplicativos) do acesso à chave

Essas tarefas garantiram efetivamente que apenas as contas Administradores e SYSTEM pudessem ler as senhas dos pools de aplicativos. Portanto, se os aplicativos de um pool de aplicativos tentassem recuperar as senhas do seu (ou de qualquer) pool de aplicativos, a tentativa falharia.

Para isolar as configurações do processo de trabalho, nós:

  • Criamos uma nova conta de identidade anônima
  • Criamos um novo provedor para o pool de aplicativos
  • Criptografamos a senha de autenticação anônima com a chave do pool de aplicativos
  • Removemos o acesso ao provedor de autenticação anônima para IIS_IUSRS e concedemos acesso apenas à identidade do pool de aplicativos

Isso garantiu efetivamente que a identidade do pool de aplicativos possa descriptografar a senha anônima à qual pertence e a mais ninguém.