Hoy os voy a hablar de cómo proteger las keys y cadenas de conexión de tu API, ya que no es nada recomendable publicar estas keys en los settings de tu aplicación porque están expuestos y pueden ser robados de alguna forma.

Para hacer esto, nos vamos a apoyar en dos servicios de Azure que son: Azure Key Vault y Azure App Configuration.

API inicial

Partimos de una API ya construida con .Net Core y que ya tiene definido un environment (Development) para trabajar en local.

Por lo tanto, vamos a tener un appsettings.json y un appsetting.Development.json. Estoy trabajando con una cuenta de almacenamiento y un Azure Cosmos Db. En el caso local, trabajo con el emulador local y en el entorno desplegado, pues con los servicios desplegados.

Los ficheros de configuración son del estilo:

  • appsettings.Development.json

  • aappsettings.Development.json

Creando los servicios

Primero, voy a crear el servicio de Key Vault. Desde el Marketplace:

Y el servicio de App Configuration:

A continuación, creamos los dos secretos de las keys del Cosmos Db y del Azure Storage. Desde el Azure Key Vault -> Secrets -> Generate/Import.

Introducimos un nombre descriptivo del secreto y su valor.

A continuación, en el App Configuration, vamos a crear las claves que apunten a los secretos del Key Vault (App Configuration -> Configuration Explorer -> Create -> Key Vault Reference). En este caso, el nombre de las claves lo vamos a definir tal y como seria la jerarquía en el json de appsettings (nodo:propiedad). Por ejemplo, para la accountkey del storage sería: Storage:AccountKey.

Permisos entre servicios

Este es el punto más importante, ya que, sin los permisos, vamos a tener una serie de errores 403, al no tener acceso el app service sobre el key vault y el App Configuration.

Vamos a usar seguridad basada en Manage Service Identity. Para ello, lo primero es activar el identity del app service donde tengamos publicada la api:

Una vez activado, vamos a dar permisos en el key vault y en el App Configuration a esta aplicación registrada.

En Azure Key Vault -> Access Policies -> Add Access Policies:

Seleccionamos los permisos de Get y List en los secrets y como principal elegimos nuestra API a la que hemos activado el identity.

En App Configuration -> Access Control (IAM) -> Add Role Assignement:

Añadimos el rol de App Configuration Data Reader para nuestra API registrada.

Cambiando el código

A la hora de trabajar con nuestro código, vamos a tener dos cambios:

  • Trabajo en local.

Para trabajar en local, en lugar de usar los settings que teníamos en el appsettings.Development.json, vamos a usar los user secrets. Para acceder a este fichero, basta con hacer click derecho en nuestro proyecto de API.

Rellenando nuestras keys del emulador local con el formato nodo:propiedad, será suficiente:

Dejando el fichero appsettings.Development.json huérfano de las AccountKeys.

  • Keys en entorno desplegado.

Ahora vamos a borrar igualmente las propiedades AccountKeys del fichero appsettings.json. ahora bien, para que la API pueda obtener las claves del key vault mediante el App Configurator, necesitamos modificar el código del host builder y dejándolo de esta forma:

Podemos ver que también añado una validación de si estamos en el entorno de desarrollo y además la propiedad endpoint del AppConfiguration esta informada en el appsettings.

Esa será nuestra ultima modificación, añadir al appsettings la configuración del servicio:

Como ManageServiceIdentityId, se pode el object id que se ha generado al activar el identity en el App Service.

Pues todo listo, con estos cambios, tenemos la configuración de nuestra aplicación oculta y a salvo de posibles ataques.

¡Espero que haya gustado!

Procesando…
¡Lo lograste! Ya estás en la lista.
Última modificación: junio 9, 2020

Autor

Comentarios

Comenta o responde a los comentarios

Tu dirección de correo no será publicada.