1. Introducción
Al crear aplicaciones ASP.NET 2.0, los desarrolladores suelen almacenar información de configuración confidencial en el archivo Web.config. El ejemplo más típico es la cadena de conexión de la base de datos, pero otra información confidencial incluida en el archivo Web.config incluye información de conexión del servidor SMTP y datos de credenciales de usuario, etc. Aunque ASP.NET se puede configurar de forma predeterminada para denegar todas las solicitudes HTTP de recursos de archivos con una extensión .config, si un pirata informático puede acceder al sistema de archivos de su servidor web, aún se puede robar información confidencial. Por ejemplo, quizás haya permitido accidentalmente el acceso FTP anónimo a su sitio web, permitiendo así que un hacker simplemente descargue su archivo Web.config a través del protocolo FTP.
Afortunadamente, ASP.NET 2.0 ayuda a aliviar este problema al permitirle cifrar partes seleccionadas del archivo Web.config, como la sección
En este artículo, analizaremos cómo cifrar y descifrar mediante programación esta sección de ajustes de configuración y examinaremos el uso del programa de línea de comandos aspnet_regiis.exe. Luego evaluaremos las opciones de cifrado proporcionadas por ASP.NET 2.0. Además, analizamos brevemente cómo cifrar la información de configuración en ASP.NET versión 1.x.
2. Premisa
Antes de comenzar a analizar cómo cifrar la información de configuración de ASP.NET 2.0, recuerde los siguientes puntos:
1. Todas las formas de cifrado contienen algún tipo de secreto, y este secreto se utiliza al cifrar y descifrar datos. Los algoritmos de cifrado simétrico utilizan la misma clave al cifrar y descifrar un mensaje, mientras que los algoritmos de cifrado asimétrico utilizan claves diferentes para cifrar y descifrar. No importa qué tecnología se utilice, lo más importante es qué tan segura es la clave de descifrado.
2. La tecnología de cifrado de configuración proporcionada por ASP.NET 2.0 está diseñada para evitar que los piratas informáticos puedan recuperar sus archivos de configuración de alguna manera. La idea es que si existe su archivo Web.config en la computadora del hacker, éste no podrá descifrar la parte cifrada. Sin embargo, cuando una página ASP.NET en el servidor web solicita información de un archivo de configuración cifrado, los datos deben descifrarse antes de poder usarse (y esto sucede sin que usted escriba ningún código). Por lo tanto, si un pirata informático puede cargar una página web ASP.NET en su sistema que consulta el archivo de configuración y muestra sus resultados, entonces puede ver la configuración cifrada como texto sin formato. (Para obtener más detalles, consulte la página ASP.NET de muestra proporcionada en este artículo, que muestra cómo cifrar y descifrar varias partes del archivo Web.config; como puede ver, una página ASP.NET puede acceder (y mostrar) los datos cifrados (formato de texto normal)
3. Cifrar y descifrar la información de configuración requiere un cierto costo de rendimiento. Por lo tanto, es común cifrar solo las partes de la configuración que contienen información confidencial. Por ejemplo, puede que no sea necesario cifrar las secciones de configuración
3. ¿Qué tipo de información se puede cifrar?
Antes de analizar cómo cifrar la información de configuración de ASP.NET 2.0, primero echemos un vistazo a qué información de configuración se puede cifrar. Al utilizar las bibliotecas proporcionadas por .NET Framework 2.0, los desarrolladores pueden cifrar la mayoría de las secciones de configuración en un archivo Web.config o machine.config. Estas partes de configuración son elementos XML que son nodos secundarios del elemento
<?xml versión="1.0"?>
<configuración xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<cadenas de conexión>
<añadir nombre="MembershipConnectionString" connectString="connectionString"/>
</cadenasdeconexión>
<depuración de compilación="true"/>
<modo de autenticación="Formularios" />
Cada una de estas secciones se puede cifrar opcionalmente, ya sea mediante programación o mediante aspnet_regiis.exe (una herramienta de línea de comandos). Cuando se cifra, el texto cifrado se almacena directamente en el archivo de configuración. Por ejemplo, si cifráramos la sección
<configuración xmlns=" http://schemas.microsoft.com/.NetConfiguration/v2.0 ">
<connectionStrings configProtectionProvider="DataProtectionConfigurationProvider">
<Datos cifrados>
<Datos cifrados>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAed...GicAlQ==</CipherValue>
</Datos cifrados>
</Datos cifrados>
</cadenasdeconexión>
<depuración de compilación="true"/>
<modo de autenticación="Formularios" />
</system.web>
Además, hay algunas partes de configuración que no se pueden cifrar usando esta técnica:
· <processModel>
· <tiempo de ejecución>
· <mscorlib>
·<inicio>
· <sistema.runtime.remoting>
· <configProtectedData>
· <conjuntos de satélites>
· <Configuración de criptografía>
· <mapeo de nombres criptográficos>
·
Para cifrar estas partes de configuración, debe cifrar estos valores y almacenarlos en el registro. Existe una herramienta de línea de comandos aspnet_setreg.exe que puede ayudarle con este proceso; analizaremos esta herramienta más adelante en este artículo;
[Consejo] La diferencia entre Web.Config y Machine.Config:
el archivo Web.config especifica los ajustes de configuración para una aplicación web específica y está ubicado en el directorio raíz de la aplicación, mientras que el archivo machine.config especifica todos los ajustes de configuración ubicados; en el servidor web Ajustes de configuración para el sitio ubicado en el directorio $WINDOWSDIR$Microsoft.NetFrameworkVersionCONFIG.
4. Opciones de cifrado
Los desarrolladores pueden utilizar el modelo de proveedor ASP.NET 2.0 para proteger la información de la sección de configuración, lo que permite que cualquier implementación se conecte sin problemas a la API. .NET Framework 2.0 proporciona dos proveedores integrados para proteger la información de la sección de configuración:
· Proveedor de API de protección de datos de Windows (DPAPI) (DataProtectionConfigurationProvider): este proveedor utiliza la tecnología de criptografía integrada de Windows para cifrar y descifrar las secciones de configuración. De forma predeterminada, este proveedor utiliza la clave nativa. También puedes usar claves de usuario, pero esto requiere un poco de personalización.
· Proveedor de configuración protegida RSA (RSAProtectedConfigurationProvider): utiliza cifrado de clave pública RSA para cifrar y descifrar secciones de configuración. Con este proveedor, debe crear un contenedor de claves que almacene las claves públicas y privadas utilizadas para cifrar y descifrar la información de configuración. Puede utilizar RSA en una granja de servidores múltiples creando contenedores de claves exportables.
Por supuesto, también puedes crear tu propio proveedor de configuración de protección si es necesario.
En este artículo, solo analizamos el uso de claves a nivel de máquina utilizando el proveedor DPAPI. Este es, con diferencia, el método más sencillo, ya que no requiere la creación de claves ni contenedores de claves. La desventaja, por supuesto, es que un archivo de configuración cifrado sólo se puede utilizar en el servidor web que implementó el cifrado en primer lugar; además, el uso de una clave de máquina permitirá que cualquier sitio del servidor web descifre el texto cifrado;
5. Cifre la sección de configuración mediante programación.
La clase System.Configuration.SectionInformation abstrae la descripción de una sección de configuración. Para cifrar una sección de configuración, simplemente utilice el método ProtectSection(proveedor) de la clase SecciónInformación, pasando el nombre del proveedor que desea utilizar para realizar el cifrado. Para acceder a una sección de configuración específica en el archivo Web.config de su aplicación, puede usar la clase WebConfigurationManager (en el espacio de nombres System.Web.Configuration) para hacer referencia a su archivo Web.config y luego usar su GetSection El método (sectionName) devuelve un Instancia de sección de configuración. Finalmente, puede obtener un objeto SecciónInformación a través de la propiedad SecciónInformación de la instancia de ConfiguraciónSección.
A continuación, ilustramos el problema mediante un ejemplo de código simple:
privatevoid ProtectSection(cadena nombre de sección, proveedor de cadena)
{
Configuración de configuración = WebConfigurationManager.
OpenWebConfiguration (Request.ApplicationPath);
Sección ConfigurationSection = config.GetSection(sectionName);
si (sección! = nulo &&! sección.SectionInformation.IsProtected)
{
sección.SectionInformation.ProtectSection(proveedor);
config.Guardar();
}
}
Private void UnProtectSection (cadena nombre de sección) {
Configuración de configuración =WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
Sección ConfigurationSection = config.GetSection n(sectionName);
si (sección! = nulo && sección.SectionInformation.IsProtected)
{
sección.SectionInformation.UnprotectSection();
config.Guardar();
}
Puede llamar a este método ProtectSection(sectionName, proveedor) desde una página ASP.NET, sus parámetros correspondientes son un nombre de sección (como ConnectionStrings) y un proveedor (como DataProtectionConfigurationProvider), y abre el archivo Web.config, haciendo referencia En esta sección, se llama al método ProtectSection (proveedor) del objeto SecciónInformación y finalmente se guardan los cambios de configuración.
Por otro lado, el método UnProtectSection(proveedor) implementa el descifrado de una sección de configuración específica. Aquí, solo es necesario pasar la sección que se va a descifrar; no necesitamos molestar al proveedor ya que esa información ya está almacenada en la etiqueta que acompaña a la sección cifrada (es decir, la sección
Recuerde que una vez que estos datos están cifrados, al leerlos desde una página ASP.NET (es decir, leer la información de la cadena de conexión desde un control SqlDataSource o mediante programación a través de ConfigurationManager.ConnectionStrings[connStringName].ConnectionString), ASP.NET descifrará automáticamente los cadena de conexión y devolver un valor de texto sin formato. En otras palabras, no necesita cambiar su código en absoluto después de implementar el cifrado. Bastante genial, ¿verdad?
En el sitio web ASP.NET 2.0 de muestra descargado de este artículo, encontrará una página de muestra que muestra el archivo Web.config del sitio, que tiene un cuadro de texto de varias líneas y los correspondientes botones de control web para la configuración de cifrado. archivo. Este ejemplo también utiliza los métodos ProtectSection() y UnProtectSection() discutidos anteriormente.
6. Utilice la herramienta de línea de comandos aspnet_regiis.exe.
También puede utilizar la herramienta de línea de comandos aspnet_regiis.exe para cifrar y descifrar la parte de configuración del archivo Web.config. Puede encontrarlo en "%WINDOWSDIR%Microsoft.Net. Directorio Frameworkversion". herramienta. Para cifrar una sección en el archivo Web.config, puede usar la clave de máquina DPAPI en esta herramienta de línea de comandos de la siguiente manera:
Una forma común de cifrar un archivo Web.config para un sitio web específico:
aspnet_regiis.exe -pef sección directorio_físico - proveedor prov
o:
aspnet_regiis.exe -pe sección -app virtual_directory -prov
Una instancia específica del proveedor que cifra el archivo Web.config de un sitio web específico:
aspnet_regiis.exe -pef "connectionStrings" "C:InetpubwwwrootMySite" -prov "DataProtectionConfigurationProvider"
o:
aspnet_regiis.exe -pe "connectionStrings" -app "/MySite" -prov "DataProtectionConfigurationProvider"
Una forma común de descifrar el archivo Web.config de un sitio web específico:
aspnet_regiis.exe -sección pdf directorio_físico
o:
aspnet_regiis. exe -pd Sección -app virtual_directory
Ejemplo específico de descifrado del archivo Web.config de un sitio web específico:
aspnet_regiis.exe -pdf "connectionStrings" "C:InetpubwwwrootMySite"
o:
También puede especificar que se ejecute aspnet_regiis.exe machine.config Cifrado/descifrado de archivos.
[Consejo] Cifrar los ajustes de configuración en ASP.NET versión 1.x
Para proteger los ajustes de configuración en ASP.NET versión 1.x, los desarrolladores deben cifrar y almacenar los ajustes confidenciales en el registro del servidor web y utilizar un almacenamiento de claves "fuerte". método. En lugar de almacenar contenido cifrado (como en ASP.NET 2.0), el archivo de configuración simplemente contiene una referencia a la clave de registro donde se almacena el valor cifrado. Por ejemplo:
contraseña="registry:HKLMSOFTWAREMY_SECURE_APPidentityASPNET_SETREG,contraseña" />
Microsoft proporciona a los desarrolladores la herramienta de línea de comandos aspnet_setreg.exe para cifrar información de configuración confidencial y moverla a una entrada de registro "segura". Desafortunadamente, esta herramienta solo funciona con configuraciones específicas; por el contrario, ASP.NET 2.0 permite cifrar cualquier sección de configuración.
Para obtener más información sobre el uso de aspnet_setreg.exe en una aplicación ASP.NET 1.x, consulte KB#32990 en MSDN. Desafortunadamente, este programa de línea de comandos sólo puede cifrar secciones predefinidas en los ajustes de configuración y no le permite cifrar cadenas de conexión de bases de datos y otra información confidencial que usted mismo agregue.
7. Conclusión
En este artículo, aprendimos cómo usar las diferentes opciones de cifrado proporcionadas por ASP.NET 2.0 para proteger la información de la sección de configuración. También discutimos cómo usar técnicas de programación y aspnet_regiis.exe para cifrar la sección de configuración en Web.config respectivamente. . Proteger sus ajustes de configuración confidenciales ayuda a garantizar que su sitio sea más difícil de piratear, al hacer que sea más difícil descubrir ajustes de configuración confidenciales. Hoy en día, ASP.NET 2.0 ya proporciona una tecnología de cifrado y descifrado relativamente sencilla, y no hay ninguna razón para que los desarrolladores no utilicen este método para proteger sus ajustes de configuración confidenciales.