Konfigurieren von Bastion für die Kerberos-Authentifizierung mithilfe des Azure-Portals

In diesem Artikel erfahren Sie, wie Sie Bastion zur Verwendung der Kerberos-Authentifizierung konfigurieren. Die Kerberos-Authentifizierung kann sowohl mit der Basic-SKU von Bastion als auch mit der Standard-SKU verwendet werden. Weitere Informationen zur Kerberos-Authentifizierung finden Sie in der Übersicht zur Kerberos-Authentifizierung. Weitere Informationen zu Azure Bastion finden Sie unter Was ist Azure Bastion?.

Überlegungen

  • Die Kerberos-Einstellung kann für Azure Bastion nur im Azure-Portal und nicht mit einem nativen Client konfiguriert werden.
  • VMs, die von der lokalen Umgebung zu Azure migriert wurden, werden derzeit für Kerberos nicht unterstützt. 
  • Die bereichsübergreifende Authentifizierung wird für Kerberos derzeit nicht unterstützt.
  • Der Do Standard-Controller muss eine von Azure gehostete VM innerhalb desselben VNET sein, das bastion bereitgestellt wird.
  • Änderungen am DNS-Server werden für Kerberos derzeit nicht unterstützt. Nachdem Sie Änderungen am DNS-Server vorgenommen haben, müssen Sie die Bastion-Ressource löschen und neu erstellen.
  • Wenn zusätzliche Domänencontroller (Domänencontroller) hinzugefügt werden, erkennt Bastion nur den ersten DC.
  • Wenn zusätzliche DCs für verschiedene Domänen hinzugefügt werden, können sich die hinzugefügten Domänen nicht erfolgreich mit Kerberos authentifizieren.

Voraussetzungen

Aktualisieren von VNet-DNS-Servern

Die folgenden Schritte in diesem Abschnitt helfen Ihnen beim Aktualisieren Ihres virtuellen Netzwerks, um benutzerdefinierte DNS-Einstellungen anzugeben.

  1. Melden Sie sich beim Azure-Portal an.
  2. Wechseln Sie zum virtuellen Netzwerk, für das Sie die Bastion-Ressourcen bereitstellen möchten.
  3. Wechseln Sie zur Seite DNS-Server für Ihr VNet, und wählen Sie Benutzerdefiniert aus. Fügen Sie die IP-Adresse Ihres in Azure gehosteten Domänencontrollers hinzu, und wählen Sie Speichern aus.

Bereitstellen von Bastion

  1. Beginnen Sie die Konfiguration Ihrer Bastion-Bereitstellung mithilfe der Schritte im Tutorial: Bereitstellen von Bastion mithilfe manueller Konfigurationseinstellungen. Konfigurieren Sie die Einstellungen auf der Registerkarte Grundlagen. Klicken Sie dann oben auf der Seite auf Erweitert, um zur Registerkarte „Erweitert“ zu wechseln.

  2. Wählen Sie auf der Registerkarte Erweitert die Option Kerberos aus.

    Screenshot of select bastion features.

  3. Wählen Sie unten auf der Seite Überprüfen + erstellen aus und dann Erstellen, um Bastion in Ihrem virtuellen Netzwerk bereitzustellen.

  4. Sobald die Bereitstellung abgeschlossen ist, können Sie sie verwenden, um sich bei allen erreichbaren Windows-VMs anzumelden, die mit dem benutzerdefinierten DNS verknüpft sind, das Sie in den früheren Schritten angegeben haben.

So ändern Sie eine vorhandene Bastion-Bereitstellung

Die folgenden Schritte in diesem Abschnitt helfen Ihnen dabei, Ihr virtuelles Netzwerk und die vorhandene Bastion-Bereitstellung für die Kerberos-Authentifizierung zu ändern.

  1. Aktualisieren Sie die DNS-Einstellungen für Ihr virtuelles Netzwerk.
  2. Wechseln Sie zur Portalseite für Ihre Bastion-Bereitstellung, und wählen Sie Konfiguration aus.
  3. Wählen Sie auf der Seite „Konfiguration“ die Kerberos-Authentifizierung und dann Übernehmen aus.
  4. Bastion wird mit den neuen Konfigurationseinstellungen aktualisiert.

So überprüfen Sie, ob Bastion Kerberos verwendet

Hinweis

Sie müssen den Benutzerprinzipalnamen (User Principal Name, UPN) verwenden, um sich mithilfe von Kerberos anzumelden.

Nachdem Sie Kerberos auf Ihrer Bastion-Ressource aktiviert haben, können Sie überprüfen, ob zur Authentifizierung bei der mit der Zieldomäne verknüpften VM tatsächlich Kerberos verwendet wird.

  1. Melden Sie sich bei der Ziel-VM an (entweder über Bastion oder nicht). Suchen Sie in der Taskleiste nach „Gruppenrichtlinie bearbeiten“, und öffnen Sie den Editor für lokale Gruppenrichtlinien.

  2. Wählen Sie Computerkonfiguration > Windows-Einstellungen > Sicherheitseinstellungen > Lokale Richtlinien >Sicherheitsoptionen aus.

  3. Suchen Sie die Richtlinie Netzwerksicherheit: NTLM einschränken: Eingehender NTLM-Datenverkehr, und legen Sie sie auf Alle Domänenkonten verweigert fest. Da Bastion NTLM für die Authentifizierung verwendet, wenn Kerberos deaktiviert ist, stellt diese Einstellung sicher, dass die NTLM-basierte Authentifizierung für zukünftige Anmeldeversuche auf dem virtuellen Computer nicht erfolgreich ist.

  4. Beenden Sie die VM-Sitzung.

  5. Stellen Sie mithilfe von Bastion erneut eine Verbindung mit der Ziel-VM her. Die Anmeldung sollte erfolgreich sein und angeben, dass Bastion Kerberos (und nicht NTLM) für die Authentifizierung verwendet hat.

    Hinweis

    Führen Sie die vorherigen Schritte unbedingt aus, um ein Failback auf NTLM zu verhindern. Das Aktivieren von Kerberos (ohne das Verfahren zu befolgen) verhindert ein Failback auf NTLM nicht.

Schnellstart: Einrichten von Bastion mit Kerberos – Resource Manager-Vorlage

Überprüfen der Vorlage

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

In der Vorlage wurden die folgenden Ressourcen definiert:

  • Stellt die folgenden Azure-Ressourcen bereit:
    • Microsoft.Network/virtualNetworks: Dient zum Erstellen eines virtuellen Azure-Netzwerks.
    • Microsoft.Network/bastionHosts: Erstellen Sie eine Bastion-Instanz mit Standard-SKU mit öffentlicher IP-Adresse und aktiviertem Kerberos-Feature.
    • Erstelle Sie eine Windows 10-ClientVM-Komponente und eine Windows Server 2019-ServerVM-Komponente.
  • Der DNS-Server des VNet muss auf die private IP-Adresse der ServerVM-Komponente (Domänencontroller) verweisen.
  • Führt eine benutzerdefinierte Skripterweiterung auf der ServerVM-Komponente aus, um sie auf einen Domänencontroller mit dem folgenden Domänennamen heraufzustufen: bastionkrb.test.
  • Führt eine benutzerdefinierte Skripterweiterung auf dem ClientVM aus, um sie zu verwenden:
    • Festlegen von NTLM einschränken: Eingehender NTLM-Datenverkehr auf „Alle Domänenkonten verweigern“ (Dadurch wird sichergestellt, dass Kerberos für die Authentifizierung verwendet wird.)
    • Einbinden des Zielknotens in die Domäne bastionkrb.test

Bereitstellen der Vorlage

Stellen Sie zum Einrichten von Kerberos die obige ARM-Vorlage bereit, indem Sie den folgenden PowerShell-Befehl ausführen:

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

Überprüfen der bereitgestellten Ressourcen

Melden Sie sich jetzt mithilfe von Bastion mit Kerberos-Authentifizierung bei der ClientVM-Komponente an:

  • Anmeldeinformationen: Benutzername: serveruser@bastionkrb.test, Kennwort: <password-entered-during-deployment>

Nächste Schritte

Weitere Informationen zu Azure Bastion finden Sie unter Was ist Azure Bastion?.