Three Azure governance controls that people mix up. RBAC decides who can act, Azure Policy decides what a resource may look like, and locks stop changes even by an Owner. Scopes, effects, exemptions, remediation, deny assignments and three traps.
By Tony Rough
Azure has three governance controls that sit side by side and get confused all the time:
Even if someone has permission to act, Policy still blocks a non-compliant result, and a lock overrides any user permissions.
A role assignment is a security principal, a role definition and a scope. Scopes are the management group, subscription, resource group or resource, and assignments are inherited by everything below. RBAC is additive: your effective permissions are the sum of your role assignments. If you’re unsure which role system you need in the first place, see Azure RBAC vs Microsoft Entra roles.
The exception is a deny assignment. Azure Resource Manager checks deny assignments first, and if one applies, access is blocked even when a role grants it. You can’t create your own: Azure creates them, for example when a deployment stack uses deny settings. (Customer-managed deny assignments are still in private preview.)
A policy definition is a rule plus an effect. Group several definitions into an initiative (the CLI and PowerShell call it a policySet); Microsoft recommends assigning initiatives even if you start with one policy. Assign either to any of the four scopes; child scopes inherit it.
The supported effects are addToNetworkGroup, append, audit, auditIfNotExists, deny, denyAction, deployIfNotExists, disabled, manual, modify and mutate. The ones to know cold:
DELETE.Policy also re-checks existing resources in a compliance cycle every 24 hours. Policy can look at the identity behind a request too (for example, blocking users without MFA), but its core job is the resource’s properties.
notScopes) lives on the assignment. Excluded resources aren’t evaluated or counted. Use it to permanently leave out a broad scope such as a test environment.Policy is an explicit deny system: a more permissive assignment lower down doesn’t override a deny higher up. You exclude or exempt the lower scope instead.
Existing non-compliant resources aren’t fixed automatically. For deployIfNotExists and modify you run a remediation task, and Azure Policy makes the change using the assignment’s managed identity (system-assigned or user-assigned, one per assignment). In the portal the identity gets its roles automatically; through an SDK, you grant them yourself, or the remediation fails. Granting those roles needs User Access Administrator (or Owner); Contributor can trigger remediation but can’t create definitions or assignments.
There are two levels:
Locks go on a subscription, resource group or resource. You can’t lock a management group. Locks are inherited, and the most restrictive one wins. A Delete lock on one resource stops its whole resource group from being deleted.
Locks apply to the control plane (management.azure.com), not the data plane. A ReadOnly lock on a SQL logical server still lets you change the data in its databases, and no lock on a storage account protects the blobs, files, queues or tables inside it.
Only someone with Microsoft.Authorization/locks/* (Owner and User Access Administrator have it) can create or remove a lock.
| You need to… | Choose |
|---|---|
| Control who can create, change or delete resources | Azure RBAC |
| Allow only certain regions, SKUs or resource types | Azure Policy (deny) |
| Report non-compliance without blocking anything | Azure Policy (audit) |
| Add a missing tag or setting automatically | Azure Policy (modify), plus remediation for existing resources |
| Stop anyone, even an Owner, deleting a resource | CanNotDelete lock |
| Freeze a resource’s configuration completely | ReadOnly lock (check the side effects) |
| Leave a scope out of a policy for a limited time | Exemption |
Azure Policy, resource locks, management groups and RBAC are all in the governance objectives of the AZ-104 study guide, with the design view in the AZ-305 study guide and the fundamentals in the AZ-900 study guide. Facts checked against Microsoft Learn on 8 October 2026.
Microsoft has confirmed that Always Encrypted with Intel SGX enclaves in Azure SQL Database retires on 31 October 2027, and that App Service support for Java 8, 11 and 17 ends on 1 September 2027. Defender for Storage can now scan individual blobs and containers on demand, and Application Gateway WAF inspects IPv6 traffic in preview.
Both connect your on-premises network to Azure, but one runs encrypted over the internet and the other runs privately through a provider. How each works, the SKU changes, encryption, failover, Virtual WAN and three exam traps.
Three Azure services all "block traffic", but at different layers and in different places. What each one inspects, how they fit together, and three exam traps.
The October review of Microsoft's announcements found two changes that affect the AZ-305 guide. The retirement date for Application Insights URL ping tests has moved, and Azure IoT Central is being retired.
Both lock an Azure service down to your virtual network, but they work in completely different ways. How each one works, the on-premises trap, DNS, data exfiltration, and a five-second way to choose.