martes, 21 de agosto de 2012

ASP.NET - Encriptando y Desencriptando el web.Config


ASP.NET - Encriptando y Desencriptando el web.Config
con Sebastian Zangaro
Aumentar la seguridad del archivo web.Config cifrando secciones del mismo utilizando el proveedor de configuración protegida RSA y la herramienta Aspnet_regiis, y así dificultar el acceso a la información almacenada en el mismo.
Procedimiento
Una vez que tenemos identificada la sección o secciones que vamos a cifrar, y que tenemos el proveedor de configuración, podemos proceder con el primer paso. Es recomendable encriptar la sección de connection string o cualquiera que contenga datos sensibles como passwords.
Recomendaciones
Antes de realizar alguna operación, y periódicamente es recomendable realizar un backup del archivo encriptado.

Como obtener el ID del Site:

                Antes de cualquier operación es recomendable obtener el ID del Site al que le queremos cifrar el archivo web.config, machine.config, etc. Este ID se puede obtener de varias maneras como por ejemplo desde el archivo log.
En lo personal el método más fácil y rápido es el siguiente:

a-Abrir el IIS Manager:

Puede encontrarse dentro de “Administrative Tools”

b-Abrir la Configuración Avanzada:

Expandir “Sites”, ubicar el Site del cual se va a obtener el ID, en este caso “Newsletter – 1337”, click derecho, buscar la opción dentro de “Manage Web Site” y hacer click en “Advanced Settings…”.

Copiar ID:

Dentro de “(General)”, se podrá observar el ID.

Encriptar archivo web.config:

Ejecutar Command Prompt:

Ejecutamos con privilegios elevados (Como administrador) el Command Prompt de Visual Studio. Si no aparece dicha opción, manteniendo apretada la tecla “Shift”, hay que darle clic derecho al Command Prompt”.

Escribir la siguiente línea de comando:

aspnet_regiis -pe "appSettings" -app "/" -site "SITE_ID" -prov "RsaProtectedConfigurationProvider"
NOTA: Remplazar SITE_ID por el ID obtenido en el punto 1.3.
Explicación sobre los parámetros:
·         -pe/-pd es el comando para encriptar o desencriptar respectivamente.
·         Lo que le sigue a la acción que se va a hacer es la sección, en este caso es “appSettings”. Vale aclarar que es otros casos tal ves es necesario ingresar la ruta completa, como por ejemplo “system.web/pages”.
·         El parámetro -app es para identificar la Aplicación de la cual se va a encriptar el web.Config. Lo siguiente a este parámetro debe ser una barra seguida del nombre de la aplicación.
·         El parámetro -site es para decirle a que Site corresponde. Hay que ponerle el id, que se puede obtener desde distintas maneras como por ejemplo desde el log. Para más información click aquí.
·         El parámetro -prov corresponde al Provider o proveedor de configuración utilizado para cifrar. En el caso de desencriptar no hace falta especificarlo. Este provider se puede cambiar, o se puede crear uno custom.

Excepciones en cuanto a secciones:

Para las secciones a encriptar existen algunas excepciones como por ejemplo:
·         <processModel>
·         <runtime>
·         <mscorlib>
·         <startup>
·         <system.runtime.remoting>
·         <configProtectedData>
·         <satelliteassemblies>
·         <cryptographySettings>
·         <cryptoNameMapping>
·         <cryptoClasses>
Para encriptar estas secciones hay que usar la herramienta aspnet_setreg.exe (Microsoft Knowledge Base articulo 329290).

Que hacer con una solución local:

Los pasos son muy parecidos a los especificados en el punto 2, con la diferencia que en lugar de utilizar -pe/-pd, los comandos a utilizar deben ser -pef/-pdf respectivamente.

¿Pero entonces hay que modificar la programación para adaptarla a este cambio?

La respuesta es no, ASP.Net internamente se encarga de desencriptar automáticamente el contenido del web.config. Se puede realizar una prueba con la siguiente línea:
Response.Write(ConfigurationManager.ConnectionStrings["cn1"].ConnectionString);

Errores generales con los que me encontré:

·         RSA key container could not be opened.
Esto ocurre cuando el usuario no tiene los permisos necesarios para acceder al key container. Para solucionar este error, hay que ejecutar alguna de las siguientes instrucciones:
o   aspnet_regiis -pc "NetFrameworkConfigurationKey" -exp
o   aspnet_regiis -pa "NetFrameworkConfigurationKey" "ASPNET"
o   aspnet_regiis -pa "NetFrameworkConfigurationKey" "NETWORK SERVICE"
o   aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE"
Donde “NetFrameworkConfigurationKey” es la RSA key que se puede obtener en el machine.config, ubicado como por ejemplo en la ruta “%WinDir%\Microsoft.Net\Framework\v2.0\Config”, bajo la sección configProtectedData; y el ultimo parámetro es la cuenta donde se está ejecutando el servicio asp.net, es decir la cuenta a la cual se le desea asignarle permisos.
Cabe aclarar que dependiendo el caso puede ser necesario especificar el domain.

Para obtener la identidad bajo la cual se ejecuta la aplicación, se puede utilizar la siguiente línea:
Response.Write(WindowsIdentity.GetCurrent().Name);

Referencias


1 comentario: