Configurer Bastion pour l'authentification Kerberos à l'aide du portail Microsoft Azure

Cet article explique comment configurer Azure Bastion pour utiliser l’authentification Kerberos. L’authentification Kerberos peut être utilisée avec les références SKU Bastion Basic et Standard. Pour plus d’informations sur l’authentification Kerberos, consultez la vue d’ensemble de l’authentification Kerberos. Pour plus d’informations sur Azure Bastion, consultez Présentation d’Azure Bastion.

Considérations

  • Le paramètre Kerberos pour Azure Bastion peut être configuré uniquement dans le portail Microsoft Azure et non avec le client natif.
  • Les machines virtuelles migrées d’un emplacement local vers Azure ne sont actuellement pas prises en charge pour Kerberos. 
  • L’authentification interdomaines n’est actuellement pas prise en charge pour Kerberos.
  • Le contrôleur de domaine doit être une machine virtuelle hébergée Par Azure au sein du même réseau virtuel que celui que bastion est déployé.
  • Les modifications apportées au serveur DNS ne sont actuellement pas prises en charge pour Kerberos. Après avoir apporté des modifications au serveur DNS, vous devez supprimer puis recréer la ressource Bastion.
  • Si des contrôleurs de domaine supplémentaires sont ajoutés, Bastion reconnaît uniquement le premier contrôleur de domaine.
  • Si d’autres contrôleurs de domaine sont ajoutés pour différents domaines, les domaines ajoutés ne peuvent pas s’authentifier correctement avec Kerberos.

Prérequis

  • Un compte Azure avec un abonnement actif. Si vous n’en avez pas, créez-en une gratuitement. Pour pouvoir vous connecter à une machine virtuelle par le biais de votre navigateur avec Bastion, vous devez être en mesure de vous connecter au portail Azure.

  • Un réseau virtuel Azure. Pour connaître les étapes de création d’un réseau virtuel, consultez Démarrage rapide : Créer un réseau virtuel.

Mettre à jour les serveurs DNS de réseau virtuel

Dans cette section, les étapes suivantes vous aident à mettre à jour votre réseau virtuel pour spécifier des paramètres DNS personnalisés.

  1. Connectez-vous au portail Azure.
  2. Accédez au réseau virtuel pour lequel vous souhaitez déployer les ressources Bastion.
  3. Accédez à la page Serveurs DNS de votre réseau virtuel, puis sélectionnez Personnalisé. Ajoutez l’adresse IP de votre contrôleur de domaine hébergé par Azure et enregistrez.

Déployer Bastion

  1. Commencez à configurer votre déploiement de Bastion en suivant les étapes du Tutoriel : Déployer Bastion à l’aide de paramètres de configuration manuels. Configurez les paramètres sous l’onglet Général. Puis, en haut de la page, cliquez sur Avancé pour accéder à l’onglet Avancé.

  2. Sous l’onglet Avancé, sélectionnez Kerberos.

    Screenshot of select bastion features.

  3. En bas de la page, sélectionnez Examiner et créer, puis Créer pour déployer Bastion sur votre réseau virtuel.

  4. Une fois le déploiement terminé, vous pouvez l’utiliser pour vous connecter à n’importe quelle Windows machines virtuelles accessibles jointes au DNS personnalisé que vous avez spécifié dans les étapes précédentes.

Pour modifier un déploiement Bastion existant

Dans cette section, les étapes suivantes vous aident à modifier votre réseau virtuel et le déploiement Bastion existant pour l’authentification Kerberos.

  1. Mettre à jour les paramètres DNS pour votre réseau virtuel.
  2. Accédez à la page portail de votre déploiement Bastion et sélectionnez Configuration.
  3. Dans la page Configuration, sélectionnez Authentification Kerberos, puis Appliquer.
  4. Bastion met à jour avec les nouveaux paramètres de configuration.

Pour vérifier que Bastion utilise Kerberos

Notes

Vous devez utiliser le nom d’utilisateur principal (UPN) pour vous connecter à l’aide de Kerberos.

Une fois que vous avez activé Kerberos sur votre ressource Bastion, vous pouvez vérifier qu’il utilise Kerberos pour l’authentification sur la machine virtuelle jointe au domaine cible.

  1. Connectez-vous à la machine virtuelle cible (via Bastion ou non). Recherchez « Modifier stratégie de groupe » à partir de la barre des tâches et ouvrez l’éditeur de stratégie de groupe local.

  2. Sélectionnez Configuration de l’ordinateur> Paramètres Windows > Paramètres de sécurité > Stratégies locales > Options de sécurité.

  3. Recherchez la stratégie Sécurité de mise en réseau : Restreindre NTLM : trafic NTLM entrant et définissez-la pour Refuser tous les comptes de domaine. Étant donné que Bastion utilise NTLM pour l’authentification lorsque Kerberos est désactivé, ce paramètre garantit que l’authentification basée sur NTLM échoue pour les tentatives de connexion futures sur la machine virtuelle.

  4. Terminez la session de machine virtuelle.

  5. Connectez à la machine virtuelle cible à nouveau à l’aide de Bastion. La connexion doit réussir, indiquant que Bastion a utilisé Kerberos (et non NTLM) pour l’authentification.

    Remarque

    Pour éviter la restauration automatique vers NTLM, veillez à suivre les étapes précédentes. L’activation de Kerberos (sans suivre la procédure) ne va pas empêcher la restauration automatique vers NTLM.

Démarrage rapide : Configurer Bastion avec Kerberos – Modèle Resource Manager

Vérifier le modèle

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

Les ressources suivantes ont été définies dans le modèle :

  • Déploie les ressources Azure suivantes :
    • Microsoft.Network/virtualNetworks : permet de créer un réseau virtuel Azure.
    • Microsoft.Network/bastionHosts : créez une référence SKU Bastion standard avec une adresse IP publique et la fonctionnalité Kerberos activée.
    • Créez une machine virtuelle cliente Windows 10 et une machine virtuelle serveur Windows Server 2019.
  • Faites pointer le serveur DNS du réseau virtuel vers l’adresse IP privée de la machine virtuelle serveur (contrôleur de domaine).
  • Exécute une extension de script personnalisé sur ServerVM pour la promouvoir au niveau d’un contrôleur de domaine avec le nom de domaine : bastionkrb.test.
  • Exécute une extension de script personnalisé sur la machine virtuelle cliente pour l’avoir :
    • Restreindre NTLM : trafic NTLM entrant = Refuser tous les comptes de domaine (afin de garantir que Kerberos est utilisé pour l’authentification).
    • Joignez le domaine bastionkrb.test.

Déployer le modèle

Pour configurer Kerberos, déployez le modèle ARM précédent en exécutant la commande PowerShell suivante :

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

Vérifier les ressources déployées

Maintenant, connectez-vous à la machine virtuelle cliente en utilisant Bastion avec l’authentification Kerberos :

  • Informations d’identification : username = serveruser@bastionkrb.test et password = <password-entered-during-deployment>.

Étapes suivantes

Pour plus d’informations sur Azure Bastion, consultez Présentation d’Azure Bastion.