Настройка бастиона для проверки подлинности Kerberos с помощью портал Azure

В этой статье показано, как настроить Бастион Azure для использования проверки подлинности Kerberos. Проверку подлинности Kerberos можно использовать как с базовыми, так и стандартными номерами SKU бастиона. Дополнительные сведения о проверке подлинности Kerberos см. в статье, посвященной обзору проверки подлинности Kerberos. Дополнительные сведения о Бастионе Azure см. в статье Что такое Бастион Azure.

Рекомендации

  • Параметр Kerberos для Бастиона Azure можно настроить в портал Azure только и не с собственным клиентом.
  • Виртуальные машины, перенесенные из локальной среды в Azure, сейчас не поддерживаются для Kerberos. 
  • Проверка подлинности между областью в настоящее время не поддерживается для Kerberos.
  • Контроллер домена должен быть размещенной виртуальной машиной Azure в той же виртуальной сети, которая развертывается бастион.
  • Изменения DNS-сервера в настоящее время не поддерживаются для Kerberos. После внесения изменений на DNS-сервер необходимо удалить и повторно создать ресурс Бастиона.
  • Если добавляются дополнительные контроллеры домена (контроллеры домена), бастион распознает только первый контроллер домена.
  • Если дополнительные контроллеры домена добавляются для разных доменов, добавленные домены не могут успешно пройти проверку подлинности с помощью Kerberos.

Необходимые компоненты

Обновление DNS-серверов виртуальной сети

В этом разделе описано, как обновить виртуальную сеть, чтобы указать пользовательские параметры DNS.

  1. Войдите на портал Azure.
  2. Перейдите в виртуальную сеть, для которой требуется развернуть ресурсы Бастиона.
  3. Перейдите на страницу DNS-серверов для виртуальной сети и выберите Настраиваемые. Добавьте IP-адрес контроллера домена, размещенного в Azure, и сохраните.

Развертывание Бастиона

  1. Приступайте к настройке развертывания бастиона с помощью действий, описанных в руководстве по развертыванию Бастиона с помощью параметров конфигурации вручную. Настройте параметры на вкладке Основные. Затем в верхней части страницы нажмите кнопку Дополнительно, чтобы перейти на вкладку "Дополнительно".

  2. На вкладке Дополнительно выберите Kerberos.

    Screenshot of select bastion features.

  3. В нижней части страницы выберите Проверка и создание, а затем Создать, чтобы развернуть Бастион в виртуальной сети.

  4. После завершения развертывания его можно использовать для входа в любые доступные виртуальные машины Windows, присоединенные к пользовательской DNS, указанной на предыдущих шагах.

Изменение существующего развертывания Бастиона

В этом разделе описано, как изменить виртуальную сеть и существующее развертывание Бастиона для использования проверки подлинности Kerberos.

  1. Выполните обновление параметров DNS для виртуальной сети.
  2. Перейдите на страницу портала для развертывания Бастиона и выберите Конфигурация.
  3. На странице "Конфигурация" выберите Проверка подлинности Kerberos, а затем Применить.
  4. Бастион обновляется с новыми параметрами конфигурации.

Проверка использования Kerberos Бастионом

Примечание.

Для входа с помощью Kerberos необходимо использовать имя участника-пользователя (UPN).

После включения Kerberos в ресурсе Бастиона можно убедиться, что он фактически использует Kerberos для проверки подлинности на целевой виртуальной машине, присоединенной к домену.

  1. Войдите на целевую виртуальную машину (через Бастион или иным способом). Выполните поиск по строке "Изменить групповую политику" на панели задач и откройте редактор локальной групповой политики.

  2. Последовательно выберите Конфигурация компьютера > Параметры Windows > Параметры безопасности > Локальные политики > Параметры безопасности.

  3. Найдите политику Сетевая безопасность: ограничение: входящего трафика NTLM и установите для него значение Запретить все учетные записи домена. Так как Бастион использует NTLM для проверки подлинности при отключении Kerberos, этот параметр гарантирует, что проверка подлинности на основе NTLM завершается неудачно для будущих попыток входа на виртуальную машину.

  4. Завершите сеанс виртуальной машины.

  5. Выполните подключение на целевую виртуальную машину еще раз с помощью Бастиона. Вход должен завершиться успешно, указывая, что бастион использовал Kerberos (а не NTLM) для проверки подлинности.

    Примечание.

    Чтобы предотвратить восстановление размещения в NTLM, выполните указанные выше действия. Включение Kerberos (без выполнения процедуры) не позволит предотвратить восстановление размещения в NTLM.

Краткое руководство. Настройка бастиона с помощью kerberos — шаблон Resource Manager

Изучение шаблона

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

В шаблоне определены следующие ресурсы:

  • Развертывает следующие ресурсы Azure:
    • Microsoft.Network/virtualNetworks: создание виртуальной сети Azure.
    • Microsoft.Network/бастионHosts: создайте бастион SKU уровня "Стандартный" с включенным общедоступным IP-адресом и функцией Kerberos.
    • Создайте Windows 10 ClientVM и Windows Server 2019 ServerVM.
  • Укажите DNS-сервер виртуальной сети на частный IP-адрес сервера ServerVM (контроллер домена).
  • Запускает расширение пользовательского скрипта на сервере VM, чтобы повысить его до контроллера домена с доменным именем: bastionkrb.test
  • Запускает расширение пользовательского скрипта в ClientVM, чтобы он был следующим:
    • Ограничить NTLM: входящий трафик NTLM = запретить все учетные записи домена (это гарантирует, что Kerberos используется для проверки подлинности).
    • Присоединение к домену bastionkrb.test .

Развертывание шаблона

Чтобы настроить Kerberos, разверните предыдущий шаблон ARM, выполнив следующую команду PowerShell cmd:

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

Просмотр развернутых ресурсов

Теперь войдите в ClientVM с помощью бастиона с проверкой подлинности Kerberos:

  • учетные данные: имя пользователя = serveruser@bastionkrb.test и пароль = <password-entered-during-deployment>.

Следующие шаги

Дополнительные сведения о Бастионе Azure см. в статье Что такое Бастион Azure.