Encriptación de archivos de configuración

jueves, 16 de julio de 2009
Una de las facilidades que nos brinda .Net con respecto a la configuración de una aplicación es el uso de archivos de configuración, estos archivos son de texto plano con esquema XML; en el podemos almacenar todas las llaves, valores, cadenas, conexiones y otras cosas que necesitemos para que nuestra aplicación funcione como se planeo.

Mucha de la información que es contenida en estos archivos de configuración puede que sea muy sensible, en este caso lo ideal seria que no sea legible a simple vista, pero ¿como hacer que el valor este disponible para la aplicación pero que no sea legible?

Existe una forma (de tantas posibles) que desarrollare a continuación.

Lo que haremos es encriptar sección por sección del archivo de configuración. Para lograr este cometido tenemos que seguir una serie de pasos.

1) Declaración de Assembly de encriptación.

Tenemos que identificar en el web.config que proveedor de encriptación vamos a utilizar, en este caso vamos a usar RSAProtectedConfigurationProvider, para poder hacer esto es necesario crear esta sección en el archive de configuración


<configProtectedData defaultProvider="MiNuevoProveedor">

<providers>

<add name="MiNuevoProveedor"

type="System.Configuration.RsaProtectedConfigurationProvider,

System.Configuration,

Version=2.0.0.0,

Culture=neutral,

PublicKeyToken=b03f5f7f11d50a3a,

processorArchitecture=MSIL"

keyContainerName="ContenedorDeLlavves"

useMachineContainer="true" />

</providers>

</configProtectedData>


En este caso la instancia de la clase de encriptación es “ContenedorDeLlaves” y el proveedor es “MiNuevoProveedor”

2) El Segundo paso consiste en el uso de una herramienta de consola, esta es la Herramienta de registro de Information Services (aspnet_regiis.exe), con esta herramienta vamos a crear las llaves de seguridad en el servidor donde la aplicación se encuentra. Esta herramienta se encuentra en la ruta de instalación de la versión 2.0 del framework (C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727). Para crear este contenedor en necesario usar la ventana de comandos del sistema operativo con el siguiente comando:


aspnet_regiis -pc "ContenedorDeLlaves" –exp


El argumento –PC crea un contenedor en un espacio aislado del registro del sistema para contener la llave privada del algoritmo de encriptacion, el argumento –exp permite hacer exportable este contenedor en caso que estemos trabajando en una granja de servidores.

3) Ahora que ya tenemos el contenedor, debemos establecer quien tendrá acceso a este, para esto usamos esta línea de comando:

Para Windows XP.


aspnet_regiis -pa " ContenedorDeLlaves " "NombreDePC\ASPNET"


Para Windows 2003.


aspnet_regiis -pa " ContenedorDeLlaves " "NT AUTHORITY\NETWORK SERVICE"


La diferencia entre sistemas operativos se debe a que el servicio que se encarga del acceso a sitios Web es diferente de S.O. a S.O.


4) Antes de poder usar el servicio de encriptación del proveedor, necesitamos crear una referencia a este ensamblado en la sección de ensamblados del archive de configuración de la siguiente forma

<compilation debug="false">

<assemblies>

<add assembly="System.Configuration,

Version=2.0.0.0,

Culture=neutral,

PublicKeyToken=b03f5f7f11d50a3a" />

</assemblies>

</compilation>

5) Ahora ya podemos encriptar, como se comento al principio la idea es cifrar una sección entera del archive de configuración, en este caso elegimos las cadenas de conexión (connectionStrings)


aspnet_regiis -pef "connectionStrings" "C:\Intepub\wwwroot\Test" -prov " MiNuevoProveedor "


El atributo –pef nos permite encriptar la seccion descrita a continuacion del mismo, si deseamos desencriptar el comando deberá ser –pdf en vez de -pef. Este atributo recibe 2 parámetros, el primero es la sección que se desea cifrar/descifrar y el segundo es la ruta donde se encuentra el archivo de configuración. El atributo –prov especifica el proveedor de encriptación que será utilizado para el cifrado (en este caso el especificado en el paso 1)


En el caso que nos encontremos en un escenario Web farm el contenedor de la llave puede ser exportado e importado en cada uno de los miembros del Web farm con las siguientes líneas de comando.


Para exportar


aspnet_regiis -px " ContenedorDeLlaves " "C:\ ContenedorDeLlaves.xml" -pri


El atributo –px recibe 2 argumentos, el primero es el nombre del contenedor de claves a ser exportado y el Segundo es la ruta donde se deberá crear el archive XML con la información del mismo.

El atributo –pri establece si la llave primaria también debe ser exportada.


Para Importar

aspnet_regiis -pi " ContenedorDeLlaves " "C:\ ContenedorDeLlaves.xml"


Copiar el archive XML resultante de la exportación al Nuevo servidor, abrir la ventana de comandos y utilizar el comando de importación, el atributo –pi recibe 2 argumentos, el primero es el nombre del contenedor a ser importado y el Segundo es la ruta física del archive XML resultante de la exportación.


Ahora que la sección connectionString esta cifrada la información esta segura, no es necesario cambiar el código de la aplicación para que lea esta sección o cualquier otra que haya sedo cifrada ya que el mismo CLR se encargara de esa tarea con la información proporcionada en el contenedor para el caso de los usuarios que pueden acceder al servicio, como el proveedor y llaves de encriptación para obtener la información solicitada.


Nota:

Todos los comandos deberán ser ejecutados bajo una cuenta con privilegios administrativos.

0 comments:

Publicar un comentario