Files
regorus/tests/azure_policy/cases/e2e_custom_owner_role.yaml
Anand Krishnamoorthi afdb894d85 test(azure_policy): add end-to-end policy test cases (#699)
50 end-to-end test cases derived from real Azure built-in policies. Each
file contains a complete policy definition, sample resources, and expected
evaluation results. Coverage spans storage, networking, compute, security,
monitoring, database, identity, governance, and update management scenarios.

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-27 18:04:50 -05:00

232 lines
6.8 KiB
YAML

# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.
# E2E Test: General/CustomSubscription_OwnerRole_Audit
# Real Azure Policy: "[Deprecated]: Custom subscription owner roles should not exist"
# Source: regolator/policyDefinitions/General/CustomSubscription_OwnerRole_Audit.json
#
# Features exercised:
# - 4 double-negation blocks: not { field notEquals }, not { field notIn }, not { field notLike }
# - Array wildcard aliases: permissions[*].actions[*], assignableScopes[*]
# - subscription().id and concat(subscription().id, '/')
# - notLike "/providers/Microsoft.Management/*"
# - Deeply nested sub-resource arrays (permissions[*].actions[*])
aliases: test_aliases.json
policy_definition: |
{
"properties": {
"displayName": "[Deprecated]: Custom subscription owner roles should not exist",
"policyType": "BuiltIn",
"mode": "All",
"parameters": {
"effect": {
"type": "string",
"defaultValue": "Audit",
"allowedValues": ["Audit", "Disabled"]
}
},
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Authorization/roleDefinitions"
},
{
"field": "Microsoft.Authorization/roleDefinitions/type",
"equals": "CustomRole"
},
{
"anyOf": [
{
"not": {
"field": "Microsoft.Authorization/roleDefinitions/permissions[*].actions[*]",
"notEquals": "*"
}
}
]
},
{
"anyOf": [
{
"not": {
"field": "Microsoft.Authorization/roleDefinitions/assignableScopes[*]",
"notIn": [
"[concat(subscription().id,'/')]",
"[subscription().id]",
"/"
]
}
},
{
"not": {
"field": "Microsoft.Authorization/roleDefinitions/assignableScopes[*]",
"notLike": "/providers/Microsoft.Management/*"
}
}
]
}
]
},
"then": {
"effect": "[parameters('effect')]"
}
}
}
}
cases:
# =========================================================================
# Custom owner role with subscription scope → audit
# =========================================================================
- note: audit_custom_owner_subscription_scope
resource:
type: "Microsoft.Authorization/roleDefinitions"
name: "custom-owner"
properties:
type: "CustomRole"
permissions:
- actions:
- "*"
assignableScopes:
- "/subscriptions/sub-123"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_effect: "Audit"
- note: audit_custom_owner_subscription_trailing_slash
resource:
type: "Microsoft.Authorization/roleDefinitions"
name: "custom-owner-slash"
properties:
type: "CustomRole"
permissions:
- actions:
- "*"
assignableScopes:
- "/subscriptions/sub-123/"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_effect: "Audit"
- note: audit_custom_owner_root_scope
resource:
type: "Microsoft.Authorization/roleDefinitions"
name: "custom-owner-root"
properties:
type: "CustomRole"
permissions:
- actions:
- "*"
assignableScopes:
- "/"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_effect: "Audit"
- note: audit_custom_owner_management_group_scope
resource:
type: "Microsoft.Authorization/roleDefinitions"
name: "custom-owner-mg"
properties:
type: "CustomRole"
permissions:
- actions:
- "*"
assignableScopes:
- "/providers/Microsoft.Management/managementGroups/mg1"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_effect: "Audit"
# =========================================================================
# Custom role without owner (*) actions → pass
# =========================================================================
- note: pass_custom_role_no_wildcard_actions
resource:
type: "Microsoft.Authorization/roleDefinitions"
name: "custom-reader"
properties:
type: "CustomRole"
permissions:
- actions:
- "Microsoft.Compute/virtualMachines/read"
- "Microsoft.Storage/storageAccounts/read"
assignableScopes:
- "/subscriptions/sub-123"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_undefined: true
# =========================================================================
# Custom owner role but NOT scoped to subscription/root/MG → pass
# =========================================================================
- note: pass_custom_owner_resource_group_scope
resource:
type: "Microsoft.Authorization/roleDefinitions"
name: "custom-owner-rg"
properties:
type: "CustomRole"
permissions:
- actions:
- "*"
assignableScopes:
- "/subscriptions/sub-123/resourceGroups/rg1"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_undefined: true
# =========================================================================
# BuiltIn role (not CustomRole) → pass
# =========================================================================
- note: pass_builtin_role
resource:
type: "Microsoft.Authorization/roleDefinitions"
name: "builtin-owner"
properties:
type: "BuiltInRole"
permissions:
- actions:
- "*"
assignableScopes:
- "/"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_undefined: true
# =========================================================================
# Wrong resource type
# =========================================================================
- note: pass_wrong_type
resource:
type: "Microsoft.Compute/virtualMachines"
name: "not-role-def"
properties:
type: "CustomRole"
context:
subscription:
subscriptionId: "sub-123"
id: "/subscriptions/sub-123"
want_undefined: true