Share via


Configurar o Bastion para 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 as SKUs Bastion Basic e 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, consulte O que é o Azure Bastion?

Considerações

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

Pré-requisitos

  • Uma conta do Azure com uma subscrição ativa. Se você não tiver um, crie um gratuitamente. Para poder se conectar a uma VM por meio de seu navegador usando Bastion, você deve ser capaz de entrar no portal do Azure.

  • Uma rede virtual do Azure. Para conhecer as etapas para criar uma rede virtual, consulte Guia de início rápido: criar uma rede virtual.

Atualizar servidores DNS VNet

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

  1. Inicie sessão no portal do Azure.
  2. Vá para a rede virtual para a qual você deseja implantar os recursos Bastion.
  3. Vá para a página de servidores DNS da sua rede virtual e selecione Personalizado. Adicione o endereço IP do seu controlador de domínio hospedado no Azure e Salvar.

Implementar o Bastion

  1. Comece a configurar sua implantação de bastião usando as etapas em Tutorial: Implantar Bastion usando definições de configuração manual. Configure 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 Rever + criar e, em seguida , Criar para implementar o Bastion na sua rede virtual.

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

Para modificar uma implantação de Bastion existente

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

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

Para verificar se Bastion está usando Kerberos

Nota

Você deve usar o UPN (Nome Principal do Usuário) para entrar usando Kerberos.

Depois de habilitar o Kerberos em seu recurso Bastion, você pode verificar se ele está realmente usando Kerberos para autenticação na VM ingressada no domínio de destino.

  1. Entre na VM de destino (via Bastion ou não). Procure "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. Encontre a política Segurança de rede: Restringir NTLM: Tráfego NTLM de entrada e defina-a como Negar todas as contas de domínio. Como Bastion usa NTLM para autenticação quando Kerberos está desabilitado, essa configuração garante que a autenticação baseada em NTLM não seja bem-sucedida para futuras tentativas de entrada na VM.

  4. Termine a sessão da VM.

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

    Nota

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

Guia de início rápido: configurar o Bastion com Kerberos - modelo do Gerenciador de Recursos

Rever 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:
  • Faça com que o servidor DNS da rede virtual aponte para o endereço IP privado do ServerVM (controlador de domínio).
  • Executa uma extensão de script personalizada na ServerVM para promovê-la a um controlador de domínio com nome de domínio: bastionkrb.test.
  • Executa uma extensão de script personalizada no ClientVM para tê-lo:
    • Restringir NTLM: tráfego NTLM de entrada = Negar todas as contas de domínio (isso é para garantir que o Kerberos seja usado para autenticação).
    • Ingresse no bastionkrb.test domínio.

Implementar o modelo

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

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

Rever os recursos implementados

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

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

Próximos passos

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