Ejercicio: Administración de secretos en la plantilla de ARM

Completado

En el ejercicio anterior, ejecutó una plantilla básica de Azure Resource Manager (ARM) que aprovisiona una máquina virtual Linux. En esta parte, seguirá un proceso similar.

Esta vez, en lugar de pasar la contraseña como un parámetro, esta se almacena en Azure Key Vault. Para permitir el acceso de la plantilla de ARM a la contraseña, cree un archivo de parámetros que haga referencia al secreto del almacén de claves de su suscripción.

Implementar Azure Key Vault

Nota:

Debido a las limitaciones con el espacio aislado, aquí creará un almacén de claves en Azure Key Vault desde Azure Portal. Normalmente, usaríamos el cmdlet New-AzKeyVault para crear un almacén de claves desde Azure PowerShell.

Cree un almacén de claves y permita el acceso en el momento de la implementación. Para ello:

  1. Cree una variable de PowerShell que contenga el nombre del almacén de claves:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. Ejecute $KVNAME para imprimir su valor:

    $KVNAME
    

    La salida será similar a esta (el número que ve será diferente):

    tailwind-secrets5978564
    

    Copie el valor en un lugar adecuado para realizar el paso siguiente.

  3. Inicie sesión en Azure Portal con la misma cuenta con la que activó el espacio aislado.

  4. En el menú o en la página principal de Azure Portal, seleccione Crear un recurso.

  5. En el cuadro de búsqueda, escriba Key Vault.

  6. Seleccione Almacén de claves de la lista y, luego, Crear para empezar a configurar el almacén de claves.

  7. En el panel de creación, especifique estos valores:

    1. Grupo de recursos: nombre del grupo de recursos.
    2. Nombre del almacén de claves: el valor de $KVNAME, por ejemplo, tailwind-secrets5978564.
  8. Seleccione Revisar + crear.

  9. Seleccione Crear. Esto debería tardar un minuto aproximadamente. Una vez creado el recurso, seleccione Ir al recurso.

  10. Seleccione Configuración de acceso en Configuración. Habilite la opción Azure Resource Manager para la implementación de plantillas y seleccione Aplicar.

  11. En la sesión de PowerShell, ejecute el cmdlet ConvertTo-SecureString y asigne el resultado a la variable secretSecureString:

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. Ejecute el comando Set-AzKeyVaultSecret siguiente para crear un secreto en el almacén de claves: El secreto se denomina vmPassword, con el valor insecurepassword123!:

    $secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
    

Creación del archivo de parámetros

Aquí, creará un archivo de parámetros que contiene el nombre de la máquina virtual, el nombre de usuario del administrador y una referencia a la contraseña de máquina virtual en el almacén de claves.

Puede pasar parámetros a plantillas desde la línea de comandos. Recuerde que un archivo de parámetros es una forma alternativa de pasar parámetros a la plantilla de ARM durante la implementación. Un archivo de parámetros permite tener acceso a los secretos de almacén de claves desde la plantilla.

  1. Ejecute el comando Get-AzKeyVault siguiente para imprimir el identificador de almacén de claves:

    Get-AzKeyVault -VaultName $KVNAME | Select-Object -ExpandProperty ResourceId
    

    La salida será similar a esta:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Tenga en cuenta la salida para realizar el paso siguiente.

  2. En Visual Studio Code, cree un archivo llamado azuredeploy.parameters.json en el mismo directorio que contiene azuredeploy.json.

  3. Agregue este contenido a azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. Reemplace el valor de id (la cadena vacía) por el valor que copió en el paso anterior. A continuación, guarde el archivo.

Implementación de una máquina virtual Linux

Aquí, implementará la misma plantilla de ARM que implementó en el ejercicio anterior. Esta vez, debe proporcionar el archivo de parámetros que hace referencia a la contraseña de máquina virtual en el almacén de claves.

  1. Ejecute el siguiente comando New-AzResourceGroupDeployment:

    New-AzResourceGroupDeployment `
      -TemplateFile "./azuredeploy.json" `
      -TemplateParameterFile "./azuredeploy.parameters.json" `
      -dnsLabelPrefix ("vm2-" + (Get-Random -Count 1 -Maximum 9999999))
    

    En el ejercicio anterior, proporcionó cada par clave-valor directamente desde la línea de comandos. Aquí, especifica "./azuredeploy.parameters.json" para proporcionar el archivo de parámetros.

    dnsLabelPrefix se establece en vm2-, seguido de un número aleatorio. Esto es necesario para asegurarse de que el nombre DNS difiere del nombre DNS que usó en el ejercicio anterior.

Comprobación de la implementación

Compruebe que la máquina virtual está aprovisionada y se puede conectar a través de SSH. Para ello:

  1. Ejecute el comando Invoke-Expression para conectarse a la máquina virtual mediante SSH:

    Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
    

    Cuando se le solicite, escriba yes para continuar con la conexión. A continuación, escriba la contraseña de administrador, insecurepassword123!.

    Importante

    En la práctica, mantenga las contraseñas seguras. También puede usar la autenticación de clave pública, que suele ser más segura que el empleo de contraseñas.

  2. En la conexión SSH a la máquina virtual, ejecute hostname para imprimir el nombre de host de la máquina virtual:

    hostname
    

    Verá el nombre de host interno de la máquina virtual vm1:

    vm2
    
  3. Ejecute exit para salir de la sesión de SSH.

    exit
    

Buen trabajo. Ha ampliado la implementación para incluir un archivo de parámetros que lea información sobre el secreto de Key Vault.

Implementar Azure Key Vault

En Azure Key Vault, cree un almacén de claves y agregue la contraseña de la máquina virtual como un secreto seguro. Para ello:

  1. Cree una variable de Bash que contenga el nombre del almacén de claves.

    KVNAME=tailwind-secrets$RANDOM
    

    Los nombres de los almacenes de claves deben ser únicos. El elemento $RANDOM garantiza que el nombre del almacén de claves acaba en una serie aleatoria de números.

  2. Ejecute el comando az keyvault create siguiente para crear el almacén de claves:

    az keyvault create \
      --name $KVNAME \
      --enabled-for-template-deployment true
    

    El argumento --enabled-for-template-deployment permite que la plantilla de Azure Resource Manager (ARM) recupere los secretos del almacén de claves.

  3. Ejecute el comando az keyvault secret set siguiente para crear un secreto en el almacén de claves: El secreto se denomina vmPassword, con el valor insecurepassword123!:

    az keyvault secret set \
      --vault-name $KVNAME \
      --name vmPassword \
      --value 'insecurepassword123!'
    

Creación del archivo de parámetros

Aquí, creará un archivo de parámetros que contiene el nombre de la máquina virtual, el nombre de usuario del administrador y una referencia a la contraseña de máquina virtual en el almacén de claves.

Puede pasar parámetros a plantillas desde la línea de comandos. Recuerde que un archivo de parámetros es una forma alternativa de pasar parámetros a la plantilla de ARM durante la implementación. Un archivo de parámetros permite tener acceso a los secretos de almacén de claves desde la plantilla.

  1. Ejecute el comando az keyvault show siguiente para imprimir el identificador de almacén de claves:

    az keyvault show \
      --name $KVNAME \
      --query id \
      --output tsv
    

    La salida será similar a esta:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Tenga en cuenta la salida para realizar el paso siguiente.

  2. En Visual Studio Code, cree un archivo llamado azuredeploy.parameters.json en el mismo directorio que contiene azuredeploy.json.

  3. Agregue este contenido a azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. Reemplace el valor de id (la cadena vacía) por el valor que copió en el paso anterior. A continuación, guarde el archivo.

Implementación de una máquina virtual Linux

Aquí, implementará la misma plantilla de ARM que implementó en el ejercicio anterior. Esta vez, debe proporcionar el archivo de parámetros que hace referencia a la contraseña de máquina virtual en el almacén de claves.

Ejecute el comando az deployment group create siguiente para implementar la plantilla:

az deployment group create \
  --template-file azuredeploy.json \
  --parameters @azuredeploy.parameters.json dnsLabelPrefix="vm2-$RANDOM"

En el ejercicio anterior, proporcionó cada par clave-valor en el argumento --parameters. Aquí, especifica @azuredeploy.parameters.json para proporcionar el archivo de parámetros.

dnsLabelPrefix se establece en vm2-, seguido de un número aleatorio. Esto es necesario para asegurarse de que el nombre DNS difiere del nombre DNS que usó en el ejercicio anterior.

Comprobar la implementación

Tal y como hizo en el ejercicio anterior, compruebe que la máquina virtual está aprovisionada y se puede conectar a través de SSH. Por cuestiones de brevedad, esta vez omitirá algunos de los pasos intermedios.

  1. Ejecute lo siguiente para conectarse a la máquina virtual a través de SSH:

    $(az deployment group show \
      --name azuredeploy \
      --query properties.outputs.sshCommand.value \
      --output tsv)
    

    Cuando se le solicite, escriba yes para continuar con la conexión. A continuación, escriba la contraseña de administrador, insecurepassword123!.

  2. En la conexión SSH a la máquina virtual, ejecute hostname para imprimir el nombre de host de la máquina virtual:

    hostname
    

    Verá el nombre de host interno de la máquina virtual vm2:

    vm2
    
  3. Ejecute exit para salir de la sesión de SSH.

    exit
    

Buen trabajo. Ha ampliado la implementación para incluir un archivo de parámetros que lea información sobre el secreto de Key Vault.