Tutorial: Uso de una máquina virtual Linux y una aplicación .NET para almacenar secretos en Azure Key VaultTutorial: Use a Linux VM and a .NET app to store secrets in Azure Key Vault

Azure Key Vault ayuda a proteger secretos como las claves de API y las cadenas de conexión de base de datos necesarias para acceder a las aplicaciones, los servicios y los recursos de TI.Azure Key Vault helps you to protect secrets such as API Keys and database connection strings that are needed to access your applications, services, and IT resources.

En este tutorial, configurará una aplicación de consola .NET para leer información de Azure Key Vault mediante identidades administradas para recursos de Azure.In this tutorial, you set up a .NET console application to read information from Azure Key Vault by using managed identities for Azure resources. Aprenderá a:You learn how to:

  • Creación de un Almacén de clavesCreate a key vault
  • Almacenar un secreto en Key VaultStore a secret in Key Vault
  • Crear una máquina virtual Linux de AzureCreate an Azure Linux virtual machine
  • Habilitar una identidad administrada para la máquina virtualEnable a managed identity for the virtual machine
  • Conceder los permisos necesarios para que la aplicación de consola lea datos de Key VaultGrant the required permissions for the console application to read data from Key Vault
  • Recuperar un secreto del almacén de clavesRetrieve a secret from Key Vault

Antes de avanzar, lea acerca de los conceptos básicos de Key Vault.Before we go any further, read about key vault basic concepts.

Requisitos previosPrerequisites

Uso de Azure Cloud ShellUse Azure Cloud Shell

En Azure se hospeda Azure Cloud Shell, un entorno de shell interactivo que puede utilizar mediante el explorador.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell le permite usar bash o PowerShell para trabajar con servicios de Azure.Cloud Shell lets you use either bash or PowerShell to work with Azure services. Puede usar los comandos preinstalados de Cloud Shell para ejecutar el código de este artículo sin tener que instalar nada en su entorno local.You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Para iniciar Azure Cloud Shell:To launch Azure Cloud Shell:

OpciónOption Ejemplo o vínculoExample/Link
Seleccione Probarlo en la esquina superior derecha de un bloque de código.Select Try It in the upper-right corner of a code block. Solo con seleccionar Probar no se copia automáticamente el código en Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Ejemplo de Probarlo para Azure Cloud Shell
Vaya a https://shell.azure.com o seleccione el botón Iniciar Cloud Shell para abrir Cloud Shell en el explorador.Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. Iniciar Cloud Shell en una nueva ventanaLaunch Cloud Shell in a new window
Seleccione el botón Cloud Shell en la barra de menús de la esquina superior derecha de Azure Portal.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Botón Cloud Shell en Azure Portal

Para ejecutar el código de este artículo en Azure Cloud Shell:To run the code in this article in Azure Cloud Shell:

  1. Inicie Cloud Shell.Launch Cloud Shell.

  2. Seleccione el botón Copiar de un bloque de código para copiar el código.Select the Copy button on a code block to copy the code.

  3. Pegue el código en la sesión de Cloud Shell con Ctrl+Mayús+V en Windows y Linux, o Cmd+Mayús+V en macOS.Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.

  4. Presione ENTRAR para ejecutar el código.Press Enter to run the code.

Managed Service IdentityUnderstand Managed Service Identity

Azure Key Vault puede almacenar las credenciales de forma segura para que no estén en el código, pero debe autenticarse en Azure Key Vault para recuperarlas.Azure Key Vault can store credentials securely so they aren’t in your code, but to retrieve them you need to authenticate to Azure Key Vault. Sin embargo, para autenticarse en Key Vault, necesita una credencial.However, to authenticate to Key Vault, you need a credential. Se trata de un problema clásico de arranque.It's a classic bootstrap problem. Con Azure y Azure Active Directory (Azure AD), Managed Service Identity (MSI) puede proporcionar una identidad de arranque que permite comenzar fácilmente.With Azure and Azure Active Directory (Azure AD), Managed Service Identity (MSI) can provide a bootstrap identity that makes it much simpler to get things started.

Cuando se habilita MSI para un servicio de Azure como Virtual Machines, App Service o Functions, Azure crea una entidad de servicio para la instancia del servicio en Azure Active Directory.When you enable MSI for an Azure service like Virtual Machines, App Service, or Functions, Azure creates a service principal for the instance of the service in Azure Active Directory. Inserta las credenciales de la entidad de servicio en la instancia del servicio.It injects the credentials for the service principal into the instance of the service.

MSI

A continuación, el código llama a un servicio local de metadatos disponible en el recurso de Azure para obtener un token de acceso.Next, your code calls a local metadata service available on the Azure resource to get an access token. El código usa el token de acceso que obtiene del MSI_ENDPOINT local para autenticar una instancia del servicio Azure Key Vault.Your code uses the access token it gets from the local MSI_ENDPOINT to authenticate to an Azure Key Vault service.

Inicio de sesión en AzureSign in to Azure

Para iniciar sesión en Azure mediante la CLI de Azure, escriba:To sign in to Azure by using the Azure CLI, enter:

az login

Crear un grupo de recursosCreate a resource group

Cree un grupo de recursos mediante el comando az group create.Create a resource group by using the az group create command. Un grupo de recursos de Azure es un contenedor lógico en el que se implementan y se administran los recursos de Azure.An Azure resource group is a logical container into which Azure resources are deployed and managed.

Cree un grupo de recursos en la ubicación de oeste de EE. UU.Create a resource group in the West US location. Elija un nombre para el grupo de recursos y reemplace YourResourceGroupName en el ejemplo siguiente:Pick a name for your resource group and replace YourResourceGroupName in the following example:

# To list locations: az account list-locations --output table
az group create --name "<YourResourceGroupName>" --location "West US"

Usará este grupo de recursos a lo largo de este tutorial.You use this resource group throughout the tutorial.

Creación de un Almacén de clavesCreate a key vault

A continuación, cree un almacén de claves en el grupo de recursos.Next, create a key vault in your resource group. Proporcione la siguiente información:Provide the following information:

  • Nombre del almacén de claves: una cadena de entre 3 y 24 caracteres que puede contener solo números, letras y guiones ( 0-9, a-z, A-Z y - ).Key vault name: a string of 3 to 24 characters that can contain only numbers, letters, and hyphens ( 0-9, a-z, A-Z, and - ).
  • Definición de un nombre de grupo de recursosResource group name
  • Ubicación: Oeste de EE. UU.Location: West US
az keyvault create --name "<YourKeyVaultName>" --resource-group "<YourResourceGroupName>" --location "West US"

En este momento, su cuenta de Azure es la única autorizada para realizar operaciones en este nuevo almacén.At this point, only your Azure account is authorized to perform any operations on this new vault.

Incorporación de un secreto al almacén de clavesAdd a secret to the key vault

Ahora puede agregar un secreto.Now, you add a secret. En un escenario del mundo real, se puede almacenar una cadena de conexión de SQL o cualquier otra información que necesite guardar de forma segura, pero que desea que esté disponible para la aplicación.In a real-world scenario, you might be storing a SQL connection string or any other information that you need to keep securely, but make available to your application.

Para este tutorial, escriba los siguientes comandos para crear un secreto en el almacén de claves.For this tutorial, type the following commands to create a secret in the key vault. El secreto se denomina AppSecret y su valor es MySecret.The secret is called AppSecret and its value is MySecret.

az keyvault secret set --vault-name "<YourKeyVaultName>" --name "AppSecret" --value "MySecret"

Creación de una máquina virtual con LinuxCreate a Linux virtual machine

Cree una máquina virtual con el comando az vm create.Create a VM with the az vm create command.

En el ejemplo siguiente se crea una máquina virtual llamada myVM y se agrega una cuenta de usuario llamada azureuser.The following example creates a VM named myVM and adds a user account named azureuser. El parámetro --generate-ssh-keys se usa para generar automáticamente una clave SSH y colocarla en la ubicación de clave predeterminada ( ~/.ssh).The --generate-ssh-keys parameter us used to automatically generate an SSH key and put it in the default key location (~/.ssh). Para utilizar un conjunto de claves concreto, utilice la opción --ssh-key-value.To use a specific set of keys instead, use the --ssh-key-value option.

az vm create \
  --resource-group myResourceGroup \
  --name myVM \
  --image UbuntuLTS \
  --admin-username azureuser \
  --generate-ssh-keys

La creación de la máquina virtual y los recursos auxiliares tarda unos minutos en realizarse.It takes a few minutes to create the VM and supporting resources. En la salida de ejemplo siguiente se muestra que la operación de creación de la máquina virtual se realizó correctamente.The following example output shows that the VM create operation was successful.

{
  "fqdns": "",
  "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM",
  "location": "westus",
  "macAddress": "00-00-00-00-00-00",
  "powerState": "VM running",
  "privateIpAddress": "XX.XX.XX.XX",
  "publicIpAddress": "XX.XX.XXX.XXX",
  "resourceGroup": "myResourceGroup"
}

Anote el valor de publicIpAddress en la salida de la máquina virtual.Make a note of your publicIpAddress in the output from your VM. Esta dirección se utiliza para acceder a la VM en los pasos posteriores.You'll use this address to access the VM in later steps.

Asignación de una identidad a la máquina virtualAssign an identity to the VM

Cree una identidad asignada por el sistema para la máquina virtual; para ello, ejecute el siguiente comando:Create a system-assigned identity to the virtual machine by running the following command:

az vm identity assign --name <NameOfYourVirtualMachine> --resource-group <YourResourceGroupName>

La salida del comando debe ser:The output of the command should be:

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

Anote el systemAssignedIdentity.Make a note of the systemAssignedIdentity. La usará en el paso siguiente.You use it in the next step.

Concesión del permiso de identidad de máquina virtual al almacén de clavesGive the VM identity permission to Key Vault

Ahora puede dar permiso de Key Vault a la identidad que creó.Now you can give Key Vault permission to the identity you created. Ejecute el siguiente comando:Run the following command:

az keyvault set-policy --name '<YourKeyVaultName>' --object-id <VMSystemAssignedIdentity> --secret-permissions get list

Inicio de sesión en la máquina virtualLog in to the VM

Ahora inicie sesión en la máquina virtual mediante un terminal.Log in to the virtual machine by using a terminal.

ssh azureuser@<PublicIpAddress>

Instalación de .NET Core en LinuxInstall .NET Core on Linux

En la máquina virtual Linux:On your Linux VM:

Registre la clave de producto de Microsoft como de confianza mediante la ejecución de los siguientes comandos:Register the Microsoft product key as trusted by running the following commands:

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg

Configure la fuente del paquete de host de la versión deseada en función del sistema operativo:Set up desired version host package feed based on operating system:

   # Ubuntu 17.10
   sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-artful-prod artful main" > /etc/apt/sources.list.d/dotnetdev.list'
   sudo apt-get update
   
   # Ubuntu 17.04
   sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-zesty-prod zesty main" > /etc/apt/sources.list.d/dotnetdev.list'
   sudo apt-get update
   
   # Ubuntu 16.04 / Linux Mint 18
   sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
   sudo apt-get update
   
   # Ubuntu 14.04 / Linux Mint 17
   sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod trusty main" > /etc/apt/sources.list.d/dotnetdev.list'
   sudo apt-get update

Instale .NET y compruebe la versión:Install .NET and check the version:

sudo apt-get install dotnet-sdk-2.1.4
dotnet --version

Creación y ejecución de una aplicación de .NET de ejemploCreate and run a sample .NET app

Ejecute los comandos siguientes:Run the following commands. Debería ver que se imprime "Hola mundo" en la consola.You should see "Hello World" printed to the console.

dotnet new console -o helloworldapp
cd helloworldapp
dotnet run

Edición de la aplicación de consola para capturar el secretoEdit the console app to fetch your secret

Abra el archivo Program.cs y agregue estos paquetes:Open Program.cs file and add these packages:

using System;
using System.IO;
using System.Net;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

Es un proceso de dos pasos para cambiar el archivo de clase para permitir a la aplicación acceder al secreto del almacén de claves.It's a two-step process to change the class file to enable the app to access the secret in the key vault.

  1. Captura un token del punto de conexión de MSI local de la máquina virtual que, a su vez, captura un token de Azure Active Directory.Fetch a token from the local MSI endpoint on the VM that in turn fetches a token from Azure Active Directory.

  2. Pase el token a Key Vault y capture el secreto.Pass the token to Key Vault and fetch your secret.

    Edite el archivo de clase para que contenga el código siguiente:Edit the class file to contain the following code:

     class Program
        {
            static void Main(string[] args)
            {
                // Step 1: Get a token from local (URI) Managed Service Identity endpoint which in turn fetches it from Azure Active Directory
                var token = GetToken();
    
                // Step 2: Fetch the secret value from Key Vault
                System.Console.WriteLine(FetchSecretValueFromKeyVault(token));
            }
    
            static string GetToken()
            {
                WebRequest request = WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net");
                request.Headers.Add("Metadata", "true");
                WebResponse response = request.GetResponse();
                return ParseWebResponse(response, "access_token");
            }
    
            static string FetchSecretValueFromKeyVault(string token)
            {
                WebRequest kvRequest = WebRequest.Create("https://prashanthwinvmvault.vault.azure.net/secrets/RandomSecret?api-version=2016-10-01");
                kvRequest.Headers.Add("Authorization", "Bearer "+  token);
                WebResponse kvResponse = kvRequest.GetResponse();
                return ParseWebResponse(kvResponse, "value");
            }
    
            private static string ParseWebResponse(WebResponse response, string tokenName)
            {
                string token = String.Empty;
                using (Stream stream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                    String responseString = reader.ReadToEnd();
    
                    JObject joResponse = JObject.Parse(responseString);
                    JValue ojObject = (JValue)joResponse[tokenName];
                    token = ojObject.Value.ToString();
                }
                return token;
            }
        }
    

Ahora ha aprendido a realizar operaciones con Azure Key Vault en una aplicación .NET que se ejecuta en una máquina virtual Linux de Azure.Now you've learned how to perform operations with Azure Key Vault in a .NET application running on an Azure Linux virtual machine.

Limpieza de recursosClean up resources

Elimine el grupo de recursos, la máquina virtual y todos los recursos relacionados Cuando ya no los necesite.Delete the resource group, virtual machine, and all related resources when you no longer need them. Para ello, seleccione el grupo de recursos de la máquina virtual y seleccione Eliminar.To do so, select the resource group for the VM and select Delete.

Elimine el almacén de claves mediante el comando az keyvault delete:Delete the key vault by using the az keyvault delete command:

az keyvault delete --name
                   [--resource group]
                   [--subscription]

Pasos siguientesNext steps