Extensión VMAccess para Linux

Precaución

En este artículo se hace referencia a CentOS, una distribución de Linux que está cerca de su estado Final de ciclo vida (EOL). Tenga en cuenta su uso y planifique en consecuencia. Para obtener más información, consulte la Guía de fin de vida de CentOS.

La extensión VMAccess se usa para administrar usuarios administrativos, configurar SSH y comprobar o reparar discos en máquinas virtuales Linux de Azure. La extensión se integra con las plantillas de Azure Resource Manager. También se puede invocar mediante la CLI de Azure, Azure PowerShell, Azure Portal o la API REST de Azure Virtual Machines.

En este artículo se describe cómo ejecutar la extensión VMAccess desde la CLI de Azure y a través de una plantilla de Azure Resource Manager. En este artículo se proporcionan también los pasos para la solución de problemas para los sistemas Linux.

Nota:

Si usa la extensión VMAccess para restablecer la contraseña de la máquina virtual después de instalar la extensión de inicio de sesión de Microsoft Entra, vuelva a ejecutar dicha extensión para volver a habilitar el inicio de sesión de Microsoft Entra en la máquina virtual.

Requisitos previos

Distribuciones de Linux compatibles

Linux Distro x64 ARM64
Alma Linux 9.x o superior 9.x o superior
CentOS 7.x+, 8.x+ 7.x+
Debian 10+ 11.x+
Flatcar Linux 3374.2.x+ 3374.2.x+
Azure Linux 2.x 2.x
openSUSE 12.3+ No compatible
Oracle Linux 6.4+, 7.x+, 8.x+ No compatible
Red Hat Enterprise Linux 6.7+, 7.x+, 8.x+ 8.6+, 9.0+
Rocky Linux 9.x o superior 9.x o superior
SLES 12.x+, 15.x+ 15.x SP4+
Ubuntu 18.04+, 20.04+, 22.04+ 20.04+, 22.04+

Recomendaciones

  • VMAccess se diseñó para recuperar el acceso a una máquina virtual una vez que se ha perdido. En función de este principio, concede permiso de sudo a la cuenta especificada en el campo del nombre de usuario. Si no desea que un usuario obtenga permisos de sudo, inicie sesión en la máquina virtual y use herramientas integradas (por ejemplo, usermod, chage, etc.) para administrar usuarios sin privilegios.
  • Solo puede tener aplicada una versión de la extensión a una máquina virtual. Para ejecutar una segunda acción, actualice la extensión existente con una nueva configuración.
  • Durante una actualización del usuario, VMAccess modifica el archivo sshd_config y realiza una copia de seguridad de él previamente. Para restaurar la configuración SSH original de la copia de seguridad, ejecute VMAccess con restore_backup_ssh establecido en True.

Esquema de extensión

La configuración de la extensión VMAccess incluye opciones para el nombre de usuario, las contraseñas, las claves SSH, etc. Esta información se puede almacenar en archivos de configuración, se puede especificar en la línea de comandos o se puede incluir en una plantilla de Azure Resource Manager (ARM). El siguiente esquema JSON contiene todas las propiedades disponibles para su uso en la configuración pública y protegida.

{
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "name": "<name>",
  "apiVersion": "2023-09-01",
  "location": "<location>",
  "dependsOn": [
          "[concat('Microsoft.Compute/virtualMachines/', <vmName>)]"
  ],
  "properties": {
    "publisher": "Microsoft.OSTCExtensions",
    "type": "VMAccessForLinux",
    "typeHandlerVersion": "1.5",
    "autoUpgradeMinorVersion": true,
    "settings": {
      "check_disk": true,
      "repair_disk": false,
      "disk_name": "<disk-name>",
    },
    "protectedSettings": {
      "username": "<username>",
      "password": "<password>",
      "ssh_key": "<ssh-key>",
      "reset_ssh": false,
      "remove_user": "<username>",
      "expiration": "<expiration>",
      "remove_prior_keys": false,
      "restore_backup_ssh": true
    } 
  }
}

Valores de propiedad

Nombre Valor / ejemplo Tipo de datos
apiVersion 2023-09-01 date
publisher Microsoft.OSTCExtensions string
type VMAccessForLinux string
typeHandlerVersion 1.5 int

Valores de la propiedad settings

Nombre Tipo de datos Descripción
check_disk boolean Indica si se va a comprobar el disco (opcional). Sólo uno de check_disk y repair_disk puede ser true.
repair_disk boolean Indica si se va a comprobar el disco (opcional). Sólo uno de check_disk y repair_disk puede ser true.
disk_name string Nombre del disco que se va a reparar (obligatorio cuando repair_disk es true).
username string Nombre del usuario que se va a administrar (necesario para todas las acciones de una cuenta de usuario).
password string Contraseña que se va a establecer para la cuenta de usuario.
ssh_key string Clave pública SSH que se va a agregar para la cuenta de usuario. La clave SSH puede estar en formato ssh-rsa, ssh-ed25519 o .pem.
reset_ssh boolean Indica si se va a restablecer SSH o no. Si es true, reemplaza el archivo sshd_config por un archivo de recursos interno correspondiente a la configuración de SSH predeterminada para esa distribución.
remove_user string Nombre del usuario que se va a quitar. No se puede utilizar con reset_ssh, restore_backup_ssh y password.
expiration string Expiración que se va a establecer para la cuenta, en formato yyyy-mm-dd. El valor predeterminado es "Nunca".
remove_prior_keys boolean Si se van a quitar o no claves SSH antiguas al agregar una nueva. Debe usarse con ssh_key.
restore_backup_ssh boolean Indica si se va a restaurar la copia de seguridad original sshd_config.

Implementación de plantilla

Las extensiones de VM de Azure pueden implementarse con plantillas de Azure Resource Manager (ARM). El esquema JSON detallado en la sección anterior se puede usar en una plantilla de ARM para ejecutar la extensión VMAccess durante la implementación de la plantilla. Puede encontrar una plantilla de ejemplo que incluye la extensión VMAccess en GitHub.

La configuración de JSON para una extensión de máquina virtual debe estar anidada dentro del fragmento de recursos de máquina virtual de la plantilla, en concreto en el objeto "resources": [] de la plantilla de máquina virtual y, en el caso de un conjunto de escalado de máquinas virtuales, en el objeto "virtualMachineProfile":"extensionProfile":{"extensions" :[].

Implementación de la CLI de Azure

Uso de comandos de usuario de máquina virtual de la CLI de Azure

Los siguientes comandos de la CLI en az vm user usan la extensión VMAccess. Para usar estos comandos, es preciso instalar la CLI de Azure más reciente e iniciar sesión en una cuenta de Azure mediante az login.

Actualizar la clave SSH

En el ejemplo siguiente se actualiza la clave SSH del usuario azureUser en la VM denominada myVM:

az vm user update \
  --resource-group myResourceGroup \
  --name myVM \
  --username azureUser \
  --ssh-key-value ~/.ssh/id_rsa.pub

Nota

El comando az vm user update anexa el nuevo texto de clave pública al archivo ~/.ssh/authorized_keys para el usuario administrador de la máquina virtual. Este comando no reemplaza ni quita las claves SSH existentes. Este comando no quita las claves anteriores establecidas en el momento de la implementación ni las actualizaciones posteriores mediante la extensión VMAccess.

Restablecimiento de contraseña

En el ejemplo siguiente se restablece la contraseña del usuario azureUser en la máquina virtual denominada "myVM":

az vm user update \
  --resource-group myResourceGroup \
  --name myVM \
  --username azureUser \
  --password myNewPassword

Reinicio de SSH

En el ejemplo siguiente se reinicia el demonio de SSH y se restablece la configuración de SSH a los valores predeterminados en una máquina virtual denominada "myVM":

az vm user reset-ssh \
  --resource-group myResourceGroup \
  --name myVM

Nota:

El comando az vm user reset-ssh reemplaza el archivo sshd_config por un archivo de configuración predeterminado del directorio de recursos internos. Este comando no restaura la configuración de SSH original que se encuentra en la máquina virtual.

Creación de un usuario administrativo/sudo

En el ejemplo siguiente se crea un usuario denominado myNewUser con permisos sudo. La cuenta utiliza una clave SSH para la autenticación en la máquina virtual denominada myVM. Este método le ayuda a recuperar el acceso a una máquina virtual cuando se pierden u olvidan las credenciales actuales. Se recomienda limitar las cuentas con permisos sudo.

az vm user update \
  --resource-group myResourceGroup \
  --name myVM \
  --username myNewUser \
  --ssh-key-value ~/.ssh/id_rsa.pub

Eliminación de un usuario

En el ejemplo siguiente se elimina un usuario denominado "myNewUser" en la máquina virtual llamada "myVM":

az vm user delete \
  --resource-group myResourceGroup \
  --name myVM \
  --username myNewUser

Uso de comandos de extensión VM/VMSS de la CLI de Azure

También puede utilizar los comandos az vm extension set y az vmss extension set para ejecutar la extensión VMAccess con la configuración especificada.

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name VMAccessForLinux \
  --publisher Microsoft.OSTCExtensions \
  --version 1.5 \
  --settings '{"check_disk":true}'
  --protected-settings '{"username":"user1","password":"userPassword"}'

Los parámetros --settings y --protected-settings también aceptan rutas de acceso de archivo JSON. Por ejemplo, para actualizar la clave pública SSH de un usuario, cree un archivo JSON denominado update_ssh_key.json y agregue la configuración en el siguiente formato. Reemplace los valores del archivo por su propia información:

{
  "username":"azureuser",
  "ssh_key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCZ3S7gGp3rcbKmG2Y4vGZFMuMZCwoUzZNGxxxxxx2XV2x9FfAhy8iGD+lF8UdjFX3t5ebMm6BnnMh8fHwkTRdOt3LDQq8o8ElTBrZaKPxZN2thMZnODs5Hlemb2UX0oRIGRcvWqsd4oJmxsXa/Si98Wa6RHWbc9QZhw80KAcOVhmndZAZAGR+Wq6yslNo5TMOr1/ZyQAook5C4FtcSGn3Y+WczaoGWIxG4ZaWk128g79VIeJcIQqOjPodHvQAhll7qDlItVvBfMOben3GyhYTm7k4YwlEdkONm4yV/UIW0la1rmyztSBQIm9sZmSq44XXgjVmDHNF8UfCZ1ToE4r2SdwTmZv00T2i5faeYnHzxiLPA3Enub7xxxxxxwFArnqad7MO1SY1kLemhX9eFjLWN4mJe56Fu4NiWJkR9APSZQrYeKaqru4KUC68QpVasNJHbuxPSf/PcjF3cjO1+X+4x6L1H5HTPuqUkyZGgDO4ynUHbko4dhlanALcriF7tIfQR9i2r2xOyv5gxJEW/zztGqWma/d4rBoPjnf6tO7rLFHXMt/DVTkAfn5wxxtLDwkn5FMyvThRmex3BDf0gujoI1y6cOWLe9Y5geNX0oj+MXg/W0cXAtzSFocstV1PoVqy883hNoeQZ3mIGB3Q0rIUm5d9MA2bMMt31m1g3Sin6EQ== azureuser@myVM"
}

Ejecute la extensión VMAccess mediante el siguiente comando:

az vm extension set \
  --resource-group myResourceGroup \
  --vm-name myVM \
  --name VMAccessForLinux \
  --publisher Microsoft.OSTCExtensions \
  --version 1.5 \
  --protected-settings update_ssh_key.json

Implementación de Azure PowerShell

Azure PowerShell puede usarse para implementar la extensión VMAccess en una máquina virtual o un conjunto de escalado de máquinas virtuales existente. Puede implementar la extensión en una máquina virtual mediante la ejecución de:

$username = "<username>"
$sshKey = "<cert-contents>"

$settings = @{"check_disk" = $true};
$protectedSettings = @{"username" = $username; "ssh_key" = $sshKey};

Set-AzVMExtension -ResourceGroupName "<resource-group>" `
    -VMName "<vm-name>" `
    -Location "<location>" `
    -Publisher "Microsoft.OSTCExtensions" `
    -ExtensionType "VMAccessForLinux" `
    -Name "VMAccessForLinux" `
    -TypeHandlerVersion "1.5" `
    -Settings $settings `
    -ProtectedSettings $protectedSettings

También puede proporcionar y modificar la configuración de la extensión mediante cadenas:

$username = "<username>"
$sshKey = "<cert-contents>"

$settingsString = '{"check_disk":true}';
$protectedSettingsString = '{"username":"' + $username + '","ssh_key":"' + $sshKey + '"}';

Set-AzVMExtension -ResourceGroupName "<resource-group>" `
    -VMName "<vm-name>" `
    -Location "<location>" `
    -Publisher "Microsoft.OSTCExtensions" `
    -ExtensionType "VMAccessForLinux" `
    -Name "VMAccessForLinux" `
    -TypeHandlerVersion "1.5" `
    -SettingString $settingsString `
    -ProtectedSettingString $protectedSettingsString

Para implementar en un conjunto de escalado de máquinas virtuales, ejecute el siguiente comando:

$resourceGroupName = "<resource-group>"
$vmssName = "<vmss-name>"

$protectedSettings = @{
  "username" = "azureUser"
  "password" = "userPassword"
}

$publicSettings = @{
  "repair_disk" = $true
  "disk_name" = "<disk_name>"
}

$vmss = Get-AzVmss `
            -ResourceGroupName $resourceGroupName `
            -VMScaleSetName $vmssName

Add-AzVmssExtension -VirtualMachineScaleSet $vmss `
    -Name "<extension-name>" `
    -Publisher "Microsoft.OSTCExtensions" `
    -Type "VMAccessForLinux" `
    -TypeHandlerVersion "1.5"" `
    -AutoUpgradeMinorVersion $true `
    -Setting $publicSettings `
    -ProtectedSetting $protectedSettings

Update-AzVmss `
    -ResourceGroupName $resourceGroupName `
    -Name $vmssName `
    -VirtualMachineScaleSet $vmss

Solución de problemas y asistencia

Los registros de la extensión VMAccess existen localmente en la máquina virtual y son los más informativos en lo que respecta a la solución de problemas.

Location Descripción
/var/log/waagent.log Contiene registros del agente de Linux y muestra cuándo se produjo una actualización de la extensión. Podemos comprobarlo para garantizar que se ejecutó la extensión.
/var/log/azure/Microsoft.OSTCExtensions.VMAccessForLinux/* La extensión VMAccess genera registros, que se pueden encontrar aquí. El directorio contiene CommandExecution.log, donde puede encontrar cada comando ejecutado junto con su resultado, además de extension.log, que contiene registros individuales para cada ejecución.
/var/lib/waagent/Microsoft.OSTCExtensions.VMAccessForLinux-<versión más reciente>/config/* La configuración y los archivos binarios para la extensión de máquina virtual VMAccess.

También puede recuperar el estado de ejecución de la extensión VMAccess, junto con otras extensiones en una máquina virtual determinada, ejecutando el siguiente comando:

az vm extension list --resource-group myResourceGroup --vm-name myVM -o table

Para obtener más ayuda, puede ponerse en contacto con los expertos de Soporte técnico de la comunidad de Azure. Como alternativa, puede registrar un incidente de soporte técnico de Azure. Vaya a Soporte técnico de Azure y seleccione Obtener soporte técnico. Para más información sobre el Soporte técnico de Azure, consulte las preguntas frecuentes sobre los planes de soporte técnico de Azure.

Pasos siguientes

Para ver el código, las versiones actuales y más documentación, consulte VMAccess Linux - GitHub.