Ayant travaillé sur Microsoft Azure récemment et dans un besoin de gouvernance, j’ai mis en place quelques policy sur l’environnement Azure sur lequel j’opère actuellement. Je vais présenter dans cet article quelques policy permettant de contrôler divers éléments.
Cette première policy a été importée depuis GitHub. Elle permet de surveiller la présence d’un lock sur un Resource Group si celui-ci possède un tag renseigné à une valeur spécifique. Par exemple, on peut placer un tag ProtectedByLock à True pour indiquer à la policy que ce Resource Group doit être protégé par un lock. Si jamais le tag n’est pas présent ou que celui-ci n’est pas à True, alors la policy ne remontera rien si ce Resource Group n’est pas protégé par un lock.
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Resources/subscriptions/resourceGroups" }, { "field": "[concat('tags[', parameters('tagName'), ']')]", "equals": "[parameters('tagValue')]" } ] }, "then": { "effect": "auditIfNotExists", "details": { "type": "Microsoft.Authorization/locks", "existenceCondition": { "field": "Microsoft.Authorization/locks/level", "equals": "CanNotDelete" } } } }, "parameters": { "tagName": { "type": "String", "metadata": { "displayName": "Tag Name", "description": "The tag name to audit against (i.e. Environment, CostCenter, etc.)" } }, "tagValue": { "type": "String", "metadata": { "displayName": "Tag Value", "description": "Value of the tag to audit against (i.e. Prod/UAT/TEST, 12345, etc.)" } } } }
Cette policy permet de vérifier que les disques virtuels existants sont tous bien rattachés à une machine virtuelle.
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/Disks" }, { "anyOf": [ { "not": { "field": "Microsoft.Compute/Disks/managedBy", "exists": "True" } } ] } ] }, "then": { "effect": "audit" } }, "parameters": {} }
De manière similaire, cette policy permet de mettre en évidence la présence de NIC orphelines.
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/networkInterfaces" }, { "anyOf": [ { "not": { "field": "Microsoft.Network/networkInterfaces/VirtualMachine", "exists": "True" } } ] } ] }, "then": { "effect": "audit" } }, "parameters": {} }
Cette dernière policy permet de vérifier que les machines n’ayant pas un tag Backup à No sont bien sauvegardées par Azure Backup. Ici aussi, il est possible d’adapter le contrôle en fonction du tag et de la valeur attendue pour mettre en alerte les irrégularités.
{ "mode": "Indexed", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "anyOf": [ { "not": { "field": "[concat('tags[', parameters('TagName'), ']')]", "equals": "[parameters('TagValue')]" } } ] } ] }, "then": { "effect": "[parameters('effect')]", "details": { "type": "Microsoft.RecoveryServices/backupprotecteditems" } } }, "parameters": { "effect": { "type": "String", "metadata": { "displayName": "Effect", "description": "Enable or disable the execution of the policy" }, "allowedValues": [ "AuditIfNotExists", "Disabled" ], "defaultValue": "AuditIfNotExists" }, "TagValue": { "type": "String", "metadata": { "displayName": "Tag Value", "description": "Tag Value (No)" }, "allowedValues": [ "No" ], "defaultValue": "No" }, "TagName": { "type": "String", "metadata": { "displayName": "Tag Name", "description": "Tag Name (Backup)" }, "allowedValues": [ "Backup" ], "defaultValue": "Backup" } } }