Configurar o Bastion para a autenticação Kerberos usando o portal do Azure

Este artigo mostra como configurar o Azure Bastion para usar a autenticação Kerberos. A autenticação Kerberos pode ser usada com os SKUs Básico e Bastion Standard. Para obter mais informações sobre a autenticação Kerberos, consulte a Visão geral da autenticação Kerberos. Para obter mais informações sobre o Azure Bastion, confira O que é o Azure Bastion?

Considerações

  • A configuração do Kerberos para o Azure Bastion pode ser definida somente no portal do Azure e não com cliente nativo.
  • Atualmente, as VMs migradas do local para o Azure não têm suporte para Kerberos. 
  • Atualmente, a autenticação entre realms não tem suporte para Kerberos.
  • O controlador de domínio deve ser uma VM hospedada do Azure na mesma VNET que o bastion está implantado.
  • Atualmente, as alterações no servidor DNS não têm suporte para Kerberos. Depois de fazer alterações no servidor DNS, você precisará excluir e recriar o recurso do Bastion.
  • Se forem adicionados outros DCs (controladores de domínio), o Bastion reconhecerá apenas o primeiro DC.
  • Se DCs adicionais forem adicionados para domínios diferentes, os domínios adicionados não poderão se autenticar com êxito com o Kerberos.

Pré-requisitos

  • Uma conta do Azure com uma assinatura ativa. Caso não tenha uma, crie uma gratuitamente. Para se conectar a uma VM pelo navegador usando o Bastion, você precisa conseguir entrar no portal do Azure.

  • Uma rede virtual do Azure. Para obter as etapas para criar uma VNet, consulte Início Rápido: Criar uma rede virtual.

Atualizar servidores DNS da VNet

Nesta seção, as etapas a seguir ajudam você a atualizar sua rede virtual para especificar configurações de DNS personalizadas.

  1. Entre no portal do Azure.
  2. Vá para a rede virtual para a qual você deseja implantar os recursos do Bastion.
  3. Vá para a página de Servidores DNS para sua VNet e selecione Personalizar. Adicione o endereço IP do controlador de domínio hospedado pelo Azure e selecione Salvar.

Implantar o Bastion

  1. Comece a configurar a implantação do Bastion seguindo as etapas em Tutorial: Implantar o Bastion usando definições de configuração manuais. Defina as configurações na guia Noções básicas. Em seguida, na parte superior da página, clique em Avançado para ir para a guia Avançado.

  2. Na guia Avançado, selecione Kerberos.

    Screenshot of select bastion features.

  3. Na parte inferior da página, selecione Examinar + criar e, em seguida, Criar para implantar o Bastion em sua rede virtual.

  4. Depois que a implantação for concluída, você poderá usá-la para entrar em qualquer VM Windows acessível ingressada no DNS personalizado especificado nas etapas anteriores.

Para modificar uma implantação existente do Bastion

Nesta seção, as etapas a seguir ajudam você a modificar sua rede virtual e a implantação existente do Bastion para a autenticação Kerberos.

  1. Atualize as configurações de DNS para a sua rede virtual.
  2. Acesse a página do portal para a implantação do Bastion e selecione Configuração.
  3. Na página Configuração, selecione Autenticação Kerberos e, em seguida, Aplicar.
  4. O Bastion será atualizado com as novas configurações.

Para verificar se o Bastion está usando Kerberos

Observação

Use o nome UPN para se conectar usando o Kerberos.

Depois de habilitar o Kerberos no recurso do Bastion, você poderá verificar se ele está realmente usando o Kerberos para autenticação na VM de destino conectada ao domínio.

  1. Entre na VM de destino (via Bastion ou não). Procure por "Editar Política de Grupo" na barra de tarefas e abra o Editor de Política de Grupo Local.

  2. Selecione Configuração do Computador > Configurações do Windows > Configurações de Segurança > Políticas Locais > Opções de Segurança.

  3. Localize a política Segurança de rede: Restringir NTLM: Tráfego NTLM de entrada e defina-o como Negar todas as contas de domínio. Como o Bastion usa o NTLM para autenticação quando o Kerberos está desabilitado, essa configuração garante que a autenticação baseada em NTLM não tenha êxito para tentativas futuras de entrada na VM.

  4. Encerrar a sessão da VM.

  5. Conecte-se à VM de destino novamente usando o Bastion. A entrada deve ser bem-sucedida, indicando que o Bastion usou Kerberos (e não NTLM) para autenticação.

    Observação

    Para evitar o failback para o NTLM, siga as etapas anteriores. Habilitar o Kerberos (sem seguir o procedimento) não impedirá o failback para o NTLM.

Início Rápido: Configurar o Bastion com o Kerberos – Modelo do Resource Manager

Examinar o modelo

{
  "$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')]"
                        }
                    }
                }
            ]
        }
    }
  ]
}

Os seguintes recursos foram definidos no modelo:

  • Implanta os seguintes recursos do Azure:
  • Aponte o servidor DNS da VNet para o endereço IP privado da ServerVM (controlador de domínio).
  • Executa uma extensão de script personalizado na ServerVM para promovê-la a um controlador de domínio com o nome de domínio: bastionkrb.test.
  • Executa uma extensão de script personalizado no ClientVM para tê-lo:
    • Restrinja o NTLM: tráfego NTLM de entrada = negue todas as contas de domínio (isso serve para garantir que o Kerberos seja usado para autenticação).
    • Ingresse no domínio bastionkrb.test.

Implantar o modelo

Para configurar o Kerberos, implante o modelo do ARM anterior executando o seguinte cmd do PowerShell:

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

Examinar os recursos implantados

Agora, entre na ClientVM usando o Bastion com a autenticação Kerberos:

  • credenciais: nome de usuário = serveruser@bastionkrb.test e senha = <password-entered-during-deployment>.

Próximas etapas

Para obter mais informações sobre o Azure Bastion, confira O que é o Azure Bastion?