Exercício – Gerir segredos no modelo do ARM

Concluído

No exercício anterior, executou um modelo do Azure Resource Manager (ARM) básico que aprovisiona uma máquina virtual do Linux. Nesta parte, seguirá um processo semelhante.

Desta vez, em vez de transmitir a palavra-passe como parâmetro, vai armazená-la no Azure Key Vault. Para permitir que o modelo do ARM aceda à palavra-passe, tem de criar um ficheiro de parâmetros que faça referência ao segredo do cofre de chaves na subscrição.

Implementar o Azure Key Vault

Nota

Devido às limitações com o sandbox, vai criar aqui um cofre de chaves no Azure Key Vault a partir do portal do Azure. Normalmente, utilizaria o cmdlet New-AzKeyVault para criar um cofre de chaves do Azure PowerShell.

Crie um cofre de chaves e permita o acesso durante a implementação. Para tal:

  1. Crie uma variável do PowerShell que contém o nome do cofre de chaves:

    $KVNAME="tailwind-secrets" + (Get-Random -Count 1 -Maximum 9999999)
    
  2. Execute $KVNAME para imprimir o valor:

    $KVNAME
    

    A saída é semelhante a esta (o número que vê será diferente):

    tailwind-secrets5978564
    

    Copie o valor para algum lugar conveniente para o próximo passo.

  3. Inicie sessão no portal do Azure com a mesma conta que utilizou para ativar o sandbox.

  4. No menu do portal do Azure ou a partir da Home Page, selecione Criar um recurso.

  5. Na caixa de pesquisa, introduza Key Vault.

  6. Selecione Key Vault na lista e selecione Criar para começar a configurar o cofre de chaves.

  7. No painel de criação, especifique estes valores:

    1. Grupo de recursos: nome do grupo de recursos.
    2. Nome do cofre da chave: seu valor de $KVNAME, por exemplo, tailwind-secrets5978564.
  8. Selecione Rever + criar.

  9. Selecione Criar. Esta ação deve demorar cerca de um minuto. Quando o recurso tiver sido criado, selecione Aceder ao recurso.

  10. Selecione Configuração de acesso em Configurações. Habilite a opção Azure Resource Manager para implantação de modelo e selecione Aplicar.

  11. Na sessão do PowerShell, execute o cmdlet ConvertTo-SecureString e atribua o resultado à variável secretSecureString:

    $secretSecureString = ConvertTo-SecureString 'insecurepassword123!' -AsPlainText -Force
    
  12. Execute o seguinte comando Set-AzKeyVaultSecret para criar um segredo no cofre de chaves. O segredo tem o nome vmPassword, com o valor insecurepassword123!:

    $secret = Set-AzKeyVaultSecret -VaultName $KVNAME -Name vmPassword -SecretValue $secretSecureString
    

Criar o ficheiro de parâmetros

Vai agora criar um ficheiro de parâmetros que contém o nome da VM, o nome de utilizador do administrador e uma referência à palavra-passe da VM no cofre de chaves.

Pode transmitir os parâmetros aos modelos na linha de comandos. Lembre-se de que um ficheiro de parâmetros é uma forma alternativa de transmitir parâmetros ao modelo do ARM durante a implementação. Um ficheiro de parâmetros permite que aceda aos segredos do cofre de chaves no modelo.

  1. Execute o seguinte comando Get-AzKeyVault para imprimir o ID do cofre de chaves:

    Get-AzKeyVault -VaultName $KVNAME | Select-Object -ExpandProperty ResourceId
    

    A saída é semelhante ao seguinte:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Anote a saída para utilizar no próximo passo.

  2. No Visual Studio Code, crie um ficheiro chamado azuredeploy.parameters.json no mesmo diretório que contém azuredeploy.json.

  3. Adicione estes conteúdos ao azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. Substitua o valor de id (a cadeia de carateres vazia) pelo valor que copiou no passo anterior. Em seguida, guarde o ficheiro.

Implementar uma VM do Linux

Vai agora implementar o mesmo modelo do ARM que implementou no exercício anterior. Desta vez, vai disponibilizar o ficheiro de parâmetros que faz referência à palavra-passe da VM no cofre de chaves.

  1. Execute o seguinte comando New-AzResourceGroupDeployment:

    New-AzResourceGroupDeployment `
      -TemplateFile "./azuredeploy.json" `
      -TemplateParameterFile "./azuredeploy.parameters.json" `
      -dnsLabelPrefix ("vm2-" + (Get-Random -Count 1 -Maximum 9999999))
    

    No exercício anterior, indicou cada par chave-valor diretamente na linha de comandos. Aqui, vai especificar "./azuredeploy.parameters.json" para proporcionar o ficheiro de parâmetros.

    O dnsLabelPrefix é definido como vm2-, seguido de um número aleatório. Tal é necessário para garantir que o nome DNS é diferente do nome DNS utilizado no exercício anterior.

Verificar a implementação

Verifique se a VM está aprovisionada e se pode ligar-se via SSH. Para tal:

  1. Execute o comando Invoke-Expression para se ligar à VM via SSH:

    Invoke-Expression (Get-AzResourceGroupDeployment -Name azuredeploy -ResourceGroupName <rgn>your resource group</rgn>).outputs.sshCommand.value
    

    Quando solicitado, entre yes para continuar a se conectar. Em seguida, digite a senha de administrador, insecurepassword123!.

    Importante

    Na prática, mantenha as palavras-passe seguras. Também pode utilizar a autenticação de chave pública, que normalmente é mais segura do que utilizar palavras-passe.

  2. Na ligação SSH com a VM, execute hostname para imprimir o nome do anfitrião da VM:

    hostname
    

    Você vê o nome de host interno da VM, vm1:

    vm2
    
  3. Execute exit para sair da sessão SSH.

    exit
    

Bom trabalho! Estendeu a implementação para incluir um ficheiro de parâmetros que lê informações secretas do Key Vault.

Implementar o Azure Key Vault

No Azure Key Vault, crie um cofre de chaves e adicione a palavra-passe da VM como um segredo seguro. Para tal:

  1. Crie uma variável do Bash com o nome do cofre de chaves.

    KVNAME=tailwind-secrets$RANDOM
    

    Os nomes dos cofres de chaves têm de ser exclusivos. A parte $RANDOM garante que o nome do cofre de chaves termina numa série de números aleatória.

  2. Execute o seguinte comando az keyvault create para criar o cofre de chaves:

    az keyvault create \
      --name $KVNAME \
      --enabled-for-template-deployment true
    

    O argumento --enabled-for-template-deployment permite que o modelo do Azure Resource Manager (ARM) obtenha os segredos do cofre de chaves.

  3. Execute o seguinte comando az keyvault secret set para criar um segredo no cofre de chaves. O segredo tem o nome vmPassword, com o valor insecurepassword123!:

    az keyvault secret set \
      --vault-name $KVNAME \
      --name vmPassword \
      --value 'insecurepassword123!'
    

Criar o ficheiro de parâmetros

Vai agora criar um ficheiro de parâmetros que contém o nome da VM, o nome de utilizador do administrador e uma referência à palavra-passe da VM no cofre de chaves.

Pode transmitir os parâmetros aos modelos na linha de comandos. Lembre-se de que um ficheiro de parâmetros é uma forma alternativa de transmitir parâmetros ao modelo do ARM durante a implementação. Um ficheiro de parâmetros permite que aceda aos segredos do cofre de chaves no modelo.

  1. Execute o seguinte comando az keyvault show para imprimir o ID do cofre de chaves:

    az keyvault show \
      --name $KVNAME \
      --query id \
      --output tsv
    

    A saída é semelhante ao seguinte:

    /subscriptions/7c7df858-93a0-4f38-8990-304c836a4e8d/resourceGroups/<rgn>[resource group name]</rgn>/providers/Microsoft.KeyVault/vaults/tailwind-secrets3020
    

    Anote a saída para utilizar no próximo passo.

  2. No Visual Studio Code, crie um ficheiro chamado azuredeploy.parameters.json no mesmo diretório que contém azuredeploy.json.

  3. Adicione estes conteúdos ao azuredeploy.parameters.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureuser"
        },
        "vmName": {
          "value": "vm2"
        },
        "adminPasswordOrKey": {
          "reference": {
             "keyVault": {
             "id": ""
             },
             "secretName": "vmPassword"
          }
        }
      }
    }
    
  4. Substitua o valor de id (a cadeia de carateres vazia) pelo valor que copiou no passo anterior. Em seguida, guarde o ficheiro.

Implementar uma VM do Linux

Vai agora implementar o mesmo modelo do ARM que implementou no exercício anterior. Desta vez, vai disponibilizar o ficheiro de parâmetros que faz referência à palavra-passe da VM no cofre de chaves.

Para implementar o modelo, execute o seguinte comando az deployment group create:

az deployment group create \
  --template-file azuredeploy.json \
  --parameters @azuredeploy.parameters.json dnsLabelPrefix="vm2-$RANDOM"

No exercício anterior, indicou cada par chave-valor no argumento --parameters. Aqui, vai especificar @azuredeploy.parameters.json para proporcionar o ficheiro de parâmetros.

O dnsLabelPrefix é definido como vm2-, seguido de um número aleatório. Tal é necessário para garantir que o nome DNS é diferente do nome DNS utilizado no exercício anterior.

Verificar a implementação

Tal como fez no exercício anterior, verifique se a VM está aprovisionada e se pode ligar-se via SSH. Para resumir, desta vez, vai ignorar alguns dos passos intermédios.

  1. Execute o seguinte para se ligar à VM por SSH:

    $(az deployment group show \
      --name azuredeploy \
      --query properties.outputs.sshCommand.value \
      --output tsv)
    

    Quando solicitado, entre yes para continuar a se conectar. Em seguida, digite a senha de administrador, insecurepassword123!.

  2. Na ligação SSH com a VM, execute hostname para imprimir o nome do anfitrião da VM:

    hostname
    

    Você vê o nome de host interno da VM, vm2:

    vm2
    
  3. Execute exit para sair da sessão SSH.

    exit
    

Bom trabalho! Estendeu a implementação para incluir um ficheiro de parâmetros que lê informações secretas do Key Vault.