Pour réaliser cette architecture, nous allons premièrement rédiger notre code Powershell qui sera exploité par Azure Automation Runbook. Les commandes principales à savoir dans ce code sont les suivantes :

  • Connect-AzAccount -Identity : cette commande permet de se servir des identités de l’hôte qui exécute notre code. Dans notre cas, le Runbook va exécuter notre code Powershell en se servant de l’identité qui a été attribuée à Azure Automation Account et donc des droits accordés à cette identité.
  • Get-AzStorageAccount, Get-AzStorageBlobContent, Set-AzStorageBlobContent permet de gérer notre compte de stockage.
  • Search-AzGraph : cette commande permet de nous servir de l’API Graph Microsoft pour faire des requêtes KQL. Elle se trouve dans le module Az.ResourceGraph, comparée aux précédentes commandes, cette commande est dans un module qu’il faudra importer dans Azure Automation Account. Le module à importer est Az.ResourceGraph que nous allons importer en terraform avec la resource azurerm_automation_module disponible sur ce lien. Il dépend du module Az.Account disponible sur le lien. Il faut noté que l’ensemble des modules sont disponibles.

Nous aurons au final l’extrait de code suivant aussi disponible sur github :

Connect-AzAccount -Identity
# ...
Get-AzStorageBlobContent -Container $containerName -Blob $queryfile -Context $Context -Destination "./$queryfile" -Force
(Get-Content -Path "./$queryfile") | ForEach-Object { $_ -replace $lastStandard, $newStandard } | Set-Content -Path "./$kql_query"
$policyevent = Search-AzGraph -Query $(Get-Content -Path "./$kql_query" -raw)

On peut remarquer que j’ai rediger des extraits de code KQL dans un fichier et avec la commande Get-Content, je recupère ces requêtes que j’utilise sur l’API Graph. La requête se présente sous la forme :

    securityresources
    | where type == 'microsoft.security/regulatorycompliancestandards/regulatorycompliancecontrols/regulatorycomplianceassessments'
    | parse id with * 'regulatoryComplianceStandards/' complianceStandardId '/regulatoryComplianceControls/' complianceControlId '/regulatoryComplianceAssessments' *
    | extend complianceStandardId = replace( '-', ' ', complianceStandardId)
    | project complianceStandardId
    | summarize by complianceStandardId

Sur le Github, vous allez remarquer que j’ai 2 requêtes, la première recupère la liste des Standards de Conformité et la seconde recupère les recommandations de sécurité pour un standard précis.