Tutorial: Saiba mais sobre a gestão de máquinas virtuais linux com o Azure CLI

Ao implementar recursos no Azure, tem muita flexibilidade ao decidir os tipos de recursos a implementar, onde estão localizados e como configurá-los. No entanto, essa flexibilidade pode abrir mais opções do que gostaria de permitir na sua organização. Ao considerar implementar recursos no Azure, deve estar a questionar-se:

  • Como devo proceder para satisfazer os requisitos legais para a soberania dos dados em determinados países/regiões?
  • Como controlo os custos?
  • Como garanto que alguém não altera um sistema crítico inadvertidamente?
  • Como controlo os custos dos recursos e faturo-os com precisão?

Este artigo aborda essas perguntas. Mais concretamente:

  • Atribua utilizadores a funções e atribua as funções a um âmbito, para que os utilizadores tenham permissão para fazer ações esperadas, mas não mais ações.
  • Aplique as políticas que prescrevem convenções em recursos na sua subscrição.
  • Bloqueie recursos que são críticos para o seu sistema.
  • Marque recursos para que possa acompanhá-los por valores que façam sentido para a sua organização.

Este artigo concentra-se nas tarefas que realiza para implementar a governação. Para uma discussão mais abrangente sobre os conceitos, veja Governação no Azure.

Pré-requisitos

  • Utilize o ambiente Bash em Azure Cloud Shell.

    Iniciar Cloud Shell numa nova janela

  • Se preferir, instale o CLI do Azure para executar comandos de referência de CLI.

    • Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para obter mais opções de início de sessão, veja Iniciar sessão com o CLI do Azure.

    • Quando lhe for pedido, instale as extensões do CLI do Azure durante a primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.

    • Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.

  • Este tutorial requer a versão 2.0.30 ou mais tarde do CLI Azure. Se utilizar o Azure Cloud Shell, a versão mais recente já está instalada.

Compreender o âmbito

Antes de criar quaisquer itens, vamos rever o conceito de âmbito. O Azure oferece quatro níveis de gestão: grupos de gestão, subscrição, grupo de recursos e recurso. Os Grupos de gestão estão numa versão de pré-visualização. A imagem seguinte mostra um exemplo destas camadas.

Âmbito

Pode aplicar as definições de gestão em qualquer um destes níveis de âmbito. O nível que selecionar determina o quanto a definição é aplicada. Os níveis inferiores herdam as definições de níveis mais altos. Quando aplica uma definição à subscrição, essa definição é aplicada a todos os grupos de recursos e recursos na sua subscrição. Quando aplica uma definição ao grupo de recursos, essa definição é aplicada ao grupo de recursos e todos os respetivos recursos. No entanto, outro grupo de recursos não tem essa definição.

Normalmente, faz sentido aplicar definições críticas em níveis mais altos e requisitos específicos do projeto em níveis inferiores. Por exemplo, deve certificar-se de que todos os recursos da sua organização são implementados em determinadas regiões. Para cumprir este requisito, aplique uma política à subscrição que especifica as localizações permitidas. Como os outros utilizadores na sua organização adicionam novos grupos de recursos e recursos, as localizações permitidas são impostas automaticamente.

Neste tutorial, vai aplicar todas as definições de gestão a um grupo de recursos para poder remover facilmente essas definições quando terminar.

Vamos então criar esse grupo de recursos.

az group create --name myResourceGroup --location "East US"

Atualmente, o grupo de recursos está vazio.

Controlo de acesso baseado em funções do Azure

Deve confirmar que os utilizadores na sua organização possuem o nível adequado de acesso a estes recursos. Não vai querer conceder acesso ilimitado aos utilizadores, mas também precisa de confirmar que estes podem fazer o seu trabalho. O controlo de acesso baseado em funções (Azure RBAC) permite-lhe gerir quais os utilizadores que têm permissão para completar ações específicas num âmbito.

Para criar e remover atribuições de funções, os utilizadores devem ter acesso Microsoft.Authorization/roleAssignments/*. Este acesso é concedido através das funções Proprietário ou Administrador de Acesso dos Utilizadores.

Para gerir soluções de máquina virtual, existem três funções de recursos específicos que fornecem o acesso normalmente necessário:

Em vez de atribuir funções a utilizadores individuais, muitas vezes, é mais fácil utilizar um grupo do Azure Active Directory que tem utilizadores que precisam de realizar ações semelhantes. Em seguida, atribua esse grupo à função adequada. Neste artigo, utilize um grupo existente para gerir a máquina virtual ou utilize o portal para criar um grupo do Azure Active Directory.

Depois de criar um grupo novo ou encontrar um existente, utilize o comando az role assignment create para atribuir o novo grupo do Azure Active Directory à função Contribuidor de Máquina Virtual do grupo de recursos.

adgroupId=$(az ad group show --group <your-group-name> --query objectId --output tsv)

az role assignment create --assignee-object-id $adgroupId --role "Virtual Machine Contributor" --resource-group myResourceGroup

Se receber um erro declarando que o principal <guia> não existe no diretório, o novo grupo não se propagou ao longo do Diretório Ativo Azure. Tente executar o comando novamente.

Normalmente, pode repetir o processo para o Contribuidor de Rede e o Contribuidor de Conta de Armazenamento para confirmar que os utilizadores estão atribuídos para gerir os recursos implementados. Neste artigo, pode ignorar esses passos.

Azure Policy

O Azure Policy ajuda-o a certificar-se de que todos os recursos na subscrição cumprem os padrões empresariais. A subscrição já tem várias definições de política. Para ver as definições de política disponíveis, utilize o comando az policy definition list:

az policy definition list --query "[].[displayName, policyType, name]" --output table

Poderá ver as definições de política existentes. O tipo de política é BuiltIn ou Personalizado. Examine as definições para encontrar aquelas que descrevem uma condição que pretenda atribuir. Neste artigo, pode atribuir políticas para:

  • Limitar as localizações de todos os recursos.
  • Limitar os SKUs das máquinas virtuais.
  • Auditar máquinas virtuais que não utilizam discos geridos.

No exemplo seguinte, obtém três definições de políticas baseadas no nome a apresentar. Utiliza o comando az policy assignment create para atribuir essas definições ao grupo de recursos. Para algumas políticas, forneça valores de parâmetros para especificar os valores permitidos.

# Get policy definitions for allowed locations, allowed SKUs, and auditing VMs that don't use managed disks
locationDefinition=$(az policy definition list --query "[?displayName=='Allowed locations'].name | [0]" --output tsv)
skuDefinition=$(az policy definition list --query "[?displayName=='Allowed virtual machine SKUs'].name | [0]" --output tsv)
auditDefinition=$(az policy definition list --query "[?displayName=='Audit VMs that do not use managed disks'].name | [0]" --output tsv)

# Assign policy for allowed locations
az policy assignment create --name "Set permitted locations" \
  --resource-group myResourceGroup \
  --policy $locationDefinition \
  --params '{ 
      "listOfAllowedLocations": {
        "value": [
          "eastus", 
          "eastus2"
        ]
      }
    }'

# Assign policy for allowed SKUs
az policy assignment create --name "Set permitted VM SKUs" \
  --resource-group myResourceGroup \
  --policy $skuDefinition \
  --params '{ 
      "listOfAllowedSKUs": {
        "value": [
          "Standard_DS1_v2", 
          "Standard_E2s_v2"
        ]
      }
    }'

# Assign policy for auditing unmanaged disks
az policy assignment create --name "Audit unmanaged disks" \
  --resource-group myResourceGroup \
  --policy $auditDefinition

O exemplo anterior assume que já conhece os parâmetros de uma política. Se precisar de ver os parâmetros, utilize:

az policy definition show --name $locationDefinition --query parameters

Implementar a máquina virtual

Atribuiu funções e políticas, pelo que está pronto para implementar a sua solução. O tamanho predefinido é Standard_DS1_v2, que é um dos seus SKUs permitidos. O comando cria chaves SSH caso estas não existam numa localização predefinida.

az vm create --resource-group myResourceGroup --name myVM --image UbuntuLTS --generate-ssh-keys

Após a conclusão da implementação, pode aplicar mais definições de gestão à solução.

Bloquear recursos

Os bloqueios de recursos impedem que os utilizadores na sua organização eliminem ou modifiquem acidentalmente recursos críticos. Ao contrário do controlo de acesso baseado em funções, os bloqueios de recursos aplicam uma restrição a todos os utilizadores e a todas as funções. Pode definir o nível do bloqueio para CanNotDelete ou ReadOnly.

Para criar ou eliminar bloqueios de gestão, tem de ter acesso a ações Microsoft.Authorization/locks/*. Das funções incorporadas, apenas o Proprietário e o Administrador de Acesso ao Utilizador são concedidos a essas ações.

Para bloquear a máquina virtual e o grupo de segurança de rede, utilize o comando az lock create:

# Add CanNotDelete lock to the VM
az lock create --name LockVM \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVM \
  --resource-type Microsoft.Compute/virtualMachines

# Add CanNotDelete lock to the network security group
az lock create --name LockNSG \
  --lock-type CanNotDelete \
  --resource-group myResourceGroup \
  --resource-name myVMNSG \
  --resource-type Microsoft.Network/networkSecurityGroups

Para testar os bloqueios, tente executar o seguinte comando:

az group delete --name myResourceGroup

Verá um erro a indicar que a operação de eliminação não pode ser concluída devido a um bloqueio. O grupo de recursos só poderá ser eliminado se remover especificamente os bloqueios. Este passo é apresentado em Limpar recursos.

Etiquetar recursos

Aplica etiquetas nos seus recursos Azure para organizá-las logicamente por categorias. Cada etiqueta é constituída por um nome e um valor. Por exemplo, pode aplicar o nome "Ambiente" e o valor "Produção" em todos os recursos na produção.

Para adicionar duas etiquetas a um grupo de recursos, utilize o comando az group update:

az group update -n myResourceGroup --set tags.Environment=Test tags.Dept=IT

Vamos supor que pretende adicionar uma terceira etiqueta. Execute o comando novamente com a nova etiqueta. Esta é acrescentada às etiquetas existentes.

az group update -n myResourceGroup --set tags.Project=Documentation

Os recursos não herdam etiquetas do grupo de recursos. Atualmente, o seu grupo de recursos tem três etiquetas, mas os recursos não têm etiquetas. Para aplicar todas as etiquetas de um grupo de recursos a todos os respetivos recursos e reter as etiquetas existentes nos recursos, utilize o script seguinte:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Get the tags for this resource
  jsonrtag=$(az resource show --id $resid --query tags)
  
  # Reformat from JSON to space-delimited and equals sign
  rt=$(echo $jsonrtag | tr -d '"{},' | sed 's/: /=/g')
  
  # Reapply the updated tags to this resource
  az resource tag --tags $t$rt --id $resid
done

Em alternativa, pode aplicar etiquetas do grupo de recursos nos recursos, sem manter as etiquetas existentes:

# Get the tags for the resource group
jsontag=$(az group show -n myResourceGroup --query tags)

# Reformat from JSON to space-delimited and equals sign
t=$(echo $jsontag | tr -d '"{},' | sed 's/: /=/g')

# Get the resource IDs for all resources in the resource group
r=$(az resource list -g myResourceGroup --query [].id --output tsv)

# Loop through each resource ID
for resid in $r
do
  # Apply tags from resource group to this resource
  az resource tag --tags $t --id $resid
done

Para combinar vários valores numa única etiqueta, utilize uma cadeia JSON.

az group update -n myResourceGroup --set tags.CostCenter='{"Dept":"IT","Environment":"Test"}'

Para remover todas as etiquetas num grupo de recursos, utilize:

az group update -n myResourceGroup --remove tags

Para aplicar etiquetas a uma máquina virtual, utilize o comando az resource tag. As etiquetas existentes no recurso não são mantidas.

az resource tag -n myVM \
  -g myResourceGroup \
  --tags Dept=IT Environment=Test Project=Documentation \
  --resource-type "Microsoft.Compute/virtualMachines"

Localizar recursos por etiqueta

Para localizar recursos com um nome e valor de etiqueta, utilize o comando az resource list:

az resource list --tag Environment=Test --query [].name

Pode utilizar os valores devolvidos das tarefas de gestão, como parar todas as máquinas virtuais com um valor de etiqueta.

az vm stop --ids $(az resource list --tag Environment=Test --query "[?type=='Microsoft.Compute/virtualMachines'].id" --output tsv)

Ver custos por valores de etiqueta

Depois de aplicar etiquetas a recursos, pode ver os custos dos recursos com essas etiquetas. Demora algum tempo para a análise de custos mostrar a utilização mais recente, pelo que poderá ainda não ver os custos. Quando os custos estão disponíveis, pode ver os custos dos recursos entre os grupos de recursos na sua subscrição. Os utilizadores devem ter acesso ao nível de subscrição das informações de faturação para ver os custos.

Para ver os custos por etiqueta no portal, selecione a sua subscrição e selecione Análise de Custos.

Análise de custos

Em seguida, filtre por valor da etiqueta e selecione Aplicar.

Ver custo por etiqueta

Também pode usar a visão geral da API de consumo Azure para visualizar programáticamente os custos.

Limpar os recursos

O grupo de segurança de rede bloqueado não pode ser eliminado até que o bloqueio seja removido. Para remover o bloqueio, obtenha os IDs dos bloqueios e forneça-os ao comando az lock delete:

vmlock=$(az lock show --name LockVM \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Compute/virtualMachines \
  --resource-name myVM --output tsv --query id)
nsglock=$(az lock show --name LockNSG \
  --resource-group myResourceGroup \
  --resource-type Microsoft.Network/networkSecurityGroups \
  --resource-name myVMNSG --output tsv --query id)
az lock delete --ids $vmlock $nsglock

Quando já não é necessário, pode utilizar o comando de eliminação do grupo az para remover o grupo de recursos, VM e todos os recursos relacionados. Encerre a sessão SSH da VM e, em seguida, elimine os recursos da seguinte forma:

az group delete --name myResourceGroup

Passos seguintes

Neste tutorial, criou uma imagem de VM personalizada. Aprendeu a:

  • Atribuir utilizadores a uma função
  • Aplicar políticas que impõem normas
  • Proteger recursos críticos com bloqueios
  • Etiquetar recursos para faturação e gestão

Avance para o próximo tutorial para aprender como identificar alterações e gerir atualizações de pacotes numa máquina virtual.