Configurar Bastion para la autenticación Kerberos mediante Azure Portal

En este artículo, se muestra cómo configurar Azure Bastion para usar la autenticación Kerberos. La autenticación Kerberos se puede usar con las SKU Básica y Estándar de Bastion. Para más información sobre la autenticación Kerberos, consulte Introducción a la autenticación Kerberos. Para más información sobre Azure Bastion, consulte ¿Qué es Azure Bastion?

Consideraciones

  • La configuración de Kerberos para Azure Bastion se puede configurar solo en Azure Portal y no con el cliente nativo.
  • Las máquinas virtuales migradas desde el entorno local a Azure no se admiten actualmente para Kerberos. 
  • La autenticación entre dominios no se admite actualmente para Kerberos.
  • El controlador de dominio debe ser una máquina virtual hospedada en Azure dentro de la misma red virtual que se implementa bastión.
  • Los cambios en el servidor DNS no se admiten actualmente para Kerberos. Después de realizar cambios en el servidor DNS, deberá eliminar y volver a crear el recurso de Bastion.
  • Si se agregan controladores de dominio (controladores de dominio) adicionales, Bastion solo reconocerá el primer controlador de dominio.
  • Si se agregan controladores de dominio adicionales para dominios diferentes, los dominios agregados no se pueden autenticar correctamente con Kerberos.

Requisitos previos

  • Una cuenta de Azure con una suscripción activa. Si no tiene ninguna, cree una gratis. Para poder conectarse a una máquina virtual mediante el explorador con Bastion, debe poder iniciar sesión en Azure Portal.

  • Una red virtual de Azure. Para conocer los pasos para crear una red virtual, consulte Inicio rápido: Creación de una red virtual.

Actualización de los servidores DNS de la red virtual

En esta sección, los pasos siguientes le ayudarán a actualizar la red virtual para especificar la configuración de DNS personalizada.

  1. Inicie sesión en Azure Portal.
  2. Vaya a la red virtual para la que desea implementar los recursos de Bastion.
  3. Vaya a la página Servidores DNS de la red virtual y seleccione Personalizado. Agregue la dirección IP del controlador de dominio hospedado en Azure y seleccione Guardar.

Implementación de Bastion

  1. Comience a configurar la implementación de Bastion siguiendo los pasos descritos en Tutorial: Implementación de Bastion mediante la configuración manual. Configure las opciones de la pestaña Aspectos básicos. A continuación, en la parte superior de la página, haga clic en Avanzado para ir a la pestaña de Opciones avanzadas.

  2. En la pestaña Avanzado, seleccione Kerberos.

    Screenshot of select bastion features.

  3. En la parte inferior de la página, seleccione Revisar y crear y, después, Crear para implementar Bastion en la red virtual.

  4. Una vez completada la implementación, puede usarlo para iniciar sesión en cualquier máquina virtual Windows accesible unida al DNS personalizado que especificó en los pasos anteriores.

Modificación de una implementación de Bastion existente

En esta sección, los pasos siguientes le ayudarán a modificar la red virtual y la implementación de Bastion existente para la autenticación Kerberos.

  1. Actualice la configuración de DNS de la red virtual.
  2. Vaya a la página del portal de la implementación de Bastion y seleccione Configuración.
  3. En la página Configuración, seleccione Autenticación Kerberos y, a continuación, seleccione Aplicar.
  4. Bastion se actualizará con las nuevas opciones de configuración.

Para comprobar que Bastion usa Kerberos

Nota

Debe usar el nombre principal de usuario (UPN) para iniciar sesión con Kerberos.

Una vez que haya habilitado Kerberos en el recurso de Bastion, puede comprobar que realmente usa Kerberos para la autenticación en la máquina virtual unida a un dominio de destino.

  1. Inicie sesión en la máquina virtual de destino (ya sea mediante Bastion o no). Busque "Editar directiva de grupo" en la barra de tareas y abra el Editor de directivas de grupo local.

  2. Seleccione Configuración del equipo > Configuración de Windows > Configuración de seguridad > Directivas locales > Opciones de seguridad.

  3. Busque la directiva Seguridad de red: restringir NTLM: tráfico NTLM entrante y establézcala en Denegar todas las cuentas de dominio. Dado que Bastion usa NTLM para la autenticación cuando Kerberos está deshabilitado, esta configuración garantiza que la autenticación basada en NTLM no se realice correctamente para futuros intentos de inicio de sesión en la máquina virtual.

  4. Finalice la sesión de máquina virtual.

  5. Conéctese a la máquina virtual de destino de nuevo mediante Bastion. El inicio de sesión se debe realizar correctamente, lo que indica que Bastion ha utilizado Kerberos (y no NTLM) para la autenticación.

    Nota:

    Para evitar la conmutación por recuperación a NTLM, asegúrese de seguir los pasos anteriores. La habilitación de Kerberos (sin seguir el procedimiento) no impedirá la conmutación por recuperación a NTLM.

Inicio rápido: Configuración de Bastion con Kerberos: plantilla de Resource Manager

Revisión de la plantilla

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "defaultValue": "[resourceGroup().location]",
      "type": "string"
    },
    "defaultNsgName": {
      "type": "string",
      "defaultValue": "Default-nsg"
    },
    "VnetName": {
      "type": "string",
      "defaultValue": "myVnet"
    },
    "ClientVMName": {
      "defaultValue": "Client-vm",
      "type": "string"
    },
    "ServerVMName": {
      "defaultValue": "Server-vm",
      "type": "string"
    },
    "vmsize": {
      "defaultValue": "Standard_DS1_v2",
      "type": "string",
      "metadata": {
        "description": "VM SKU to deploy"
      }
    },
    "ServerVMUsername": {
      "type": "string",
      "defaultValue": "serveruser",
      "metadata": {
        "description": "Admin username on all VMs."
      }
    },
    "ServerVMPassword": {
      "type": "securestring",
      "metadata": {
        "description": "Admin password on all VMs."
      }
    },
    "SafeModeAdministratorPassword": {
      "type": "securestring",
      "metadata": {
        "description": "See https://learn.microsoft.com/en-us/powershell/module/addsdeployment/install-addsdomaincontroller?view=windowsserver2022-ps#-safemodeadministratorpassword"
      }
    },
    "ClientVMUsername": {
      "type": "string",
      "defaultValue": "clientuser",
      "metadata": {
        "description": "username on ClientVM."
      }
    },
    "ClientVMPassword": {
      "type": "securestring",
      "metadata": {
        "description": "password on ClientVM."
      }
    },
    "ServerVmImage": {
      "type": "object",
      "defaultValue": {
        "offer": "WindowsServer",
        "publisher": "MicrosoftWindowsServer",
        "sku": "2019-Datacenter",
        "version": "latest"
      }
    },
    "ClientVmImage": {
      "type": "object",
      "defaultValue": {
        "offer": "Windows",
        "publisher": "microsoftvisualstudio",
        "sku": "Windows-10-N-x64",
        "version": "latest"
      }
    },
    "publicIPAllocationMethod": {
      "type": "string",
      "defaultValue": "Static"
    },
    "BastionName": {
      "defaultValue": "Bastion",
      "type": "string"
    },
    "BastionPublicIPName": {
        "defaultValue": "Bastion-ip",
        "type": "string"
    }
  },
  "variables": {
    "DefaultSubnetId": "[concat(resourceId('Microsoft.Network/virtualNetworks', parameters('VnetName')), '/subnets/default')]",
    "ClientVMSubnetId": "[concat(resourceId('Microsoft.Network/virtualNetworks', parameters('VnetName')), '/subnets/clientvm-subnet')]",
    "DNSServerIpAddress": "10.16.0.4",
    "ClientVMPrivateIpAddress": "10.16.1.4"
  },
  "resources": [
    {
      "apiVersion": "2020-03-01",
      "name": "[parameters('VnetName')]",
      "type": "Microsoft.Network/virtualNetworks",
      "location": "[parameters('location')]",
      "properties": {
        "dhcpOptions": {
          "dnsServers": [ "[variables('DNSServerIpAddress')]" ]
        },
        "subnets": [
          {
            "name": "default",
            "properties": {
              "addressPrefix": "10.16.0.0/24"
            }
          },
          {
            "name": "clientvm-subnet",
            "properties": {
              "addressPrefix": "10.16.1.0/24"
            }
          },
          {
            "name": "AzureBastionSubnet",
            "properties": {
              "addressPrefix": "10.16.2.0/24"
            }
          }
        ],
        "addressSpace": {
          "addressPrefixes": [
            "10.16.0.0/16"
          ]
        }
      }
    },
    {
      "type": "Microsoft.Network/networkInterfaces",
      "apiVersion": "2018-10-01",
      "name": "[concat(parameters('ServerVMName'), 'Nic')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', parameters('VnetName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "[concat(parameters('ServerVMName'), 'NicIpConfig')]",
            "properties": {
              "privateIPAllocationMethod": "Static",
              "privateIPAddress": "[variables('DNSServerIpAddress')]",
              "subnet": {
                "id": "[variables('DefaultSubnetId')]"
              }
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2020-06-01",
      "name": "[parameters('ServerVMName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Network/networkInterfaces/', parameters('ServerVMName'), 'Nic')]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('vmSize')]"
        },
        "osProfile": {
          "AdminUsername": "[parameters('ServerVMUsername')]",
          "AdminPassword": "[parameters('ServerVMPassword')]",
          "computerName": "[parameters('ServerVMName')]"
        },
        "storageProfile": {
          "imageReference": "[parameters('ServerVmImage')]",
          "osDisk": {
            "createOption": "FromImage",
            "managedDisk": {
              "storageAccountType": "Standard_LRS"
            }
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[ResourceId('Microsoft.Network/networkInterfaces/', concat(parameters('ServerVMName'), 'Nic'))]"
            }
          ]
        }
      }
    },
    {
      "type": "Microsoft.Compute/virtualMachines/extensions",
      "apiVersion": "2021-04-01",
      "name": "[concat(parameters('ServerVMName'),'/', 'PromoteToDomainController')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/',parameters('ServerVMName'))]"
      ],
      "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.7",
        "autoUpgradeMinorVersion": true,
        "settings": {
          "commandToExecute": "[concat('powershell.exe -Command \"Install-windowsfeature AD-domain-services; Import-Module ADDSDeployment;$Secure_String_Pwd = ConvertTo-SecureString ',parameters('SafeModeAdministratorPassword'),' -AsPlainText -Force; Install-ADDSForest -DomainName \"bastionkrb.test\" -SafeModeAdministratorPassword $Secure_String_Pwd -Force:$true')]"
          }
      }
    },
    {
      "type": "Microsoft.Network/networkInterfaces",
      "apiVersion": "2018-10-01",
      "name": "[concat(parameters('ClientVMName'), 'Nic')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Network/virtualNetworks/', parameters('VnetName'))]",
        "[concat('Microsoft.Compute/virtualMachines/', parameters('ServerVMName'))]"
      ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "[concat(parameters('ClientVMName'), 'NicIpConfig')]",
            "properties": {
              "privateIPAllocationMethod": "Static",
              "privateIPAddress": "[variables('ClientVMPrivateIpAddress')]",
              "subnet": {
                "id": "[variables('ClientVMSubnetId')]"
              }
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2020-06-01",
      "name": "[parameters('ClientVMName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Network/networkInterfaces/', parameters('ClientVMName'), 'Nic')]"
      ],
      "properties": {
        "hardwareProfile": {
          "vmSize": "[parameters('vmSize')]"
        },
        "osProfile": {
          "AdminUsername": "[parameters('ClientVMUsername')]",
          "AdminPassword": "[parameters('ClientVMPassword')]",
          "computerName": "[parameters('ClientVMName')]"
        },
        "storageProfile": {
          "imageReference": "[parameters('ClientVmImage')]",
          "osDisk": {
            "createOption": "FromImage",
            "managedDisk": {
              "storageAccountType": "Standard_LRS"
            }
          }
        },
        "networkProfile": {
          "networkInterfaces": [
            {
              "id": "[ResourceId('Microsoft.Network/networkInterfaces/', concat(parameters('ClientVMName'), 'Nic'))]"
            }
          ]
        }
      }
    },
    {
      "type": "Microsoft.Compute/virtualMachines/extensions",
      "apiVersion": "2021-04-01",
      "name": "[concat(parameters('ClientVMName'),'/', 'DomainJoin')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[concat('Microsoft.Compute/virtualMachines/',parameters('ClientVMName'))]",
        "[concat('Microsoft.Compute/virtualMachines/', parameters('ServerVMName'),'/extensions/', 'PromoteToDomainController')]",
        "[concat('Microsoft.Network/bastionHosts/', parameters('BastionName'))]"
      ],
      "properties": {
        "publisher": "Microsoft.Compute",
        "type": "CustomScriptExtension",
        "typeHandlerVersion": "1.7",
        "autoUpgradeMinorVersion": true,
        "settings": {
          "commandToExecute": "[concat('powershell.exe -Command Set-ItemProperty -Path HKLM:\\SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0\\ -Name RestrictReceivingNTLMTraffic -Value 1; $Pass= ConvertTo-SecureString -String ',parameters('ServerVMPassword'),' -AsPlainText -Force; $Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList \"AD\\serveruser\", $Pass; do { try { $joined = add-computer -computername Client-vm -domainname bastionkrb.test –credential $Credential -passthru -restart –force; } catch {}} while ($joined.HasSucceeded -ne $true)')]"
          }
      }
    },
    {
      "apiVersion": "2020-11-01",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[parameters('BastionPublicIPName')]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard"
      },
      "properties": {
        "publicIPAllocationMethod": "Static"
      },
      "tags": {}
    },
    {
        "type": "Microsoft.Network/bastionHosts",
        "apiVersion": "2020-11-01",
        "name": "[parameters('BastionName')]",
        "location": "[resourceGroup().location]",
        "dependsOn": [
            "[concat('Microsoft.Network/virtualNetworks/', parameters('VnetName'))]",
            "[concat('Microsoft.Network/publicIpAddresses/', parameters('BastionPublicIPName'))]"
        ],
        "sku": {
            "name": "Standard"
        },
        "properties": {
            "enableKerberos": "true",
            "ipConfigurations": [
                {
                    "name": "IpConf",
                    "properties": {
                        "privateIPAllocationMethod": "Dynamic",
                        "publicIPAddress": {
                            "id": "[resourceId('Microsoft.Network/publicIpAddresses', parameters('BastionPublicIPName'))]"
                        },
                        "subnet": {
                            "id": "[concat(resourceId('Microsoft.Network/virtualNetworks', parameters('VnetName')), '/subnets/AzureBastionSubnet')]"
                        }
                    }
                }
            ]
        }
    }
  ]
}

En la plantilla se han definido los recursos siguientes:

  • Implementa los siguientes recursos de Azure:
  • Haga que el servidor DNS de la red virtual apunte a la dirección IP privada de ServerVM (controlador de dominio).
  • Ejecuta una extensión de script personalizado en ServerVM para promoverla a un controlador de dominio con el nombre de dominio: bastionkrb.test.
  • Ejecuta una extensión de script personalizado en ClientVM para que la tenga:
    • Restringir NTLM: tráfico NTLM entrante = Denegar todas las cuentas de dominio (esto es para asegurarse de que Kerberos se usa para la autenticación).
    • Unirse al dominio bastionkrb.test.

Implementación de la plantilla

Para configurar Kerberos, implemente la plantilla de ARM anterior mediante la ejecución del siguiente comando de PowerShell:

New-AzResourceGroupDeployment -ResourceGroupName <your-rg-name> -TemplateFile "<path-to-template>\KerberosDeployment.json"`

Revisión de los recursos implementados

Ahora, inicie sesión en ClientVM mediante Bastion con autenticación Kerberos:

  • credenciales: nombre de usuario = serveruser@bastionkrb.test y contraseña = <password-entered-during-deployment>.

Pasos siguientes

Para más información sobre Azure Bastion, consulte ¿Qué es Azure Bastion?