lunes, 27 de octubre de 2014

Encriptando una sección del web.config para Azure

Si bien el archivo web.config no es expuesto por el IIS, la presencia de información sensible en la sección appSettings de un proyecto Cloud Service de Microsoft Azure me llevó a buscar la posibilidad de encriptarlo local, y poder usarlo sin problemas en la nube.

Y lo que encontré fue esto:

Paso 1 - Necesito un certificado


Como mi proyecto ya estaba configurado para utilizar SSL lo que hice fue reutilizar el mismo certificado autofirmado.

Si no tenes un certificado hay que agregar uno al proyecto siguiendo los pasos descritos en Configuring SSL for an application in Azure (solo los pasos Get an SSL certStep 1: Get an SSL certificate, y la parte de upload certificate del paso Upload to AzureStep 3: Upload the deployment package and certificate).

Paso 2 - Agregar PKCS12ProtectedConfigurationProvider al WebRole desde Nuget



En el caso del Cloud Service solo basta con agregar este paquete al WebRole.

Paso 3 - Configurar el proveedor de ProtectedData en el web.config


Agregar la sección configProtectedData dentro de configuration del web.config, reemplazando el thumbprintValue por el del certificado usado.
<configuration>
  <configProtectedData>
    <providers>
      <add name="ProtectedConfigurationProvider" thumbprint="thumbprintValue" type="Pkcs12ProtectedConfigurationProvider.Pkcs12ProtectedConfigurationProvider, PKCS12ProtectedConfigurationProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34da007ac91f901d"/>
    </providers>
  </configProtectedData>
  ...
</configuration>

Paso 4 - Encriptar la sección del web.config que se quiere proteger


En este caso solo buscaba encriptar la sección appSettings, pero se puede hacer lo mismo con cualquier otra sección, o varias.
aspnet_regiis -pef appSettings "C:\source\Azure\DevDay\WebRole1" -prov ProtectedConfigurationProvider
Como acertadamente anticipa Alp Arslan Eren en su blog, si ejecutando el aspnet_regiis te encontrás con un error could not load the PKCS12ProtectedConfigurationProvider assembly como me pasó a mí, siguiendo estas indicaciones se soluciona.

Y si, para armar el tutorial usé el proyecto DevDay 2014 que tan gentilmente cedió la gente de Microsoft para el concurso de AR-UY... ;-)

Paso 5 - Insertar el gacutil como parte de nuestro proyecto


Antes de poder usar la PKCS12ProtectedConfigurationProvider.dll en Azure vamos a necesitar registrarla en la GAC, y dado que los WebRoles de Azure no se están incluyendo las Microsoft SDKs tendremos que llevarnos una copia del gacutil.exe y config hacia la nube.

En mi caso levanté el Cloud Service sobre Windows Server 2012, así que me copie ambos archivos gacutil desde la carpeta C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools a una nueva carpeta Startup dentro de mi proyecto WebRole1.


Paso 6 - Nueva Startup Task para ejecutar gacutil


Al desplegar el WebRole en Azure necesitamos que se ejecute gacutil como uno de los primeros pasos. Para eso agregamos un archivo RegisterGAC.cmd (salvar este archivo de con codificación ANSI), a la carpeta Startup recientemente creada, conteniendo el comando:
Startup\gacutil.exe /nologo /i PKCS12ProtectedConfigurationProvider.dll
..y un nuevo Startup Task dentro del WebRole al archivo ServiceDefinition.csdef de la solución:
<WebRole name="WebRole1" vmsize="Small">
  <Startup>
    <Task commandLine="Startup\RegisterGAC.cmd" executionContext="elevated" taskType="simple"/>
  </Startup>
  ...
</WebRole>
Los tres archivos agregados en la carpeta Startup deben quedar marcados como Copiar en el directorio de salida: Copiar siempre.

Paso 7 - Desplegar la solucion en Azure


...y observar como la aplicación fluye gloriosa!


Fuentes:

No hay comentarios:

Publicar un comentario