Configurare Bastion per l'autenticazione Kerberos usando il portale di Azure

Questo articolo illustra come configurare Azure Bastion per l'uso dell'autenticazione Kerberos. L'autenticazione Kerberos può essere usata con gli SKU Basic e Standard Bastion. Per altre informazioni sull'autenticazione Kerberos, vedere La panoramica dell'autenticazione Kerberos. Per altre informazioni su Azure Bastion, vedere Che cos'è Azure Bastion?

Considerazioni

  • L'impostazione Kerberos per Azure Bastion può essere configurata solo nel portale di Azure e non con il client nativo.
  • Le macchine virtuali migrate dall'ambiente locale ad Azure non sono attualmente supportate per Kerberos. 
  • L'autenticazione tra aree di autenticazione non è attualmente supportata per Kerberos.
  • Il controller di dominio deve essere una macchina virtuale ospitata in Azure all'interno della stessa rete virtuale distribuita da bastion.
  • Le modifiche apportate al server DNS non sono attualmente supportate per Kerberos. Dopo aver apportato modifiche al server DNS, è necessario eliminare e ricreare la risorsa Bastion.
  • Se vengono aggiunti controller di dominio aggiuntivi (controller di dominio), Bastion riconoscerà solo il primo controller di dominio.
  • Se vengono aggiunti controller di dominio aggiuntivi per domini diversi, i domini aggiunti non possono eseguire correttamente l'autenticazione con Kerberos.

Prerequisiti

  • Un account Azure con una sottoscrizione attiva. Se non è disponibile, crearne uno gratuitamente. Per potersi connettere a una VM tramite il browser con Bastion, è necessario essere in grado di accedere al portale di Azure.

  • Una rete virtuale di Azure. Per la procedura per creare una rete virtuale, vedere Avvio rapido: Creare una rete virtuale.

Aggiornare i server DNS della rete virtuale

In questa sezione, i passaggi seguenti consentono di aggiornare la rete virtuale per specificare le impostazioni DNS personalizzate.

  1. Accedi al portale di Azure.
  2. Passare alla rete virtuale per cui si vogliono distribuire le risorse Bastion.
  3. Passare alla pagina Server DNS per la rete virtuale e selezionare Personalizzato. Aggiungere l'indirizzo IP del controller di dominio ospitato in Azure e salvare.

Distribuire Bastion

  1. Iniziare a configurare la distribuzione bastion seguendo la procedura descritta in Esercitazione: Distribuire Bastion usando le impostazioni di configurazione manuali. Configurare le impostazioni nella scheda Informazioni di base . Quindi, nella parte superiore della pagina, fare clic su Avanzate per passare alla scheda Avanzate.

  2. Nella scheda Avanzate selezionare Kerberos.

    Screenshot of select bastion features.

  3. Nella parte inferiore della pagina selezionare Rivedi e crea e quindi Crea per distribuire Bastion nella rete virtuale.

  4. Al termine della distribuzione, è possibile usarlo per accedere a tutte le macchine virtuali Windows raggiungibili aggiunte al DNS personalizzato specificato nei passaggi precedenti.

Per modificare una distribuzione Bastion esistente

In questa sezione vengono illustrati i passaggi seguenti che consentono di modificare la rete virtuale e la distribuzione bastion esistente per l'autenticazione Kerberos.

  1. Aggiornare le impostazioni DNS per la rete virtuale.
  2. Passare alla pagina del portale per la distribuzione di Bastion e selezionare Configurazione.
  3. Nella pagina Configurazione selezionare Autenticazione Kerberos, quindi selezionare Applica.
  4. Bastion viene aggiornato con le nuove impostazioni di configurazione.

Per verificare che Bastion usi Kerberos

Nota

È necessario usare il nome dell'entità utente (UPN) per accedere con Kerberos.

Dopo aver abilitato Kerberos nella risorsa Bastion, è possibile verificare che usi effettivamente Kerberos per l'autenticazione nella macchina virtuale aggiunta a un dominio di destinazione.

  1. Accedere alla macchina virtuale di destinazione (tramite Bastion o no). Cercare "Modifica Criteri di gruppo" dalla barra delle applicazioni e aprire l'Editor Criteri di gruppo locali.

  2. Selezionare Configurazione computer Windows > Impostazioni > Sicurezza Impostazioni > Opzioni di sicurezza dei criteri > locali.

  3. Trovare i criteri Sicurezza rete: Limita NTLM: Traffico NTLM in ingresso e impostalo su Nega tutti gli account di dominio. Poiché Bastion usa NTLM per l'autenticazione quando Kerberos è disabilitato, questa impostazione garantisce che l'autenticazione basata su NTLM non abbia esito positivo per i tentativi di accesso futuri nella macchina virtuale.

  4. Terminare la sessione della macchina virtuale.

  5. Connessione di nuovo alla macchina virtuale di destinazione usando Bastion. L'accesso dovrebbe avere esito positivo, a indicare che Bastion ha usato Kerberos (e non NTLM) per l'autenticazione.

    Nota

    Per evitare il failback in NTLM, assicurarsi di seguire i passaggi precedenti. L'abilitazione di Kerberos (senza seguire la procedura) non impedisce il failback a NTLM.

Guida introduttiva: Configurare Bastion con Kerberos - Modello di Resource Manager

Rivedere il modello

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

Nel modello sono state definite le risorse seguenti:

  • Distribuisce le risorse di Azure seguenti:
  • Fare in modo che il server DNS del punto di rete virtuale punti all'indirizzo IP privato di ServerVM (controller di dominio).
  • Esegue un'estensione script personalizzata in ServerVM per alzarla di livello a un controller di dominio con nome di dominio: bastionkrb.test.
  • Esegue un'estensione script personalizzata in ClientVM per renderla disponibile:
    • Limita NTLM: traffico NTLM in ingresso = Nega tutti gli account di dominio (per assicurarsi che Kerberos venga usato per l'autenticazione).
    • Aggiunta al bastionkrb.test dominio.

Distribuire il modello

Per configurare Kerberos, distribuire il modello di Resource Manager precedente eseguendo il comando powerShell seguente:

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

Esaminare le risorse distribuite

Accedere ora a ClientVM usando Bastion con l'autenticazione Kerberos:

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

Passaggi successivi

Per altre informazioni su Azure Bastion, vedere Che cos'è Azure Bastion?