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


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

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

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

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

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

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

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

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

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

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

  1. Приступайте к настройке развертывания бастиона с помощью действий, описанных в руководстве по развертыванию Бастиона с помощью параметров конфигурации вручную. Настройте параметры на вкладке Основные. Затем в верхней части страницы нажмите кнопку Дополнительно, чтобы перейти на вкладку "Дополнительно".
  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 — шаблон Диспетчера ресурсов

Просмотр шаблона

{
  "$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.

  • учетные данные: имя пользователя = [email protected] и пароль = <password-entered-during-deployment>.

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

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