Una de las cosas que siempre debemos tener en presente es cómo almacenamos nuestras contraseñas. En muchos casos como programadores no somos conscientes de que enviamos los datos de conexión a los repositorios de código, o que dependiendo del entorno en cual desplegamos (Dev, QA, PROD) no deberíamos conocer las contraseñas o secretos que sería lo más correcto. Aquí es donde Azure Key Vault puede ayudarnos.
¿Qué es Azure Key Vault?
Para los que no lo conocen, Azure Key Vault, es un servicio en la nube que nos permite almacenar de manera segura nuestros secretos o contraseñas accediendo de una forma segura. Tengamos en cuenta un secreto pueden ser claves de API, contraseñas, certificados o cualquier clave criptográfica que podamos guardar en Azure Key Vault.
Uno de los beneficios es que nos facilita también la automatización de los procesos de despliegue. Por ejemplo, tenemos un servicio REST, cada vez que se despliegue en un entorno Azure Key Vault, por medio de un proceso de CI/CD, podrá entregar los datos correctos para cada entorno. Otro beneficio, la mayoría de las veces el secreto es usado por varios servicios, si tuviéramos que cambiar deberíamos cambiar en cada uno de ellos, pero con esta herramienta solo será necesario cambiar en un lugar para afectar a todos los que consumieron ese secreto.
Creando los recursos necesarios.
Primero debemos entrar a nuestro Portal de Azure. Recuerda que puedes obtener una cuenta gratuita por 30 días con 200 dólares de crédito, y además tiene muchos servicios gratuitos durante 12 meses (Key Vault es uno de estos) y más de 40 servicios gratuitos siempre. Puede acceder desde este link clic aca
Lo primero que debemos hacer, una vez dentro de nuestro portal, es seccionar Crear un nuevo recurso.
Buscamos Azure Key Vault en la siguiente pantalla.
Ahora deberemos completar los parámetros para la creación, le damos crear en la siguiente pantalla y seleccionamos los siguientes parámetros, primero la suscripción, luego un grupo de recurso, un nombre del almacén de claves, región y la tarifa estándar. Presionar en revisar y crear
si todo está correcto se creará nuestro recurso y podemos ir a él mediante el botón Ir al recurso.
Ahora vamos a implementar un secreto para un string de conexión para una base de datos
Microsoft SQL server. Demos en el menú de la izquierda en el apartado de configuración a Secretos, y seleccionamos Generar o Importar.
completamos el formulario, opción de carga Manual, nombre el que nos guste, lo completaré con MSSQLConnectionString y en valor lo completaré con el string de conexion de mi Servidor SQL.
Los demás parámetros los dejaremos sin completar y presionaremos en el botón crear que se encuentra debajo en la misma pantalla.
Por último, debemos generar las contraseñas para poder consumir el key vault. Esto se hace desde el apartado de Configuración en Claves
Tenemos listo nuestro Key Vault con un secreto para poder implementar en nuestra aplicación que realizaremos en .Net que veremos a continuación.
Implementando en nuestra aplicación
Ahora vamos a consumir ese secreto que creamos a partir de nuestra Key Vault creada anteriormente para acceder a nuestra base de datos por medio del connection string que almacenamos.
Luego de crear nuestro proyecto de consola, debemos hacer referencia al SDK que nos brinda Azure, para esto vamos en el explorador de Visual Studio y hacemos clic derecho sobre nuestro proyecto y seleccionamos administrar paquetes NuGet. Seleccionamos examinar y buscamos key vault, seleccionaremos Azure.Security.KeyVault.Secrets dándole instalar y aceptaremos todo lo que nos pregunté luego. También instalaremos Azure.Identity.
Lo siguiente será ir a nuestro archivo program cs y completamos con el siguiente código:
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
const string secretName = "MSSQLConnectionString";
var keyVaultName = "fersonkeyvault";
var kvUri = $"https://{keyVaultName}.vault.azure.net";
var client = new SecretClient(new Uri(kvUri), new DefaultAzureCredential());
Console.WriteLine($"Buscando el secreto desde {keyVaultName}.");
var secret = await client.GetSecretAsync(secretName);
Console.WriteLine($"El valor del secreto {secretName} es '{secret.Value.Value}'.");
Vemos en nuestro código las referencias necesarias para crear los objetos y obtener la información. Declaramos una variable secretName que contiene el nombre del secreto, en nuestro caso “MSSSQLConnectionsString”, luego en la variable kvUri la dirección completa de acceso. Lueg, creamos el cliente a partir de los datos anteriores y consultamos el secreto, lo ejecutamos en consola para ver el resultado.
Conclusiones
Este es ejemplo es solamente la punta de Iceberg de lo que podemos hacer realmente con Azure Key Vault. Es posible asociar secretos directamente a nuestros archivos de configuración, como también, plantillas asociadas a muchos de los servicios de Azure. En futuros post veremos algunos de estos mecanismos.