Converter logs de auditoria em uma lista de permitidos

Com o MSP (Protocolo de Segurança de Metadados), você pode definir uma lista de permissões de RBAC (controle de acesso baseado em função) personalizada para ajudar a proteger pontos de extremidade de serviço de metadados. O conteúdo da lista de permissões vem dos logs de auditoria. Um novo tipo de recurso na Galeria de Computação do Azure InVMAccessControlProfile habilita a lista de permissão.

Para saber mais sobre o RBAC e o InVMAccessControlProfile tipo de recurso, consulte Configuração avançada para MSP.

Estrutura de uma lista de permissões

Uma lista de permissões consiste em:

  • Identidades: Processos na máquina.
  • Privilégios: Endereços finais que as identidades acessam.
  • Funções: um agrupamento de privilégios.
  • Atribuições de função: Funções e a lista de identidades que receberam acesso para essas funções.

Coletar logs de auditoria

Se você habilitar o MSP no modo audit ou enforce, poderá coletar dados de log de um cliente de máquina virtual por meio do Azure Monitor.

Consultar logs de auditoria

Depois que os logs de auditoria forem coletados conforme explicado na seção anterior, você poderá verificar os logs:

Consulta do Windows Kusto: vá para o Log Analytics e execute a consulta

/// Windows VMs
Event
| where TimeGenerated >ago(1d)
| where EventLog == "Windows Azure" and Source == "GuestProxyAgent"
| where _ResourceId startswith "/subscriptions/<your subscription id>/resourcegroups/<your recrouce group>" 
| where RenderedDescription  has  "processFullPath" and RenderedDescription  has "runAsElevated" and RenderedDescription has "processCmdLine"
| extend json = parse_json(RenderedDescription)
| extend method = json.method, url = json.url, processFullPath = json.processFullPath, username = json.userName, runAsElevated = json.runAsElevated 
| extend userGroups = json.userGroups, ip = json.ip, port = json.port, processCmdLine = json.processCmdLine 
| project TimeGenerated, _ResourceId, url, ip, port, processFullPath, method, username, runAsElevated, processCmdLine

Consulta Kusto do Linux: Vá para o Log Analytics e execute a consulta

/// Linux VMs
Syslog
| where TimeGenerated >ago(1d)
| where  ProcessName == "azure-proxy-agent"
| where _ResourceId startswith "/subscriptions/<your subscription id>/resourcegroups/<your recrouce group>" 
| where SyslogMessage  has  "processFullPath" and SyslogMessage  has "runAsElevated" and SyslogMessage has "processCmdLine"
| extend message = substring(SyslogMessage, indexof(SyslogMessage, "{"))
| extend json = parse_json(message)
| extend method = json.method, url = json.url, processFullPath = json.processFullPath, username = json.userName, runAsElevated = json.runAsElevated 
| extend userGroups = json.userGroups, ip = json.ip, port = json.port, processCmdLine = json.processCmdLine 
| project TimeGenerated, _ResourceId, url, ip, port, processFullPath, method, username, runAsElevated, processCmdLine

Se você possui a VM do Azure, pode obter os logs de arquivos dentro da VM do Azure seguindo estas etapas

  1. Localize o arquivo de configuração json do Agente Proxy:

    • Windows VM: GuestProxyAgent.json na pasta intitulada GuestProxyAgent windows service
    • VM do Linux: etc/azure/proxy-agent.json arquivo
  2. Ative o registro de arquivos alterando a configuração logFolder no arquivo config.json. Defina-o como

    • %SYSTEMDRIVE%\\WindowsAzure\\ProxyAgent\\Logs para VMs do Windows
    • /var/log/azure-proxy-agent para VMs do Linux.
  3. Reiniciar o serviço

  • GuestProxyAgent para VMs do Windows
  • azure-proxy-agent para VMs4 Linux
  1. Aguarde ProxyAgent.Connection.log ser preenchido enquanto os serviços do cliente estão em execução.
  2. Obter logs de arquivos de conexão do ProxyAgent das VMs do Azure
    • Windows: C:\WindowsAzure\ProxyAgent\Logs\ProxyAgent.Connection.log

    • Linux: /var/log/azure-proxy-agent/ProxyAgent.Connection.log

Converter logs em regras

Para criar uma lista de permissões, você pode usar um método automatizado ou um método manual.

Gerar uma lista de permissões automaticamente

Você pode usar uma ferramenta de gerador de lista de permissões para gerar as regras de controle de acesso. A ferramenta ajuda a analisar os logs de auditoria e fornece uma interface do usuário para gerar as regras.

  1. Baixe e execute a ferramenta de gerador de lista de permissões. Na última página de lançamento, em Ativos, selecione allowListTool.exe.

    A ferramenta analisa os ProxyAgentConnection logs e exibe os privilégios e identidades atuais na VM.

  2. Criar funções e atribuições de função:

    • Para criar uma função, selecione um agrupamento de privilégios e dê à função um nome descritivo.
    • Para criar uma atribuição de função, selecione uma função e um agrupamento de identidades. Essas identidades podem acessar os privilégios agrupados nessa função. Dê à atribuição de função um nome descritivo.

Criar manualmente uma lista de permissões

Depois de habilitar uma VM com MSP no modo Audit ou no modo Enforce, o agente proxy capturará todas as solicitações que estão sendo feitas nos endpoints do host.

Nos logs de conexão, você pode analisar os aplicativos que estão fazendo as solicitações para o Serviço de Metadados de Instância do Azure ou para os pontos de extremidade do WireServer.

Captura de tela dos logs de conexão.

O exemplo a seguir mostra o formato do JSON capturado.

Captura de tela dos logs de auditoria com JSONs capturados.

No arquivo de log, você pode identificar os pontos de extremidade que deseja proteger. Esses pontos de extremidade aparecem em privileges na instância final InVMAccessControlProfile. Você também pode identificar as identidades (identities) que devem ter acesso.

Um esquema de regras simples pode ser semelhante ao exemplo a seguir.

Captura de tela de um esquema de regras simples.

Criar uma instância InVMAccessControlProfile usando um modelo do ARM

  1. Crie uma nova galeria privada na Galeria de Computação do Azure.

  2. Crie uma InVMAccessControlProfile definição com parâmetros para:

    • Nome da galeria para armazenar (da etapa 1)
    • Nome do perfil
    • Tipo do SO
    • Tipo de ponto de extremidade do host (WireServer ou Serviço de Metadados de Instância)
  3. Crie uma versão específica.

Exemplo de InVMAccessControlProfile

Aqui está uma instância de exemplo InVMAccessControlProfile :

"properties": {
    "mode": "Enforce",
    "defaultAccess": "Allow",
    "rules": {
      "privileges": [
        {
          "name": "GoalState",
          "path": "/machine",
          "queryParameters": {
            "comp": "goalstate"
          }
        }
      ],
      "roles": [
        {
          "name": "Provisioning",
          "privileges": [
            "GoalState"
          ]
        },
        {
          "name": "ManageGuestExtensions",
          "privileges": [
            "GoalState"
          ]
        },
        {
          "name": "MonitoringAndSecret",
          "privileges": [
            "GoalState"
          ]
        }
      ],
      "identities": [
        {
          "name": "WinPA",
          "userName": "SYSTEM",
          "exePath": "C:\\Windows\\System32\\cscript.exe"
        },
        {
          "name": "GuestAgent",
          "userName": "SYSTEM",
          "processName": "WindowsAzureGuestAgent.exe"
        },
        {
          "name": "WaAppAgent",
          "userName": "SYSTEM",
          "processName": "WaAppAgent.exe"
        },
        {
          "name": "CollectGuestLogs",
          "userName": "SYSTEM",
          "processName": "CollectGuestLogs.exe"
        },
        {
          "name": "AzureProfileExtension",
          "userName": "SYSTEM",
          "processName": "AzureProfileExtension.exe"
        },
        {
          "name": "AzurePerfCollectorExtension",
          "userName": "SYSTEM",
          "processName": "AzurePerfCollectorExtension.exe"
        },
        {
          "name": "WaSecAgentProv",
          "userName": "SYSTEM",
          "processName": "WaSecAgentProv.exe"
        }
      ],
      "roleAssignments": [
        {
          "role": "Provisioning",
          "identities": [
            "WinPA"
          ]
        },
        {
          "role": "ManageGuestExtensions",
          "identities": [
            "GuestAgent",
            "WaAppAgent",
            "CollectGuestLogs"
          ]
        },
        {
          "role": "MonitoringAndSecret",
          "identities": [
            "AzureProfileExtension",
            "AzurePerfCollectorExtension",
            "WaSecAgentProv"
          ]
        }
      ]
    },

Como usar o PowerShell

Se você estiver usando o PowerShell para gerar um InVMAccessControlProfile, verifique se você tem a versão mínima de 10.1.0 do PowerShell

Siga o guia passo a passo abaixo para gerar um InVMAccessControlProfile:

  1. Faça logon em sua conta do Azure
Connect-AzAccount 
  1. Crie o Grupo de Recursos em que a galeria privada é criada. Você pode ignorar esta etapa se já tiver um Grupo de Recursos criado.
$resourceGroup = "MyResourceGroup4" 
$location = "EastUS2EUAP" 
New-AzResourceGroup -Name $resourceGroup -Location $location 
  1. Crie uma galeria privada. Esta galeria é usada como um contêiner para o InVMAccessControlProfile artefato
$galleryName = "MyGallery4" 
New-AzGallery -ResourceGroupName $resourceGroup -GalleryName $galleryName -Location $location -Description "My custom image gallery" 
  1. Crie o InVMAccessControlProfile artefato na galeria privada criada na etapa anterior. Clique aqui para saber mais sobre os vários parâmetros para este artefato.
$InVMAccessControlProfileName= "testInVMAccessControlProfileP"  

New-AzGalleryInVMAccessControlProfile -ResourceGroupName  $resourceGroup  -GalleryName $galleryName   -GalleryInVMAccessControlProfileName $InVMAccessControlProfileName -Location $location -OsType "Windows" -ApplicableHostEndPoint "WireServer" -Description "this test1" 
  1. Obter Galeria InVMAccessControlProfile
$inVMAccessCP=Get-AzGalleryInVMAccessControlProfile -ResourceGroupName  $resourceGroup  -GalleryName $galleryName   -GalleryInVMAccessControlProfileName $InVMAccessControlProfileName 

![Captura de tela da saída do comando Get para InVMAccessControlProfile.](../Imagens/)

  1. Atualizar Galeria InVMAccessControlProfile Depois que o InVMAccessControlProfile for criado, o único atributo editável será a descrição. Para quaisquer outras alterações, crie um novo artefato.

Para atualizar a descrição:

Update-AzGalleryInVMAccessControlProfile -ResourceGroupName  $resourceGroup  -GalleryName $galleryName   -GalleryInVMAccessControlProfileName $InVMAccessControlProfileName -Location $location -Description "this test2"

Captura de tela da descrição de atualização do InVMAccessControlProfile.

  7. Criar InVMAccessControlProfileVersion

Para criar um InVMAccessControlProfileVersion, é necessária uma carga. Como esses conteúdo podem ser grandes, especialmente devido à propriedade de regras, não é prático usar um único comando do PowerShell para criar todo o recurso de uma só vez. A propriedade rules, em qualquer conteúdo de versão, é composta por quatro listas: privilégios, funções, identidades e roleAssignments. Essas listas podem tornar o conteúdo grande e complexo. Introduzimos o objeto PowerShell GalleryInVMAccessControlProfileVersionConfig para simplificar esse processo. Você pode saber mais sobre isso aqui.

Esse objeto permite que você compile incrementalmente a configuração usando vários comandos para adicionar ou remover propriedades de regra. Quando o objeto de configuração estiver pronto, você poderá usá-lo para criar um InVMAccessControlProfileVersion, descrito nas próximas seções.

Como alternativa, se você já tiver a propriedade de regras como uma cadeia de caracteres JSON e preferir não usar o objeto de configuração, poderá ignorar essas etapas e criar o InVMAccessControlProfileVersion usando uma implantação de modelo do ARM, que também é abordada posteriormente na seção.

Conteúdo para referência:

{
  "name": "1.0.0",
  "location": "East US 2 EUAP",
  "properties": {
    "mode": "Audit", 
    "defaultAccess": "Deny", 
    "rules": { 
      "privileges": [
        {
          "name": "GoalState",
          "path": "/machine",
          "queryParameters": {
            "comp": "goalstate"
          }
        }
      ],
      "roles": [
        {
          "name": "Provisioning",
          "privileges": [
            "GoalState"
          ]
        }
      ],
      "identities": [
        {
          "name": "WinPA",
          "userName": "SYSTEM",
          "groupName": "Administrators",
          "exePath": "C:\\Windows\\System32\\cscript.exe",
          "processName": "cscript"
        }
      ],
      "roleAssignments": [
        {
          "role": "Provisioning",
          "identities": [
            "WinPA"
          ]
        }
      ]
    },
    "targetLocations": [
      {
        "name": "East US 2 EUAP"
      }
    ],
    "excludeFromLatest": false 
  }
}
  1. Criar InVMAccessControlProfileVersion Configuração
$inVMAccessControlProfileVersionName= "1.0.0"
$targetRegions= @("EastUS2EUAP", "CentralUSEUAP")
$inVMAccessConrolProfileVersion = New-AzGalleryInVMAccessControlProfileVersionConfig `
 -Name $inVMAccessControlProfileVersionName  `
-Location $location  `
-Mode "Audit"  `
-DefaultAccess "Deny" -TargetLocation $targetRegions  -ExcludeFromLatest

Captura de tela da configuração de versão de perfil.

Execute este comando para adicionar cada privilégio:

Add-AzGalleryInVMAccessControlProfileVersionRulesPrivilege `
  -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
  -PrivilegeName "GoalState" `
  -Path "/machine" `
  -QueryParameter @{ comp = "goalstate" }

Para remover um privilégio:

Remove-AzGalleryInVMAccessControlProfileVersionRulesPrivilege `
 -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
 -PrivilegeName "GoalState2"

Execute este comando para adicionar cada função:

Add-AzGalleryInVMAccessControlProfileVersionRulesRole `
 -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
 -RoleName "Provisioning" `
 -Privilege @("GoalState")

Execute este comando para remover funções:

Remove-AzGalleryInVMAccessControlProfileVersionRulesRole `
 -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
 -RoleName "Provisioning2" 

Adicionar RulesIdentity:

Add-AzGalleryInVMAccessControlProfileVersionRulesIdentity `
  -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
  -IdentityName "WinPA" `
  -UserName "SYSTEM" `
  -GroupName "Administrators" `
  -ExePath "C:\Windows\System32\cscript.exe" `
  -ProcessName "cscript"

Remover RulesIdentity:

Remove-AzGalleryInVMAccessControlProfileVersionRulesIdentity `
  -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
  -IdentityName "WinPA2" 

Execute este comando para adicionar cada Atribuição de Função:

Add-AzGalleryInVMAccessControlProfileVersionRulesRoleAssignment `
  -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
  -Role "Provisioning" `
  -Identity @("WinPA")

Remover atribuição de função:

Remove-AzGalleryInVMAccessControlProfileVersionRulesRoleAssignment `
  -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion `
  -Role "Provisioning2" 
  1. Criar Galeria InVMAccessControlProfileVersion
New-AzGalleryInVMAccessControlProfileVersion -ResourceGroupName $resourceGroup -GalleryName $galleryName -GalleryInVMAccessControlProfileName   $InVMAccessControlProfileName   -GalleryInVmAccessControlProfileVersion $inVMAccessConrolProfileVersion 

Captura de tela da criação do InVMAccessControlProfileVersion.

  1. Obter InVMAccessControlProfileVersion
$ver = Get-AzGalleryInVMAccessControlProfileVersion -ResourceGroupName $resourceGroup -GalleryName $galleryName -GalleryInVMAccessControlProfileName   $InVMAccessControlProfileName `
 -GalleryInVMAccessControlProfileVersionName  $inVMAccessControlProfileVersionName
 $ver | ConvertTo-Json -Depth 10
  1. Atualização InVMAccessControlProfileVersion

É recomendável criar um novo InVMAccessControlProfileVersion , pois a maioria dos parâmetros não pode ser atualizada. Veja um exemplo:

$targetRegions= @("EastUS2EUAP")
 
$ver = Get-AzGalleryInVMAccessControlProfileVersion -ResourceGroupName $resourceGroup -GalleryName $galleryName -GalleryInVMAccessControlProfileName   $InVMAccessControlProfileName `
 -GalleryInVMAccessControlProfileVersionName  $inVMAccessControlProfileVersionName
 
 
Update-AzGalleryInVMAccessControlProfileVersion `
  -GalleryInVmAccessControlProfileVersion $ver `
-TargetLocation $targetRegions -ExcludeFromLatest $true

Captura de tela da atualização InVMAccessControlProfileVersion.

  1. Excluir InVMAccessControlProfileVersion
Remove-AzGalleryInVMAccessControlProfileVersion -ResourceGroupName $resourceGroup -GalleryName $galleryName -GalleryInVMAccessControlProfileName   $InVMAccessControlProfileName `
 -GalleryInVMAccessControlProfileVersionName  $inVMAccessControlProfileVersionName

Captura de tela do exemplo de exclusão de InVMAccessControlProfileVersion.

  1. Listar toda a galeria InVMAccessControlProfile
Get-AzGalleryInVMAccessControlProfile -ResourceGroupName "myResourceGroup" -GalleryName "myGallery"

Captura de tela de Listar todos os InVMAccessControlProfiles.

Usando a CLI

Siga o guia passo a passo abaixo para gerar um InVMAccessControlProfile:

  1. Faça logon em sua conta do Azure
az login
  1. Criar um grupo de recursos no local desejado
az group create  --resource-group ResourceGroupForINVM  --location eastus
  1. Criar uma galeria que abrigará o InVMAccessControlProfile recurso
 az sig create --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --location eastus 
  1. Criar um InVMAccessControlProfile na galeria criada na etapa anterior Para obter mais detalhes sobre os comandos: az sig in-vm-access-control-profile | Microsoft Learn
 az sig in-vm-access-control-profile create --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --name myInVMAccessControlProfileName --location eastus --os-type Linux  --applicable-host-endpoint WireServer 

Execute este comando para ver detalhes adicionais sobre os comandos e as propriedades

az sig in-vm-access-control-profile create --help 

Captura de tela de obter detalhes sobre as propriedades do InVMAccessControlProfile

  1. Atualizar o InVMAccessControlProfile É possível atualizar apenas a descrição do InVMAccessControlProfile. Se forem necessárias alterações adicionais, exclua a atual InVMAccessControlProfile e crie uma nova
az sig in-vm-access-control-profile update --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --name myInVMAccessControlProfileName  --description test 

Captura de tela da atualização da descrição de InVMAccessControlProfile

  1. Obter a operação de InVMAccessControlProfile
az sig in-vm-access-control-profile show --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --name myInVMAccessControlProfileName 

Captura de tela da operação get para InVMAccessControlProfile

  1. Listar todos os InVMAccessControlProfile artefatos

Este comando mostra a lista de todos InVMAccessControlProfile sob uma galeria específica

az sig in-vm-access-control-profile show --resource-group ResourceGroupForINVM --gallery-name MyGallery67 

Captura de tela do comando de lista para mostrar todos os artefatos InVMAccessControlProfile em uma galeria específica

  1. Criar InVMAccessControlProfileVersion

Você deve fornecer um conteúdo para criar um InVMAccessControlProfileVersion. Este conteúdo pode ser grande, sobretudo por causa da propriedade rules, que pode conter configurações extensas. Em vez de passar partes individuais da propriedade de regras diretamente, introduzimos um parâmetro de regras que aceita um arquivo JSON como entrada. Essa abordagem simplifica o processo e mantém o comando limpo e gerenciável. Este é um arquivo de exemplo "rules.json".

 1. { 
 2.   "privileges": [
 3. 	{
 4. 	  "name": "GoalState",
 5. 	  "path": "/machine",
 6. 	  "queryParameters": {
 7. 		"comp": "goalstate"
 8. 	  }
 9. 	}
10.   ],
11.   "roles": [
12. 	{
13. 	  "name": "Provisioning",
14. 	  "privileges": [
15. 		"GoalState"
16. 	  ]
17. 	}
18.   ],
19.   "identities": [
20. 	{
21. 	  "name": "WinPA",
22. 	  "userName": "SYSTEM",
23. 	  "groupName": "Administrators",
24. 	  "exePath": "C:\\Windows\\System32\\cscript.exe",
25. 	  "processName": "cscript"
26. 	}
27.   ],
28.   "roleAssignments": [
29. 	{
30. 	  "role": "Provisioning",
31. 	  "identities": [
32. 		"WinPA"
33. 	  ]
34. 	}
35.   ]
36. } 

Veja detalhes adicionais do comando aqui: az sig in-vm-access-control-profile-version | Microsoft Learn

Depois de criar sua versão do arquivo rules.json, use o comando a seguir para criar o InVMAccessControlProfileVersion

 az sig in-vm-access-control-profile-version create \
   --resource-group ResourceGroupForINVM  \
   --gallery-name MyGallery67  \
   --profile-name myInVMAccessControlProfileName \
   --version-name 1.0.0 \
   --mode Audit \
   --default-access Deny  \
   --target-regions EastUS2EUAP  \
   --exclude-from-latest true \
   --rules @rules.json
  1. Obter InVMAccessControlProfileVersion
az sig in-vm-access-control-profile-version show --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --profile-name myInVMAccessControlProfileName --profile-version 1.0.0

Captura de tela do comando Get para a versão do perfil

  1. Listar todos os InVMAccessControlProfileVersion artefatos
az sig in-vm-access-control-profile-version list --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --profile-name myInVMAccessControlProfileName
  1. Excluir InVMAccessControlProfileVersion

Antes de excluir qualquer InVMAccessControlProfileVersion, verifique se ele não está sendo usado por nenhum InVMAccessControlProfile em nenhuma Máquina Virtual nem em Conjuntos de Dimensionamento de Máquinas Virtuais.

az sig in-vm-access-control-profile-version delete --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --profile-name myInVMAccessControlProfileName --profile-version 1.0.0
  1. Excluir InVMAccessControlProfile
az sig in-vm-access-control-profile delete --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --name myInVMAccessControlProfileName