Поделиться через


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

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

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

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

Предварительные требования

  • Учетная запись Azure с активной подпиской. Если у вас ее нет, создайте подписку бесплатно. Чтобы подключиться к виртуальной машине через браузер с помощью Бастиона, необходимо войти на портал Azure.
  • Убедитесь, что группы безопасности сети (NSG), связанные с системами с поддержкой Azure Bastion и Kerberos (например, контроллерами домена), разрешают входящий и исходящий трафик на следующих портах: 53, 88, 389, 464 и 636. Эти порты необходимы для корректного разрешения DNS, аутентификации Kerberos и связи с Active Directory. Дополнительные сведения см. в документации Microsoft по настройке брандмауэров для доменов и доверенных отношений Active Directory: Настройка Брандмауэр Windows для разрешения доменов и доверенных отношений Active Directory
  • Виртуальная сеть Azure. Для инструкций по созданию виртуальной сети см. Краткое руководство: Создание виртуальной сети.

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

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

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

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

  1. Начните настройку развертывания бастиона с помощью шагов, описанных в Quickstart: развертывание Azure Bastion на портале Azure. Настройте параметры на вкладке Основные. Затем в верхней части страницы нажмите кнопку Дополнительно, чтобы перейти на вкладку "Дополнительно".
  2. На вкладке Дополнительно выберите Kerberos.
  3. В нижней части страницы выберите Проверка и создание, а затем Создать, чтобы развернуть Бастион в виртуальной сети.
  4. После завершения развертывания его можно использовать для входа в любые доступные Windows виртуальные машины, присоединенные к пользовательскому DNS, указанному на предыдущих шагах.

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

В этом разделе следующие шаги помогут вам изменить виртуальную сеть и существующее развертывание Bastion для аутентификации Kerberos.

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

Чтобы убедиться, что Бастион использует Kerberos

Примечание.

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

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

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

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

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

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

  5. Выполните подключение на целевую виртуальную машину еще раз с помощью Бастиона. Вход должен завершиться успешно, указывая, что Bastion использовал 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, используя Bastion и проверку подлинности Kerberos.

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

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

Дополнительные сведения об Azure Bastion см. в разделе Что такое Azure Bastion?