Skip to content

Governance Overview

Governance constraints were discovered from the live Azure environment and not assumed.

QueryResultsTimestamp
REST API Total21 assignments total2026-04-14T14:03:53Z
Subscription-scope5 direct assignments2026-04-14T14:03:53Z
MG-inherited9 inherited assignments2026-04-14T14:03:53Z
Resource-group7 RG-scoped assignments2026-04-14T14:03:53Z
Deny-effect1 true blocker found2026-04-14T14:03:53Z
Tag Policies9 required RG tags discovered2026-04-14T14:03:53Z
Security Policies10 relevant constraints2026-04-14T14:03:53Z

Discovery Method: Azure Policy MCP (policy_assignment_list) plus direct ARM REST (az rest) for assignment, policy definition, and initiative policyRule inspection

Subscription: noalz (00858ffc-dded-4f0f-8bbf-e17fff0d47d9) Tenant: 2d04cb4c-999b-4e60-a3a7-e8993edc768b Scope: Full subscription, including management-group-inherited assignments Portal Validation: Not performed in this session; assignment coverage is REST-verified but was not cross-checked in Azure Portal

Deny and DeployIfNotExists policies were verified against their live policyRule JSON to avoid false positives from policy display names.

Policy Display NameAssignment ScopeEffectActually BlocksEvidence from policyRule.ifBicep Property PathRequired Value
JV-Enforce Resource Group Tags v3Management GroupDenyResource group creation when any required tag is missingfield: "type" = "Microsoft.Resources/subscriptions/resourceGroups" and anyOf missing environment, owner, costcenter, application, workload, sla, backup-policy, maint-window, technical-contacttagsInclude all 9 required RG tags
Block Azure RM Resource CreationManagement GroupDenyClassic resource types only; does not block App Service, Storage, Key Vault, ACR, Log Analytics, or App InsightsanyOf checks only Microsoft.ClassicCompute/*, Microsoft.ClassicNetwork/*, Microsoft.ClassicStorage/*, and Microsoft.MarketplaceApps/classicDevServicesN/AN/A
Not allowed resource typesManagement GroupDenyClassical resource types only in the active deny initiative; no modern app/data services used by this design were presentInitiative parameter listOfResourceTypesNotAllowed contains only classic resource typesN/AN/A
Deny Azure Key Vault Managed HSM with Purge Protection EnabledManagement GroupDenyMicrosoft.KeyVault/managedHSMs only; does not apply to Microsoft.KeyVault/vaultsfield: "type" = "Microsoft.KeyVault/managedHSMs" and enablePurgeProtection = trueN/AN/A
Deploy Resource Group McapsGovernanceManagement GroupDeployIfNotExistsAuto-creates a support resource group for governance resourcesfield: "type" = "Microsoft.Resources/Subscriptions"; deployment creates RG McapsGovernance in WestUS2N/ARG McapsGovernance exists
Deploy Storage Account for Diagnostic SettingsManagement GroupDeployIfNotExistsAuto-creates a governance-managed diagnostics storage accountfield: "type" = "Microsoft.Resources/subscriptions"; deployment creates StorageV2 with allowBlobPublicAccess=false, allowSharedKeyAccess=false, minimumTlsVersion="TLS1_2", publicNetworkAccess="Disabled"N/ASupport storage account exists

Analysis Notes:

  • The only true deny blocker for this architecture is the resource-group tag policy.
  • Public endpoint concerns for Storage and Key Vault are currently audit / modify, not deny, in the active subscription scope.
  • The deny initiative contains no direct App Service, ACR, Key Vault vault, or Storage Account deny policy for modern resource types.
  • A governance inconsistency exists: the resource-group deny policy requires technical-contact, but the tag inheritance modify policy uses tech-contact for child resources.
CategoryConstraintImplementationStatus
NamingNo active deny policy for CAF naming was discovered for this architectureUse normal CAF-style names in Bicep
TaggingResource groups must include 9 exact tags; child resources are auto-modified to inherit 9 tagsPre-create or deploy into a compliant RG and define both technical-contact and tech-contact to bridge policy drift
SecurityStorage settings are auto-hardened; Key Vault RBAC / firewall / private link are audit-only controlsSet storage hardening explicitly; VNet integration + private endpoints resolve public endpoint audit warnings
Data ResidencyNo deny on swedencentral was discovered in active assignmentsKeep all app resources in swedencentral; note governance support resources auto-deploy in WestUS2
Original DesignBlocking PolicyEffectAdaptation Applied
Default 4-tag model (Environment, ManagedBy, Project, Owner)JV-Enforce Resource Group Tags v3DenyExpand the deployment contract to 9 governance tags on the resource group: environment, owner, costcenter, application, workload, sla, backup-policy, maint-window, technical-contact
Resource tags assumed to be passed directly from IaC onlyJV - Inherit Multiple Tags from Resource GroupModifyKeep explicit tags in Bicep anyway to avoid drift and to make compliance visible in code reviews
Storage account defaults left to platformStorageAccount_BlobAnonymousAccess_Modify + StorageAccount_DisableLocalAuth_ModifyModifySet allowBlobPublicAccess: false and allowSharedKeyAccess: false explicitly in IaC
Public Key Vault and relaxed Storage network posture were treated as provisional architecture decisionsAzure Security Baseline built-insAudit / AuditIfNotExistsResolved: VNet integration + private endpoints for Key Vault, Storage, and ACR eliminate public endpoint exposure. publicNetworkAccess: Disabled is set on all three services. This resolves ARC-004 (public endpoint risk) from the original architecture assessment
PolicyEffectAuto-Applied Resource
Deploy Resource Group McapsGovernanceDeployIfNotExistsMay auto-create resource group McapsGovernance in WestUS2
Deploy Storage Account for Diagnostic SettingsDeployIfNotExistsMay auto-create a governance-managed StorageV2 account in McapsGovernance with TLS 1.2, HTTPS-only, no blob public access, no shared key access, and publicNetworkAccess = Disabled
PolicyEffectAuto-Applied Change
JV - Inherit Multiple Tags from Resource GroupModifyAdds or replaces 9 child-resource tags from the resource-group tag set
Ensure secure access to storage account containersModifyForces allowBlobPublicAccess = false unless excluded with SecurityControl = Ignore
SFI-ID4.2.1 Storage Accounts - Safe Secrets StandardModifyForces allowSharedKeyAccess = false unless excluded with SecurityControl = Ignore