Uso del cifrado para proteger contraseñas

por Saad Ladki

Introducción

En este documento se proporciona información general sobre los pasos necesarios para establecer el aislamiento del grupo de aplicaciones y del proceso de trabajo para los servidores IIS 7.0 y versiones posteriores. El aislamiento del grupo de aplicaciones implica proteger los datos a los que necesita acceder WAS (el proceso del sistema local de IIS). Un ejemplo de estos datos es las contraseñas del grupo de aplicaciones. El aislamiento del proceso de trabajo, por otro lado, implica proteger los datos a los que necesita acceder la identidad del grupo de aplicaciones. Un ejemplo de estos datos es la contraseña de la cuenta de usuario anónima.

Requisitos previos

Para ayudar a simplificar este proceso, se proporcionan dos fragmentos de código de ejemplo que:

  • Crean un nuevo proveedor de cifrado RSA en machine.config.
  • Establecen el nombre del proveedor predeterminado en machine.config.

La sección de requisitos previos final le guía en la configuración de cuatro cuentas de usuario que se usarán en temas posteriores.

Creación de una nueva aplicación de proveedor de cifrado RSA

  1. Abra el Bloc de notas de Windows y cree un archivo en un directorio de su elección denominado createProvider.cs que contenga el siguiente código de 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. A continuación, inicie un símbolo del sistema con privilegios elevados:

    • Haga clic en el menú Inicio.
    • Haga clic con el botón derecho en símbolo del sistema.
    • Seleccione Ejecutar como administrador.
  3. En la ventana del símbolo del sistema, vaya a la ubicación donde guardó el archivo createProvider.cs y ejecute el siguiente comando para compilar el código:
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll createProvider.cs

Este paso ya está completo.

Creación de una aplicación para cambiar el proveedor predeterminado

  1. Abra el Bloc de notas de Windows y cree un archivo en un directorio de su elección denominado setProvider.cs que contenga el siguiente código de 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. A continuación, inicie un símbolo del sistema con privilegios elevados:

    • Haga clic en el menú Inicio.
    • Haga clic con el botón derecho en símbolo del sistema.
    • Seleccione Ejecutar como administrador.
  3. En la ventana del símbolo del sistema, vaya a la ubicación en la que guardó el archivo setProvider.cs y ejecute el siguiente comando para compilar el código:
    %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\csc.exe /reference:%SystemRoot%\System32\inetsrv\Microsoft.Web.Administration.dll setProvider.cs

Este paso ya está completo.

Creación de cuentas de usuario

En este paso, creamos cuatro cuentas de usuario nuevas que se usarán en este documento.

Para empezar, abra una ventana del shell de comandos que se ejecute con derechos administrativos mediante los pasos siguientes:

  1. Haga clic en el menú Inicio.
  2. Haga clic con el botón derecho en Símbolo del sistema.
  3. Seleccione Ejecutar como administrador.
  4. En la ventana de comandos, ejecute los siguientes comandos:
net user /add AppPoolIdentity1 password1
   net user /add AppPoolIdentity2 password2
   net user /add AnonymousAccount1 password3
   net user /add AnonymousAccount2 password

Este paso ya está completo.

Aislamiento del grupo de aplicaciones

IIS tiene un proceso denominado WAS que se ejecuta bajo el contexto de LOCALSYSTEM y es el único proceso que necesita acceso a las contraseñas del grupo de aplicaciones. En esta tarea, hacemos lo siguiente:

  • Crear una nueva clave RSA (iisWasKey) a la que solo tengan acceso LOCALSYSTEM y los Administradores. Esta clave se usará para cifrar las contraseñas de cada grupo de aplicaciones.
  • Crear dos grupos de aplicaciones.
  • Configurar cada uno de estos grupos de aplicaciones para que se ejecuten en identidades diferentes y cifrar sus contraseñas mediante iisWasKey.
  • Restringir los permisos del sistema de archivos NTFS en los archivos de clave, por lo que solo los administradores y SYSTEM tienen acceso.

Creación de una nueva clave RSA

  1. Haga clic en el menú Inicio.
  2. Haga clic con el botón derecho en Símbolo del sistema.
  3. Seleccione Ejecutar como administrador.
  4. En la ventana de comandos, vaya a donde guardó createProvider.exe y ejecute el siguiente comando:
createProvider.exe iisWasKey RsaKeyForWAS Rsa_WAS

Compruebe que estos cambios se han producido correctamente. Abra %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\config\machine.config con el Bloc de notas de Windows y compruebe que las líneas de la sección están presentes para el nuevo proveedor:

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" />

Cifrado de las contraseñas del grupo de aplicaciones

De forma predeterminada, cada vez que se cifra una propiedad, IIS usa defaultProvider para el cifrado definido en machine.config. El valor predeterminado para esto es RsaProtectedConfigurationProvider.

En este paso, usamos la aplicación setProvider.exe creada anteriormente para cambiar el proveedor a iisWasKey y, a continuación, usamos el Administrador de IIS para cambiar las contraseñas:

  1. Haga clic en el menú Inicio.
  2. Haga clic con el botón derecho en Símbolo del sistema.
  3. Seleccione Ejecutar como administrador.
  4. En la ventana de comandos, vaya a donde guardó setProvider.exe y ejecute el siguiente comando:
setProvider.exe Rsa_WAS

El proveedor predeterminado Rsa_WAS se ha cambiado correctamente.

Creación de nuevos grupos de aplicaciones

En este paso, se crean dos nuevos grupos de aplicaciones que se aíslan entre sí. Para ello, inicie el Administrador de IIS:

  1. Haga clic en Inicioy escriba "INetMgr.exe" y presione Entrar (si se le solicita, seleccione Continuar para elevar los permisos).

  2. Haga clic en el botón + situado junto al nombre de la máquina en la sección Conexiones.

  3. Haga clic en Grupos de aplicaciones.

  4. Seleccione la tarea de la derecha titulada Agregar grupo de aplicaciones.

  5. Escriba el nombre "AppPool1" y presione Aceptar como se muestra:

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

  6. Repita los pasos anteriores, pero esta vez use el nombre AppPool2.

  7. Ahora verá la siguiente pantalla en IIS:
    Screenshot of the Application Pools screen showing a list of application pools on the server.

  8. Observe cómo la identidad de AppPool1 y AppPool2 son NetworkService. Cambiaremos esta opción para que sea las cuentas que creamos anteriormente; para ello, haga clic con el botón derecho en AppPool1 y, a continuación, seleccione Configuración avanzada

  9. En el título Modelo de proceso:

    • Haga clic en el botón situado a la derecha de las palabras Identidad.

    • En la ventana Identidad del grupo de aplicaciones, seleccione el botón de radio "Cuenta personalizada" y haga clic en el botón "Establecer...".

    • Escriba el siguiente nombre de usuario y contraseña en el cuadro de diálogo Establecer credenciales.

      nombre de usuario: AppPoolIdentity1
      contraseña: password1

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

  10. Ahora el valor de identidad debe aparecer como se muestra a continuación:

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

  11. Haga clic en Aceptar para guardar los cambios.

  12. Repita el paso anterior para AppPool2 y use el nombre de usuario "AppPoolIdentity2" y la contraseña "password2".

  13. Verá que aparece lo siguiente en el Administrador de IIS (principalmente las identidades de los grupos de aplicaciones han cambiado):

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

  14. Compruebe los cambios mediante el Bloc de notas de Windows y abra el archivo %SystemRoot%\System32\Inetsrv\applicationHost.config. Vaya a la sección applicationPools y verá que ciframos las contraseñas del grupo de aplicaciones mediante la clave Rsa_WAS según lo previsto:

    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]" />
    

Bloqueo de los proveedores de cifrado

De forma predeterminada, el IIS_IUSRS tiene acceso de lectura a las claves cuando se crean. Sin embargo, puede usar la herramienta ASPNET_REGIIS para quitar ese acceso. Para ello, ejecute los siguientes comandos desde el símbolo del sistema con privilegios elevados:

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

Esto hizo que IIS_IUSRS (el grupo de identidades del grupo de aplicaciones) no pudiera leer iisWasKey, que está pensado solo para el acceso administradores y LOCALSYSTEM.

Aislamiento de proceso de trabajo

En este tema se explica cómo configurar el aislamiento del proceso de trabajo mediante la creación de dos nuevos sitios que forman parte de grupos de aplicaciones diferentes y que tienen identidades de autenticación anónimas diferentes. A continuación, creamos un nuevo proveedor RSA para cada grupo de aplicaciones para cifrar las contraseñas anónimas.

Creación de nuevos sitios

En esta sección, creamos dos nuevos sitios y agregamos cada sitio a un grupo de aplicaciones que creamos anteriormente. Para empezar, abra un shell de comandos que se ejecute con derechos administrativos mediante los pasos siguientes:

  1. Haga clic en el menú Inicio.

  2. Haga clic con el botón derecho en símbolo del sistema.

  3. Seleccione Ejecutar como administrador.

  4. En la ventana de comandos, vaya al directorio wwwroot mediante el siguiente comando:

    cd /d %SystemDrive%\inetpub\wwwroot
    
  5. Cree un nuevo directorio denominado "uno" y un directorio "dos" con los siguientes comandos:

    mkdir one
    
    mkdir two
    
  6. Cree un archivo Default.htm básico en los directorios "uno" y "dos" que contienen el código HTML siguiente:

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

    Nota:

    Reemplace "X" por "uno" o "dos" en función de la ubicación del directorio del archivo.

Ahora use el administrador de IIS para crear dos sitios:

  1. Haga clic en Inicio y escriba "INetMgr.exe" y presione Entrar (si se le solicita, seleccione Continuar para elevar los permisos).

  2. Haga clic en el botón + situado junto al nombre de la máquina en la sección Conexiones.

  3. Haga clic con el botón derecho en Sitio en la vista de árbol en Conexiones y, a continuación, seleccione Agregar sitio web.

  4. Use la siguiente información para crear el sitio:

    Nombre del sitio web: uno
    Grupo de aplicaciones: AppPool1
    Ruta de acceso física: {ubicación del directorio inetpub}\wwwroot\uno
    Puerto: 81

    Esto debería ser similar al siguiente cuando se complete:

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

  5. Haga clic en Aceptar para guardar los cambios.

  6. Repita los dos pasos anteriores, pero esta vez use la siguiente información para el segundo sitio:

    Nombre del sitio web: dos
    Grupo de aplicaciones: AppPool2
    Ruta de acceso física: {ubicación del directorio inetpub}\wwwroot\dos
    Puerto: 82

Ahora ha creado dos sitios nuevos denominados Uno y Dos y los ha agregado a los grupos de aplicaciones AppPool1 y AppPool2.

Las direcciones URL para probar los sitios son:

  • http://localhost:81 para el sitio Uno
  • http://localhost:82 para el sitio Dos

Creación de nuevos proveedores para cada grupo de aplicaciones

En esta sección, creamos un nuevo proveedor RSA para cada uno de los grupos de aplicaciones:

  1. Haga clic en el menú Inicio.

  2. Haga clic con el botón derecho en símbolo del sistema.

  3. Seleccione Ejecutar como administrador.

  4. En la ventana de comandos, vaya a donde guardó createProvider.exe y ejecute el siguiente comando:

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

Establecimiento de la cuenta anónima para el sitio uno

En la ventana del símbolo del sistema con privilegios elevados, ejecute el siguiente comando:

setProvider.exe Rsa_app1
  1. Vuelva al Administrador de IIS y haga doble clic en el sitio Uno.

  2. Haga doble clic en el elemento Autenticación en el encabezado Nombre de la característica.

  3. Seleccione Autenticación anónima y, a continuación, haga clic en Editar en el encabezado Tareas del lado derecho, que abre el cuadro de diálogo Editar credenciales de autenticación anónima.

  4. Haga clic en la opción Usuario específico y, a continuación, haga clic en el botón Establecer.

  5. Escriba el nombre de usuario AnonymousAccount1 y la contraseña password3 y seleccione Aceptar.

  6. Esto abre el siguiente cuadro de diálogo:

    Screenshot of the Edit Anonymous Authentication Credentials dialog box.

  7. Presione Aceptar para guardar los cambios.

Establecimiento de la cuenta anónima para el sitio dos

En la ventana del símbolo del sistema con privilegios elevados, ejecute el siguiente comando:

setProvider.exe Rsa_app2
  1. Vuelva al Administrador de IIS y haga doble clic en el sitio Dos.
  2. Haga doble clic en el elemento Autenticación en el encabezado Nombre de la característica.
  3. Seleccione Autenticación anónima y, a continuación, haga clic en Editar en el encabezado Tareas del lado derecho, que abre el cuadro de diálogo EditarCredenciales de autenticación anónima.
  4. Haga clic en la opción Usuario específico y haga clic en Establecer.
  5. Escriba el nombre de usuario AnonymousAccount2 y la contraseña password4 y seleccione Aceptar.
  6. Haga clic en Aceptar para guardar los cambios.

Restablecimiento del proveedor de cifrado al valor predeterminado

  • Vuelva a la ventana del símbolo del sistema con privilegios elevados y ejecute el siguiente comando:
setProvider.exe RsaProtectedConfigurationProvider

Nota:

Este cambio garantiza que todas las propiedades futuras cifradas usen el proveedor de cifrado predeterminado.

Comprobación de los cambios

Compruebe que lo que queríamos hacer sucedió. Con el Bloc de notas de Windows, abra el archivo %SystemRoot%\System32\Inetsrv\applicationHost.config:

  • Tenga en cuenta que la contraseña de AppPool1 y AppPool2 siguen protegidas con la clave Rsa_Was.

  • Tenga en cuenta que la contraseña de AnonymousAccount1 también está protegida con la clave Rsa_app1:

    password="[enc:Rsa_app1:jAAAAAECAAADZgAAAKQAAKoz4LV7HyPQuyNzXh8gspB0rPG7j3Ijvn3d+jY3/f
        gma8ZxA7AHLUxjis9b0+Qu8XkLvsGn/A+F+m1O68gY1LkWzAcSW9ks81FuiBVhpZx73FzEo6aOz2QqBduJ7Xhu
        x923KMBqmwkIVJ0mVAdzwFIm6LWymwRXxNxDE4eosKsw6QP6Rd6duC8gckaLxrTndclErQYgGdMt3W6ofxzRMlc=:enc]" />
    
  • Por último, tenga en cuenta que la contraseña AnonymousAccount2 también está protegida con la clave Rsa_app2:

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

Bloqueo de los proveedores de cifrado

Proteja los permisos de archivo para nuestras claves, como se ha hecho anteriormente. Ejecute los siguientes comandos desde el símbolo del sistema con permisos 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

Estos comandos han quitado la capacidad de IIS_IUSRS de leer las claves y agregado solo la identidad del grupo de aplicaciones que necesita permiso de acceso a las claves.

Prueba de los sitios

Ahora pruebe los sitios:

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

Todo debería seguir funcionando como lo había hecho antes.

Resumen

En resumen, hemos realizado las siguientes tareas para proteger la configuración del grupo de aplicaciones:

  • Creó dos grupos de aplicaciones
  • Creó dos cuentas de usuario locales y las configuró como identidades del grupo de aplicaciones
  • Hemos creado una clave de cifrado de administración y la hemos usado para proteger todas las contraseñas de identidades del grupo de aplicaciones
  • Usamos ASPNET_REGIIS para evitar que IIS_IUSRS (el grupo de identidades del grupo de aplicaciones) accediera a la clave

Estas tareas garantizan eficazmente que solo los administradores y las cuentas SYSTEM puedan leer las contraseñas de los grupos de aplicaciones. Por lo tanto, si las aplicaciones de un grupo de aplicaciones intentaran recuperar las contraseñas de su grupo de aplicaciones (o cualquiera), se produciría un error en el intento.

Para aislar la configuración del proceso de trabajo, hemos hecho lo siguiente:

  • Se ha creado una nueva cuenta de identidad anónima
  • Hemos creado un nuevo proveedor para el grupo de aplicaciones
  • Se ha cifrado la contraseña de autenticación anónima con la clave del grupo de aplicaciones
  • Se ha quitado el acceso al proveedor de autenticación anónimo para IIS_IUSRS y se le ha concedido acceso solo a la identidad del grupo de aplicaciones

Esto garantiza eficazmente que la identidad del grupo de aplicaciones pueda descifrar la contraseña anónima a la que pertenece también y ninguna otra.