Bagikan melalui


Mengonfigurasi bastion untuk autentikasi Kerberos menggunakan portal Azure

Artikel ini menunjukkan cara mengonfigurasi Azure Bastion untuk menggunakan otentikasi Kerberos. Otentikasi Kerberos dapat digunakan dengan SKU Bastion Dasar dan Standar. Untuk informasi selengkapnya tentang otentikasi Kerberos, lihat ringkasan otentikasi Kerberos. Untuk informasi selengkapnya tentang Azure Bastion, lihat Apa itu Azure Bastion?

Pertimbangan

  • Pengaturan Kerberos untuk Azure Bastion hanya dapat dikonfigurasi di portal Azure dan bukan dengan klien asli.
  • VM yang dimigrasikan dari lokal ke Azure saat ini tidak didukung untuk Kerberos. 
  • Autentikasi lintas realm saat ini tidak didukung untuk Kerberos.
  • Pengontrol Domain harus merupakan VM yang Dihosting Azure dalam VNET yang sama dengan yang digunakan bastion.
  • Perubahan pada server DNS tidak disebarluaskan ke Bastion. Penyebaran ulang Bastion diperlukan agar info DNS disebarluaskan dengan benar. Setelah membuat perubahan apa pun pada server DNS, Anda harus menghapus dan membuat ulang sumber daya Bastion.
  • Jika DC tambahan (pengendali domain) ditambahkan, Bastion hanya akan mengenali DC pertama.
  • Jika DC tambahan ditambahkan untuk domain yang berbeda, domain yang ditambahkan tidak dapat berhasil mengautentikasi dengan Kerberos.

Prasyarat

  • Akun Azure dengan langganan aktif. Jika Anda tidak memilikinya, buat secara gratis. Agar dapat terhubung ke komputer virtual melalui browser Anda menggunakan Azure Bastion, Anda harus dapat masuk ke portal Microsoft Azure.

  • Jaringan virtual Azure. Untuk langkah-langkah membuat VNet, lihat Mulai Cepat: Membuat jaringan virtual.

Memperbarui server DNS VNet

Di bagian ini, langkah-langkah berikut akan membantu Anda memperbarui jaringan virtual untuk menentukan pengaturan DNS kustom.

  1. Masuk ke portal Azure.
  2. Buka jaringan virtual tempat Anda ingin menyebarkan sumber daya Bastion.
  3. Buka halaman Server DNS untuk VNet Anda dan pilih Kustom. Tambahkan alamat IP pengendali domain yang dihosting Azure dan Simpan.

Menyebarkan Bastion

  1. Mulai mengonfigurasi penyebaran bastion Anda menggunakan langkah-langkah dalam Tutorial: Menyebarkan Bastion menggunakan pengaturan konfigurasi manual. Konfigurasikan pengaturan pada tab Dasar. Lalu, pada bagian atas halaman, klik Tingkat Lanjut untuk membuka tab Tingkat Lanjut.

  2. Pada tab Tingkat Lanjut, pilih Kerberos.

    Cuplikan layar memilih fitur bastion.

  3. Pada bagian bawah halaman, pilih Tinjau + buat, lalu Buat untuk menyebarkan Bastion ke jaringan virtual Anda.

  4. Setelah penyebaran selesai, Anda dapat menggunakannya untuk masuk ke mesin virtual Windows yang dapat dijangkau yang digabungkan dengan DNS kustom yang Anda tentukan di langkah-langkah sebelumnya.

Cara mengubah penyebaran Bastion yang ada

Di bagian ini, langkah-langkah berikut akan membantu Anda memodifikasi jaringan virtual dan penyebaran Bastion yang ada untuk otentikasi Kerberos.

  1. Perbarui pengaturan server DNS untuk jaringan virtual Anda.
  2. Buka halaman portal untuk penyebaran Bastion Anda dan pilih Konfigurasi.
  3. Pada halaman Konfigurasi, pilih Otentikasi Kerberos, lalu pilih Terapkan.
  4. Pembaruan bastion dengan pengaturan konfigurasi baru.

Untuk memverifikasi Bastion menggunakan Kerberos

Catatan

Anda harus menggunakan Nama Prinsipal Pengguna (UPN) untuk masuk menggunakan Kerberos.

Setelah mengaktifkan Kerberos di sumber daya Bastion, Anda dapat memverifikasi bahwa Bastion benar-benar menggunakan Kerberos untuk autentikasi ke mesin virtual yang digabungkan dengan domain target.

  1. Masuk ke mesin virtual target (baik melalui Bastion atau tidak). Cari "Edit Kebijakan Grup" dari taskbar dan buka Editor Kebijakan Grup Lokal.

  2. Buka Computer Configuration > Windows Settings > Security Settings > Local Policies > Security Options.

  3. Temukan kebijakan Keamanan jaringan: Batasi NTLM: Lalu Lintas NTLM Masuk dan atur ke Tolak semua akun domain. Karena Bastion menggunakan NTLM untuk autentikasi saat Kerberos dinonaktifkan, pengaturan ini memastikan bahwa autentikasi berbasis NTLM tidak berhasil untuk upaya masuk di masa mendatang pada mesin virtual.

  4. Akhiri sesi mesin virtual.

  5. Sambungkan lagi ke mesin virtual target menggunakan Bastion. Masuk seharusnya berhasil, yang menunjukkan bahwa Bastion menggunakan Kerberos (dan bukan NTLM) untuk autentikasi.

    Catatan

    Untuk mencegah failback ke NTLM, pastikan Anda mengikuti langkah-langkah sebelumnya. Mengaktifkan Kerberos (tanpa mengikuti prosedur) tidak akan mencegah failback ke NTLM.

Mulai Cepat: Menyiapkan Bastion dengan Kerberos - templat Resource Manager

Meninjau templat

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

Sumber daya berikut telah ditentukan dalam templat:

  • Menyebarkan sumber daya Azure berikut ini:
  • Minta Server DNS VNet menunjuk ke alamat IP privat ServerVM (pengendali domain).
  • Menjalankan Ekstensi Skrip Kustom di ServerVM untuk mempromosikannya ke pengendali domain dengan nama domain: bastionkrb.test.
  • Menjalankan Ekstensi Skrip Kustom pada ClientVM untuk memilikinya:
    • Batasi NTLM: Lalu lintas NTLM masuk = Tolak semua akun domain (ini untuk memastikan Kerberos digunakan untuk autentikasi).
    • Bergabung dengan bastionkrb.test domain.

Menyebarkan templat

Untuk menyiapkan Kerberos, sebarkan templat ARM sebelumnya dengan menjalankan cmd PowerShell berikut:

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

Meninjau sumber daya yang disebarkan

Sekarang, masuk ke ClientVM menggunakan Bastion dengan autentikasi Kerberos:

  • kredensial: nama pengguna = serveruser@bastionkrb.test dan kata sandi = <password-entered-during-deployment>.

Langkah berikutnya

Untuk informasi selengkapnya tentang Azure Bastion, lihat Apa itu Azure Bastion?