Configurar o acesso winRM para Máquinas Virtuais no Azure Resource Manager

Aplica-se a: ✔️ Conjuntos de dimensionamento flexíveis de VMs ✔️ do Windows

Eis os passos que tem de seguir para configurar uma VM com conectividade WinRM

  1. Criar um Key Vault
  2. Criar um certificado autoassinado
  3. Carregar o certificado autoassinado para Key Vault
  4. Obtenha o URL do certificado autoassinado no Key Vault
  5. Referenciar o URL dos certificados autoassinados ao criar uma VM

Passo 1: Criar um Key Vault

Pode utilizar o comando abaixo para criar o Key Vault

New-AzKeyVault -VaultName "<vault-name>" -ResourceGroupName "<rg-name>" -Location "<vault-location>" -EnabledForDeployment -EnabledForTemplateDeployment

Passo 2: Criar um certificado autoassinado

Pode criar um certificado autoassinado com este script do PowerShell

$certificateName = "somename"

$thumbprint = (New-SelfSignedCertificate -DnsName $certificateName -CertStoreLocation Cert:\CurrentUser\My -KeySpec KeyExchange).Thumbprint

$cert = (Get-ChildItem -Path cert:\CurrentUser\My\$thumbprint)

$password = Read-Host -Prompt "Please enter the certificate password." -AsSecureString

Export-PfxCertificate -Cert $cert -FilePath ".\$certificateName.pfx" -Password $password

Passo 3: carregar o certificado autoassinado para o Key Vault

Antes de carregar o certificado para o Key Vault criado no passo 1, tem de ser convertido num formato que o fornecedor de recursos Microsoft.Compute compreenderá. O script do PowerShell abaixo irá permitir-lhe fazê-lo

$fileName = "<Path to the .pfx file>"
$fileContentBytes = Get-Content $fileName -Encoding Byte
$fileContentEncoded = [System.Convert]::ToBase64String($fileContentBytes)
[System.Collections.HashTable]$TableForJSON = @{
    "data"     = $fileContentEncoded;
    "dataType" = "pfx";
    "password" = "<password>";
}
[System.String]$jsonObject = $TableForJSON | ConvertTo-Json
$encoding = [System.Text.Encoding]::UTF8
$jsonEncoded = [System.Convert]::ToBase64String($encoding.GetBytes($jsonObject))
$secret = ConvertTo-SecureString -String $jsonEncoded -AsPlainText –Force
Set-AzKeyVaultSecret -VaultName "<vault name>" -Name "<secret name>" -SecretValue $secret

Passo 4: obter o URL do certificado autoassinado no Key Vault

O fornecedor de recursos Microsoft.Compute precisa de um URL para o segredo dentro do Key Vault enquanto aprovisiona a VM. Isto permite ao fornecedor de recursos Microsoft.Compute transferir o segredo e criar o certificado equivalente na VM.

Nota

O URL do segredo também tem de incluir a versão. Um URL de exemplo tem o aspeto abaixo https://contosovault.vault.azure.net:443/secrets/contososecret/01h9db0df2cd4300a20ence585a6s7ve

Modelos

Pode obter a ligação para o URL no modelo com o código abaixo

"certificateUrl": "[reference(resourceId(resourceGroup().name, 'Microsoft.KeyVault/vaults/secrets', '<vault-name>', '<secret-name>'), '2015-06-01').secretUriWithVersion]"

PowerShell

Pode obter este URL com o comando do PowerShell abaixo

$secretURL = (Get-AzKeyVaultSecret -VaultName "<vault name>" -Name "<secret name>").Id

Passo 5: Referenciar o URL dos certificados autoassinados ao criar uma VM

Modelos do Azure Resource Manager

Ao criar uma VM através de modelos, o certificado é referenciado na secção segredos e na secção winRM como abaixo:

"osProfile": {
      ...
      "secrets": [
        {
          "sourceVault": {
            "id": "<resource id of the Key Vault containing the secret>"
          },
          "vaultCertificates": [
            {
              "certificateUrl": "<URL for the certificate you got in Step 4>",
              "certificateStore": "<Name of the certificate store on the VM>"
            }
          ]
        }
      ],
      "windowsConfiguration": {
        ...
        "winRM": {
          "listeners": [
            {
              "protocol": "http"
            },
            {
              "protocol": "https",
              "certificateUrl": "<URL for the certificate you got in Step 4>"
            }
          ]
        },
        ...
      }
    },

Pode encontrar um modelo de exemplo para o acima em vm-winrm-keyvault-windows

O código fonte para este modelo pode ser encontrado no GitHub

PowerShell

$vm = New-AzVMConfig -VMName "<VM name>" -VMSize "<VM Size>"
$credential = Get-Credential
$secretURL = (Get-AzKeyVaultSecret -VaultName "<vault name>" -Name "<secret name>").Id
$vm = Set-AzVMOperatingSystem -VM $vm -Windows -ComputerName "<Computer Name>" -Credential $credential -WinRMHttp -WinRMHttps -ProvisionVMAgent -WinRMCertificateUrl $secretURL
$sourceVaultId = (Get-AzKeyVault -ResourceGroupName "<Resource Group name>" -VaultName "<Vault Name>").ResourceId
$CertificateStore = "My"
$vm = Add-AzVMSecret -VM $vm -SourceVaultId $sourceVaultId -CertificateStore $CertificateStore -CertificateUrl $secretURL

Passo 6: Ligar à VM

Antes de se poder ligar à VM, terá de se certificar de que o computador está configurado para a gestão remota do WinRM. Inicie o PowerShell como administrador e execute o comando abaixo para se certificar de que está configurado.

Enable-PSRemoting -Force

Nota

Poderá ter de se certificar de que o serviço WinRM está em execução se o acima não funcionar. Pode fazê-lo com Get-Service WinRM

Assim que a configuração estiver concluída, pode ligar à VM com o comando abaixo

Enter-PSSession -ConnectionUri https://<public-ip-dns-of-the-vm>:5986 -Credential $cred -SessionOption (New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck) -Authentication Negotiate