Convertire i log di controllo in una lista di autorizzazione

Con il provider di servizi gestiti (MSP), è possibile definire un elenco di indirizzi consentiti personalizzato per il controllo degli accessi in base al ruolo per proteggere gli endpoint del servizio metadati. Il contenuto dell'elenco di elementi consentiti proviene dai log di controllo. Un nuovo tipo di risorsa in Azure Compute Gallery, InVMAccessControlProfile, abilita l'elenco consentito.

Per altre informazioni sul controllo degli accessi in base al ruolo e sul tipo di risorsa InVMAccessControlProfile, vedere Configurazione avanzata per provider di servizi gestiti.

Struttura di un elenco di elementi consentiti

Un elenco di elementi consentiti è costituito da:

  • Identità: Processi sulla macchina.
  • Privilegi: Gli endpoint a cui accedono le identità.
  • Ruoli: raggruppamento di privilegi.
  • Assegnazioni di ruolo: i ruoli e l'elenco delle identità a cui è stato concesso l'accesso per quei ruoli.

Raccogliere log di controllo

Se abiliti MSP in modalità audit o enforce, puoi raccogliere i dati di registro dal client della macchina virtuale tramite Azure Monitor.

Consultare i log di audit

Dopo aver raccolto i log di controllo come illustrato nella sezione precedente, è possibile verificare i log:

Query Windows Kusto: vai a Log Analytics ed esegui la query

/// 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

Query Kusto di Linux: Passare a Log Analytics ed eseguire la query

/// 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 si è proprietari della macchina virtuale di Azure, è possibile ottenere i log dei file all'interno della macchina virtuale di Azure seguendo questa procedura

  1. Trovare il file di configurazione json dell'agente proxy:

    • Macchina virtuale Windows: GuestProxyAgent.json nella cartella sotto il nome GuestProxyAgent windows service
    • VM Linux: etc/azure/proxy-agent.json file
  2. Attivare il log del file aggiornando l'impostazione logFolder nel file di configurazione json. Impostarlo su

    • %SYSTEMDRIVE%\\WindowsAzure\\ProxyAgent\\Logs per le macchine virtuali Windows
    • /var/log/azure-proxy-agent per le macchine virtuali Linux.
  3. Riavviare il servizio

  • GuestProxyAgent per le macchine virtuali Windows
  • azure-proxy-agent per le macchine virtuali Linux4
  1. Attendere che ProxyAgent.Connection.log si carichi mentre i servizi clienti sono in esecuzione.
  2. Eseguire il pull dei log dei file di connessione ProxyAgent dalle macchine virtuali di Azure
    • Windows: C:\WindowsAzure\ProxyAgent\Logs\ProxyAgent.Connection.log

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

Convertire i log in regole

Per creare un elenco di elementi consentiti, è possibile usare un metodo automatizzato o un metodo manuale.

Generare automaticamente un elenco di elementi consentiti

È possibile usare uno strumento generatore allowlist per generare le regole di controllo di accesso. Lo strumento consente di analizzare i log di controllo e fornisce un'interfaccia utente per generare le regole.

  1. Scaricare ed eseguire lo strumento generatore allowlist. Nella pagina della versione più recente, in Asset selezionare allowListTool.exe.

    Lo strumento analizza i ProxyAgentConnection log e visualizza i privilegi e le identità correnti nella macchina virtuale.

  2. Creare ruoli e assegnazioni di ruolo:

    • Per creare un ruolo, selezionare un raggruppamento di privilegi e assegnare al ruolo un nome descrittivo.
    • Per creare un'assegnazione di ruolo, selezionare un ruolo e un raggruppamento di identità. Queste identità possono accedere ai privilegi raggruppati in tale ruolo. Assegnare un nome descrittivo all'assegnazione di ruolo.

Creare manualmente un elenco di elementi consentiti

Dopo aver abilitato una macchina virtuale con MSP in Audit modalità o Enforce , l'agente proxy acquisisce tutte le richieste inviate agli endpoint host.

Nei log di connessione è possibile analizzare le applicazioni che effettuano le richieste agli endpoint Del servizio metadati dell'istanza di Azure o WireServer.

Screenshot dei log di connessione.

L'esempio seguente mostra il formato del codice JSON acquisito.

Screenshot dei log di controllo con JSON catturato.

Nel file di log è possibile identificare gli endpoint da proteggere. Questi endpoint vengono visualizzati in privileges nell'istanza InVMAccessControlProfile finale. È anche possibile identificare le identità (identities) che devono avere accesso.

Uno schema di regole semplice potrebbe essere simile all'esempio seguente.

Screenshot di uno schema di regole semplice.

Creare un'istanza di InVMAccessControlProfile utilizzando un modello di ARM

  1. Creare una nuova raccolta privata in Azure Compute Gallery.

  2. Creare una InVMAccessControlProfile definizione con i parametri per:

    • Nome della galleria in cui archiviare (dal passaggio 1)
    • Nome profilo
    • Tipo di sistema operativo
    • Tipo di endpoint host (WireServer o Servizio metadati dell'istanza)
  3. Creare una versione specifica.

Esempio inVMAccessControlProfile

Ecco un'istanza di esempio 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"
          ]
        }
      ]
    },

Utilizzo di PowerShell

Se si usa PowerShell per generare un InVMAccessControlProfile, assicurarsi di avere la versione minima 10.1.0 di PowerShell

Seguire la guida seguente passo dopo passo per generare un InVMAccessControlProfile.

  1. Accedi al tuo account Azure
Connect-AzAccount 
  1. Creare il gruppo di risorse dove verrà creata la galleria privata. È possibile ignorare questo passaggio se è già stato creato un gruppo di risorse.
$resourceGroup = "MyResourceGroup4" 
$location = "EastUS2EUAP" 
New-AzResourceGroup -Name $resourceGroup -Location $location 
  1. Creare una raccolta privata. Questa raccolta viene usata come contenitore per l'artefatto InVMAccessControlProfile
$galleryName = "MyGallery4" 
New-AzGallery -ResourceGroupName $resourceGroup -GalleryName $galleryName -Location $location -Description "My custom image gallery" 
  1. Creare l'artefatto InVMAccessControlProfile nella raccolta privata creata nel passaggio precedente. Fare clic qui per altre informazioni sui vari parametri per questo artefatto.
$InVMAccessControlProfileName= "testInVMAccessControlProfileP"  

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

![Screenshot dell'output per il comando Get per InVMAccessControlProfile.](../images/

  1. Aggiorna Raccolta InVMAccessControlProfile Una volta che il InVMAccessControlProfile è stato creato, l'unico attributo modificabile è la descrizione. Per qualsiasi altra modifica, creare un nuovo artefatto.

Per aggiornare la descrizione:

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

Screenshot della descrizione dell'aggiornamento InVMAccessControlProfile.

  7. Creare InVMAccessControlProfileVersion

Per creare un oggetto InVMAccessControlProfileVersion, è necessario un payload. Poiché questi payload possono essere di grandi dimensioni, soprattutto a causa della proprietà delle regole, non è pratico usare un singolo comando di PowerShell per creare l'intera risorsa in un'unica operazione. La proprietà regole in qualsiasi payload della versione è costituita da quattro matrici: privilegi, ruoli, identità e roleAssignments. Queste matrici possono rendere il payload molto grande e complesso. Per semplificare questo processo, abbiamo introdotto l'oggetto PowerShell GalleryInVMAccessControlProfileVersionConfig. Altre informazioni sono disponibili qui.

Questo oggetto consente di compilare in modo incrementale la configurazione usando vari comandi per aggiungere o rimuovere proprietà delle regole. Quando l'oggetto di configurazione è pronto, è possibile utilizzarlo per creare un InVMAccessControlProfileVersion, descritto nelle sezioni successive.

In alternativa, se si dispone già della proprietà rules come stringa JSON e si preferisce non usare l'oggetto di configurazione, è possibile ignorare questi passaggi e creare la "InVMAccessControlProfileVersion" utilizzando una distribuzione tramite modello ARM, di cui si parlerà anche più avanti nella sezione.

Payload di riferimento:

{
  "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. Creare la InVMAccessControlProfileVersion configurazione
$inVMAccessControlProfileVersionName= "1.0.0"
$targetRegions= @("EastUS2EUAP", "CentralUSEUAP")
$inVMAccessConrolProfileVersion = New-AzGalleryInVMAccessControlProfileVersionConfig `
 -Name $inVMAccessControlProfileVersionName  `
-Location $location  `
-Mode "Audit"  `
-DefaultAccess "Deny" -TargetLocation $targetRegions  -ExcludeFromLatest

Screenshot della configurazione della versione del profilo di creazione.

Eseguire questo comando per aggiungere ogni privilegio:

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

Per rimuovere un privilegio:

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

Eseguire questo comando per aggiungere ogni ruolo:

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

Eseguire questo comando per rimuovere i ruoli:

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

Aggiungi RulesIdentity:

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

Rimuovi RulesIdentity:

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

Eseguire questo comando per aggiungere ogni assegnazione di ruolo:

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

Rimuovi assegnazione di ruolo:

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

Screenshot della creazione di InVMAccessControlProfileVersion.

  1. Ottieni InVMAccessControlProfileVersion
$ver = Get-AzGalleryInVMAccessControlProfileVersion -ResourceGroupName $resourceGroup -GalleryName $galleryName -GalleryInVMAccessControlProfileName   $InVMAccessControlProfileName `
 -GalleryInVMAccessControlProfileVersionName  $inVMAccessControlProfileVersionName
 $ver | ConvertTo-Json -Depth 10
  1. Aggiornare InVMAccessControlProfileVersion

È consigliabile creare un nuovo InVMAccessControlProfileVersion perché la maggior parte dei parametri non può essere aggiornata. Ecco un esempio:

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

Screenshot dell'aggiornamento InVMAccessControlProfileVersion.

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

Screenshot dell'esempio di eliminazione di InVMAccessControlProfileVersion.

  1. Elencare tutte le gallerie InVMAccessControlProfile
Get-AzGalleryInVMAccessControlProfile -ResourceGroupName "myResourceGroup" -GalleryName "myGallery"

Screenshot dell'elenco di tutti i profili InVMAccessControlProfiles.

Uso della CLI

Seguire la guida seguente passo dopo passo per generare un InVMAccessControlProfile.

  1. Accedi al tuo account Azure
az login
  1. Creare un gruppo di risorse nella località desiderata
az group create  --resource-group ResourceGroupForINVM  --location eastus
  1. Creare una galleria che ospiterà la risorsa InVMAccessControlProfile
 az sig create --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --location eastus 
  1. Creare un InVMAccessControlProfile nella raccolta creata nel passaggio precedente Per altri dettagli sui comandi: 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 

Eseguire questo comando per visualizzare dettagli aggiuntivi sui comandi e sulle proprietà

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

Screenshot per ottenere i dettagli sulle proprietà InVMAccessControlProfile

  1. Aggiornare l'oggetto InVMAccessControlProfile È possibile aggiornare solo la descrizione dell'oggetto InVMAccessControlProfile. Se sono necessarie altre modifiche, eliminare l'oggetto corrente InVMAccessControlProfile e crearne uno nuovo
az sig in-vm-access-control-profile update --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --name myInVMAccessControlProfileName  --description test 

Screenshot dell'aggiornamento della descrizione di InVMAccessControlProfile

  1. Operazione Get per InVMAccessControlProfile
az sig in-vm-access-control-profile show --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --name myInVMAccessControlProfileName 

Screenshot dell'operazione Get per InVMAccessControlProfile

  1. Elencare tutti gli InVMAccessControlProfile artefatti

Questo comando mostra l'elenco di tutti gli InVMAccessControlProfile sotto una galleria specifica.

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

Screenshot del comando List per visualizzare tutti gli artefatti InVMAccessControlProfile sotto una raccolta specifica

  1. Creare InVMAccessControlProfileVersion

È necessario fornire un payload per poter creare un oggetto InVMAccessControlProfileVersion. Questo payload può essere di grandi dimensioni, in particolare a causa della proprietà della regola, che può includere configurazioni molto estese. Invece di passare direttamente singole parti della proprietà delle regole, è stato introdotto un parametro regole che accetta un file JSON come input. Questo approccio semplifica il processo e mantiene il comando pulito e gestibile. Di seguito è riportato un esempio di file 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. } 

Consulta ulteriori dettagli sui comandi qui: az sig in-vm-access-control-profile-version | Microsoft Learn

Dopo aver creato la versione del file di rules.json, usare il comando seguente per creare 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. Ottieni InVMAccessControlProfileVersion
az sig in-vm-access-control-profile-version show --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --profile-name myInVMAccessControlProfileName --profile-version 1.0.0

Screenshot del comando

  1. Elencare tutti gli InVMAccessControlProfileVersion artefatti
az sig in-vm-access-control-profile-version list --resource-group ResourceGroupForINVM --gallery-name MyGallery67 --profile-name myInVMAccessControlProfileName
  1. Elimina InVMAccessControlProfileVersion

Prima di eliminare qualsiasi InVMAccessControlProfileVersion verificare che non venga usata da alcun InVMAccessControlProfile su macchine virtuali o set di scalabilità di macchine virtuali.

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