Come gestire le risorse Azure utilizzando le Azure Policy
Le Azure Policy sono un servizio che vi permette di creare, assegnare e gestire delle policy per assicurarvi che le risorse create nel Cloud siano conformi con gli standard aziendali e con le vostre SLA (Service Level Agreement).
Il vantaggio principale delle policy consiste nel forzare, rendere scalabile ed eventualmente rimediare a tutto ciò che non è compliant con le regole imposte dalla gestione della vostra infrastruttura cloud. Ad esempio è possibile limitare le risorse da creare, per avere un controllo dei costi di gestione.
Nella figura sotto vengono elencati tutti i vantaggi offerti dalle Azure Policy.
Figura 1: Vantaggi offerti dalle Azure Policy
Il principio di funzionamento è molto semplice: ogni volta che deve essere creata o modificata una risorsa su Azure, le Azure Policy si assicurano che le richieste siano compatibili con le impostazioni che avete indicato.
Figura 2: Valutazione delle richieste di modifica tramite le Azure Policy
Perché le Azure Policy sono differenti dal Role-Based Access control (RBAC)?
Le Azure Policy sono differenti dal Role-Based Access Control perché mentre quando voi assegnate dei privilegi tramite RBAC state impedendo di effettuare delle operazioni di creazione o modifica sugli oggetti (risorse), le Azure Policy sono in grado di valutare e di permettere/negare operazioni effettuate sulle singole proprietà delle risorse. Con le Azure Policy potete stabilire in quale location creare le risorse, i limiti che devono avere (quantità o dimensioni) e soprattutto potete anche gestire risorse già create.
Gestione delle Azure Policy
Dalla console di Azure vi basterà cercare la voce Policy e dalla scheda Overview sarete in grado di vedere la conformità (compliance) delle policy applicate alle vostre risorse Azure.
Figura 3: Overview di Azure Policy
Figura 4: Compliance delle Azure Policy
Azure Policy Definition
Sono disponibili diversi template di Azure Policy e molti altri sono disponibili alla pagina Repository for Azure Resource Policy samples – GitHub
Le Azure Policy Definition stabiliscono in base a quali condizioni la policy deve essere applicata e quale effetto deve avere. La struttura delle Azure Policy Definition è basata su template JSON ed è ben spiegata alla pagina https://docs.microsoft.com/en-us/azure/governance/policy/concepts/definition-structure
Per creare una Azure Policy Definition personalizzata vi basterà cliccare su Definitions e poi su + Policy Definition, come mostrato in figura:
Figura 5: Creazione di una nuova Azure Policy Definition
Voglio creare una policy chiamata “Impedisce che vengano create VM della SKU Standard_E” che si occuperà di verificare, al momento della creazione delle VM, che queste non utilizzino come dimensione della macchina virtuale quella della famiglia E Standard. Per maggiori informazioni sulla dimensione che è possibile assegnare alle VM in Azure vi rimando alla lettura dell’articolo Sizes for Windows virtual machines in Azure
Ogni Azure Policy Definition può avere un solo effetto, che avverrà in maniera diversa se si tratta di una risorsa creata, aggiornata oppure già esistente. Al momento sono disponibili 6 effetti, ben documentati alla pagina https://docs.microsoft.com/en-us/azure/governance/policy/concepts/effects :
- Append
- Audit
- AuditIfNotExists
- Deny
- DeployIfNotExists
- Disabled
Il codice che ho utilizzato per creare la nuova Azure Policy Definition personalizzata è:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
{ "policyRule": { "if": { "allOf": [{ "field": "type", "equals": "Microsoft.Compute/virtualMachines" }, { "field": "Microsoft.Compute/virtualMachines/sku.name", "like": "Standard_E*" } ] }, "then": { "effect": "deny" } } } |
Figura 6: Creazione di una nuova Azure Policy Definition
Assegnazione della Azure Policy
Una volta che avete deciso quali Azure Policy utilizzare o ne avete create di personalizzate, potete assegnarle alle Subscription, ai Resource Group oppure ai Management Group. Selezionate la Policy e cliccate su Assign. Io ho deciso di assegnare la policy che ho creato precedentemente ad un Resource Group specifico, chiamato LAB.
Figura 7: Assegnazione della Policy
D’ora in poi, ogni volta che verrà creata una VM nel Resource Group chiamato LAB, la macchina virtuale non potrà essere creata con nessuna delle dimensioni disponibili per la famiglia E Standard.
Figura 8: Creazione di una nuova VM
Creazione di una nuova VM e verifica dell’applicazione della Azure Policy
Per verificare che la nuova Azure Policy funzioni sarà sufficiente creare una nuova VM nel Resource Group dove avete scelto di applicarla. Nel momento in cui viene effettuato il Review prima della creazione della Azure VM, la Azure Policy che abbiamo creato prima ci impedirà di creare la VM con le configurazioni che abbiamo proibito, come mostrato in figura:
Figura 9: La creazione delle VM è impedita dalla Azure Policy
Gestione di una Azure Policy tramite PowerShell o Azure CLI
È possibile creare le Azure Policy Definition ed assegnare le Azure Policy anche utilizzando PowerShell o Azure CLI.
In questo esempio voglio creare una policy chiamata “Naming Convention per le VM del Laboratorio” che impedisce di creare delle VM il cui nome non inizi per “LAB-“, in modo tale che venga rispettata una convenzione dei nomi. Mi servirò delle cmdlet New-AzureRMPolicyDefinition (in alternativa potete utilizzare la nuova New-AzPolicyDefinition).
A partire dallo scorso 18 dicembre 2018 è stato reso disponibile in nuovo modulo PowerShell per la gestione di Microsoft Azure. Questo modulo sostituirà il vecchio AzureRM che tanti di noi usano ormai da diversi anni e si chiamerà Az. Trovate maggiori informazioni leggendo il mio articolo Modulo Azure PowerShell Az: la rivoluzione della riga di comando per interagire con Microsoft Azure
Per tutte le info per la creazione delle Azure Policy Definition tramite PowerShell vi rimando alla pagina https://docs.microsoft.com/en-us/powershell/module/azurerm.resources/new-azurermpolicydefinition?view=azurermps-6.13.0 .
Io ho deciso di creare la Azure Policy Definition in modalità Inline, cioè direttamente all’esecuzione della cmdlet
1 2 3 4 5 6 7 8 9 10 11 |
New-AzureRMPolicyDefinition -Name 'Naming Convention per le VM del Laboratorio' -Policy '{ "if": { "not": { "field": "name", "like": "LAB-*" } }, "then": { "effect": "deny" } }' |
Dopo aver creato la Azure Policy Definition è possibile assegnarla utilizzando la cmdlet New-AzureRMPolicyAssignment (in alternativa potete utilizzare la nuova New-AzPolicyAssignment). Trovate tutte le info per la gestione delle Azure Policy Definition tramite PowerShell alla pagina https://docs.microsoft.com/en-us/powershell/module/azurerm.resources/new-azurermpolicyassignment?view=azurermps-6.13.0
1 2 3 |
$ResourceGroup = Get-AzureRmResourceGroup -Name 'LAB' New-AzureRMPolicyAssignment -Name "Naming Convention" -Scope $ResourceGroup.ResourceId -PolicyDefinition $definition |
La gestione tramite Azure CLI è molto semplice e utilizza il comando az policy definition create https://docs.microsoft.com/en-us/cli/azure/policy/definition?view=azure-cli-latest#az-policy-definition-create
1 2 3 4 5 6 7 8 9 10 11 |
az policy definition create --name 'Naming Convention per le VM del Laboratorio' –rules '{ "if": { "not": { "field": "name", "like": "LAB-*" } }, "then": { "effect": "deny" } }' |
Mentre per l’assegnazione della policy dovete utilizzare il comando az policy assignment https://docs.microsoft.com/en-us/cli/azure/policy/assignment?view=azure-cli-latest
1 |
az policy assignment create --name "Naming Convention" --scope <scope> --policy "Naming Convention per le VM del Laboratorio" |
A questo punto, dopo aver assegnato la nuova policy “Naming Convention per le VM del Laboratorio” allo stesso Resource Group LAB, se provo a creare una VM con il nome TEST01 e si tipo Standard_E2 riceverò un doppio errore, come quello mostrato in figura:
Figura 10: Durante la creazione della VM vengono processate entrambe le policy applicate al Resource Group
Remediation delle Azure Policy
Se create una Azure Policy Definition che prevede come azione deployIfNotExists, le risorse che non sono compliant con la policy verranno messe in uno stato di Remediation. La Remediation utilizza una Managed Identity a cui verranno dati i permessi necessari per creare i task necessari a rimediare alle mancate configurazioni riscontrate dalla policy. Maggiori informazioni sono disponibili alla pagina https://docs.microsoft.com/en-us/azure/governance/policy/how-to/remediate-resources
Gestione delle Initiative Definition
Una Initiative Definition non è altro che il raggruppamento di diverse Azure Policy Definition che hanno lo scopo di semplificare l’assegnazione delle policy.
È possibile gestire le Initiative Definition utilizzando il portale Azure, PowerShell oppure Azure CLI.
Nel mio caso ho creato una Initiative Definition chiamata “Controllo macchine del Laboratorio” e ho incluso 3 Azure Policy Definition, di cui una Built-in e due Custom, come mostrato in figura:
Figura 11: Creazione di una Initiative Definition
Dopo aver creato la Initiative Definition è possibile selezionarla e cliccare su Assign per associarla alle risorse Azure, esattamente come abbiamo fatto prima per le Azure Policy Definition.
Figura 12: Assegnazione di una Initiative Definition
Conclusioni
Le Azure Policy sono un ottimo modo per gestire la Azure Governance e ci permettono di semplificare la gestione delle proprietà delle singole risorse che possiamo creare e allo stesso tempo ci assicurano che venga fatta una gestione corretta delle stesse risorse, in modo tale da essere sempre conformi con gli obiettivi aziendali e con le SLA, oltre ovviamente che con la gestione dei costi!
Per maggiori informazioni vi rimando alla la lettura della guida Create and manage policies to enforce compliance e vi segnalo anche un ottimo video esplicativo della funzionalità che vi ho proposto Govern your Azure environment through Azure Policy : Build 2018