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.
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.
Ejemplo del resultado obtenido:
Sección connectionStrings de un web.config que todavía no fue cifrado:
Sección connectionStrings de un web.config que cifrado:
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);