commande Powershell principale
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 moduleAz.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 estAz.ResourceGraph
que nous allons importer en terraform avec la resourceazurerm_automation_module
disponible sur ce lien. Il dépend du moduleAz.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.