Udostępnij za pośrednictwem


Konfigurowanie usługi Bastion na potrzeby uwierzytelniania Kerberos przy użyciu witryny Azure Portal

W tym artykule pokazano, jak skonfigurować usługę Azure Bastion do korzystania z uwierzytelniania Kerberos. Uwierzytelnianie Kerberos może być używane zarówno z jednostkami SKU podstawową, jak i standardową usługą Bastion. Aby uzyskać więcej informacji na temat uwierzytelniania Kerberos, zobacz Omówienie uwierzytelniania Kerberos. Aby uzyskać więcej informacji na temat usługi Azure Bastion, zobacz Co to jest usługa Azure Bastion?

Kwestie wymagające rozważenia

  • Ustawienie Protokołu Kerberos dla usługi Azure Bastion można skonfigurować tylko w witrynie Azure Portal, a nie w przypadku klienta natywnego.
  • Maszyny wirtualne migrowane ze środowiska lokalnego na platformę Azure nie są obecnie obsługiwane w przypadku protokołu Kerberos. 
  • Uwierzytelnianie między obszarami nie jest obecnie obsługiwane w przypadku protokołu Kerberos.
  • Kontroler domeny musi być maszyną wirtualną hostowaną na platformie Azure w tej samej sieci wirtualnej, która jest wdrożona przez bastion.
  • Zmiany w serwerach DNS nie są propagowane do usługi Bastion. Ponowne wdrożenie usługi Bastion jest wymagane, aby informacje DNS były prawidłowo propagowane. Po wprowadzeniu jakichkolwiek zmian na serwerze DNS należy usunąć i ponownie utworzyć zasób usługi Bastion.
  • W przypadku dodania dodatkowego kontrolera domeny (kontrolerów domeny) usługa Bastion rozpozna tylko pierwszy kontroler domeny.
  • Jeśli dodatkowe kontrolery domeny są dodawane dla różnych domen, dodane domeny nie mogą pomyślnie uwierzytelniać się za pomocą protokołu Kerberos.

Wymagania wstępne

  • Konto platformy Azure z aktywną subskrypcją. Jeśli go nie masz, utwórz go bezpłatnie. Aby móc nawiązać połączenie z maszyną wirtualną za pośrednictwem przeglądarki przy użyciu usługi Bastion, musisz mieć możliwość zalogowania się do witryny Azure Portal.

  • Sieć wirtualna platformy Azure. Aby uzyskać instrukcje tworzenia sieci wirtualnej, zobacz Szybki start: tworzenie sieci wirtualnej.

Aktualizowanie serwerów DNS sieci wirtualnej

W tej sekcji poniższe kroki ułatwiają aktualizowanie sieci wirtualnej w celu określenia niestandardowych ustawień DNS.

  1. Zaloguj się w witrynie Azure Portal.
  2. Przejdź do sieci wirtualnej, dla której chcesz wdrożyć zasoby usługi Bastion.
  3. Przejdź do strony serwery DNS dla sieci wirtualnej i wybierz pozycję Niestandardowe. Dodaj adres IP kontrolera domeny hostowanego na platformie Azure i pozycję Zapisz.

Wdrażanie usługi Bastion

  1. Rozpocznij konfigurowanie wdrożenia bastionu, wykonując kroki opisane w temacie Samouczek: wdrażanie usługi Bastion przy użyciu ustawień konfiguracji ręcznej. Skonfiguruj ustawienia na karcie Podstawy . Następnie w górnej części strony kliknij pozycję Zaawansowane , aby przejść do karty Zaawansowane.

  2. Na karcie Zaawansowane wybierz pozycję Kerberos.

    Zrzut ekranu przedstawiający wybieranie funkcji bastionu.

  3. W dolnej części strony wybierz pozycję Przejrzyj i utwórz, a następnie pozycję Utwórz , aby wdrożyć usługę Bastion w sieci wirtualnej.

  4. Po zakończeniu wdrażania możesz użyć go do zalogowania się do wszystkich dostępnych maszyn wirtualnych z systemem Windows dołączonych do niestandardowego systemu DNS określonego w poprzednich krokach.

Aby zmodyfikować istniejące wdrożenie usługi Bastion

W tej sekcji poniższe kroki ułatwiają modyfikowanie sieci wirtualnej i istniejącego wdrożenia usługi Bastion na potrzeby uwierzytelniania Kerberos.

  1. Zaktualizuj ustawienia DNS dla sieci wirtualnej.
  2. Przejdź do strony portalu dla wdrożenia usługi Bastion i wybierz pozycję Konfiguracja.
  3. Na stronie Konfiguracja wybierz pozycję Uwierzytelnianie Kerberos, a następnie wybierz pozycję Zastosuj.
  4. Usługa Bastion aktualizuje nowe ustawienia konfiguracji.

Aby sprawdzić, czy usługa Bastion korzysta z protokołu Kerberos

Uwaga

Aby zalogować się przy użyciu protokołu Kerberos, musisz użyć głównej nazwy użytkownika (UPN).

Po włączeniu protokołu Kerberos w zasobie usługi Bastion możesz sprawdzić, czy faktycznie używa protokołu Kerberos do uwierzytelniania na docelowej maszynie wirtualnej przyłączonej do domeny.

  1. Zaloguj się do docelowej maszyny wirtualnej (za pośrednictwem usługi Bastion lub nie). Wyszukaj ciąg "Edytuj zasady grupy" na pasku zadań i otwórz Edytor lokalnych zasad grupy.

  2. Wybierz pozycję Konfiguracja > komputera Ustawienia zabezpieczeń systemu > Windows Ustawienia > zabezpieczeń Opcje zabezpieczeń zasad > lokalnych.

  3. Znajdź zasady Zabezpieczenia sieci: Ogranicz ntLM: przychodzący ruch NTLM i ustaw dla niego wartość Odmów wszystkich kont domeny. Ponieważ usługa Bastion używa protokołu NTLM do uwierzytelniania, gdy protokół Kerberos jest wyłączony, to ustawienie zapewnia, że uwierzytelnianie oparte na protokole NTLM nie powiedzie się w przypadku przyszłych prób logowania na maszynie wirtualnej.

  4. Zakończ sesję maszyny wirtualnej.

  5. Połącz się ponownie z docelową maszyną wirtualną przy użyciu usługi Bastion. Logowanie powinno zakończyć się pomyślnie, co oznacza, że usługa Bastion używa protokołu Kerberos (a nie NTLM) do uwierzytelniania.

    Uwaga

    Aby zapobiec powrotowi po awarii do protokołu NTLM, upewnij się, że wykonasz powyższe kroki. Włączenie protokołu Kerberos (bez procedury) nie uniemożliwi powrotu po awarii do protokołu NTLM.

Szybki start: konfigurowanie usługi Bastion przy użyciu protokołu Kerberos — szablon usługi Resource Manager

Przegląd szablonu

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

W szablonie zdefiniowano następujące zasoby:

  • Wdraża następujące zasoby platformy Azure:
    • Microsoft.Network/virtualNetworks: utwórz sieć wirtualną platformy Azure.
    • Microsoft.Network/bastionHosts: utwórz standardową usługę SKU Bastion z włączonym publicznym adresem IP i funkcją Protokołu Kerberos.
    • Utwórz maszynę wirtualną ClientVM z systemem Windows 10 i maszynę wirtualną Server 2019 ServerVM.
  • Serwer DNS sieci wirtualnej wskazuje prywatny adres IP maszyny wirtualnej ServerVM (kontroler domeny).
  • Uruchamia rozszerzenie niestandardowego skryptu na maszynie wirtualnej ServerVM, aby podwyższyć poziom go do kontrolera domeny o nazwie domeny: bastionkrb.test.
  • Uruchamia rozszerzenie niestandardowego skryptu na maszynie clientVM, aby je mieć:
    • Ogranicz protokół NTLM: Przychodzący ruch NTLM = Odmów wszystkich kont domeny (jest to zapewnienie, że protokół Kerberos jest używany do uwierzytelniania).
    • Przyłącz domenę bastionkrb.test do domeny.

Wdrażanie szablonu

Aby skonfigurować protokół Kerberos, wdróż poprzedni szablon usługi ARM, uruchamiając następujące polecenie programu PowerShell:

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

Przeglądanie wdrożonych zasobów

Teraz zaloguj się do maszyny clientVM przy użyciu usługi Bastion z uwierzytelnianiem Kerberos:

  • credentials: username = serveruser@bastionkrb.test and password = <password-entered-during-deployment>.

Następne kroki

Aby uzyskać więcej informacji na temat usługi Azure Bastion, zobacz Co to jest usługa Azure Bastion?