lunes, 29 de septiembre de 2008

Encriptacion de entradas en el Web.Config

Algo que me resulto realmente muy útil y muy sencillo de utilizar fue la herramienta que trae el SDK de .Net para poder encriptar distintas entradas o claves alojadas en el archivo Web.Config Con anterioridad a esta utilidad, una de las cosas que tocaban hacer era en el momento de hacer el deploy de una aplicación, era crear alguna utilidad mediante la cual el usuario, por lo general alguna persona del área de operación o infraestructura, pudiera editar claves o valores de configuración, encriptarlas o desencriptarlas para poder cambiar sus valores. Paso comentar alguna de las características de esta herramienta, aspnet_regiis.exe. Para comenzar las posibilidades de encriptacion son: mediante algoritmo RSA (Trafico de claves publicas y privadas) o mediante DPAPI (Data Protection application programming interface ). No es necesario tener el entorno de desarrollo instalado en la maquina en la que se quiere realizar la encriptacion/desencriptacion, si tiene que estar instalado el .Net Framework.

Me resulto bastante más útil el hecho de utilizar RSA por el hecho de que por lo general hay aplicaciones que necesitan ser desplegadas en un conjunto de servidores y con RSA se tiene la posibilidad de exportar la clave para después ser llevada a cada server en el que necesitemos desplegar nuestro sitio. Yendo al punto en cuestión, la herramienta puede ser accedida por línea de comandos como se accede a cualquier otra herramienta del SDK de .Net, desde el menú de Inicio->All Programs->Microsft Visual Studio 2005->Visual Studio Tools->Command Prompt Aquí las dos primeras opciones: El comando para encriptar puede trabajar tanto como rutas relativas o "virtuales” como absolutas o a la hora de indicarla la ubicación de nuestro web.config por lo que si queremos trabajar con rutas absolutas es aconsejable ubicarse en el mismo directorio físico en el que se encuentra el archivo a encriptar.

Un vistazo de mi web.config antes de ser encriptado seria algo asi:




Ahora si:
Si vamos utilizar parametros pasando la ruta virtual la opcion seria:

aspnet_regiis -pe "SeccionAEncriptar" -app "RutaVirtual"

Si vamos utilizar parametros pasando la ruta fisica de la aplicacion la opcion seria:

aspnet_regiis -pef "SeccionAEncriptar" -app "RutaFisica"

Por defecto, es decir si no especificamos un proveedor de encriptacion o metodo se realizara con RSAProtectedConfigurationProvider, podemos sin embargo combiarlo si lo especificamos en el parametro -prov y quedaria de la siguiente manera


aspnet_regiis -pef "SeccionAEncriptar" -app "RutaFisica"–prov "DataProtectionConfigurationProvider"


Para realizar la desencripatcion de los datos los procedimientos son los mismos, con la diferencia de que el parámetro pasado a al ejecutable aspnet_regiis deber ser: -pdf (en lugar de -pef si es que usamos rutas absolutas o fisicas ).

En este punto estamos ya en condiciones de tomar algunos recaudos:
La encriptación/desencriptación deberá realizarse en el mismo entorno en donde se encontrara instalada la solución, es decir una vez encriptados los datos, el archivo web.config no podrá ser desencriptado en otra máquina, esto es debido a que cuando utilizamos este comando las claves privadas se almacenan localmente en: C:\Documents and Settings\All Users\Datos de programa\Microsoft\Crypto\RSA\MachineKeys, demas esta decir que debemos tener permiso de escritura sobre esta carpeta.

Esta ultima aclaración servirá para darnos cuenta que al importarse la clave a nivel local en nuestra maquina, es muy probable que en un entorno distribuido (granja de servidores o server farms) algo pueda estar fallando, efectivamente deberemos asegurarnos de que nuestro web.config cuenta con la sección en la cual podremos indicar cual será nuestro contenedor de claves, la especificación de esta sección (configProtectedData) debería ser algo como:




Restaría entonces crear el contenedor de claves de la siguiente manera:

aspnet_regiis -pc "MiContenedor" –exp

Se crea así un nuevo contenedor para la clave de encriptación RSA, asignando el nombre "MiContenedor" y por ultimo:

aspnet_regiis -pa "MiContenedor" "ASPNET"

Donde "MiContenedor" deberá ser el mismo nombre asignado en –pc del comando anterior y que se corresponde con keyContainerName="MiContenedor"/> de webconfig.

Una ultima acotación sobre este tema que me pareció realmente practico, todo esto es a nivel de configuración de nuestro sitio, es decir que el acceso a las entradas de nuestro web.config desde el código sigue siendo igual que si no hubiéramos tocado nada, si lo que encriptamos fueron nuestras cadenas de conexión el acceso seria:

string strConString = ConfigurationManager.ConnectionStrings["MiConectionString"].ConnectionString;



Eso es todo y así de simple :-)

Ariel Serlin

No hay comentarios: