Cedar Authorization
Cedar is a language for writing authorization policies. This document covers Cedar concepts and its decision logic as a reference model for the Arda Multi-Enterprise Authorization Model.
External References
Section titled “External References”Core Concepts
Section titled “Core Concepts”An authorization request in Cedar is a four-tuple: (Principal, Action, Resource, Context) evaluated against a policy set.
Key types:
Entity— the base type for Principal, Action, and Resource. Every entity has atype, anid, a map ofattributes, and optionalparentsfor hierarchical membership.Context— a map of contextual attributes (e.g., time of day, IP address) that accompany the request but are not modelled as entities.Policy— has aneffect(permit or forbid), three scope clauses (principal, action, resource), and optionalwhenandunlesscondition clauses.Schema— declares the entity types, action definitions, and principal-resource constraints. Used to validate both entities and policies before evaluation.AuthorizationDecision— eitherAlloworDeny, produced by evaluating a policy set against a request.
Decision Logic
Section titled “Decision Logic”Cedar uses a default deny model with forbid-takes-precedence:
- The decision is Allow if and only if at least one
permitpolicy is applicable AND noforbidpolicy is applicable. - In all other cases the decision is Deny.
A policy is applicable to a request when:
- All three scope clauses match — principal scope, action scope, and resource scope.
- All
whenconditions evaluate totrue. - All
unlessconditions evaluate tofalse.
Scope matching supports two forms:
- Exact match: the entity type and id must equal the scope’s type and id.
- Membership match (
inoperator): the entity is a direct or transitive member of the group identified by the scope’s type and id (hierarchy traversal viaparents).
Formal Authorization Predicate
Section titled “Formal Authorization Predicate”Authorize(request, policySet, schema) → AuthorizationDecision
Precondition: All entities in the request validate against the schema.
LET is_permitted = ∃ p ∈ policySet: p.effect = permit ∧ IsApplicable(p, request) LET is_forbidden = ∃ f ∈ policySet: f.effect = forbid ∧ IsApplicable(f, request)
IF (is_permitted ∧ ¬is_forbidden) THEN Allow ELSE DenyWhere IsApplicable is:
IsApplicable(policy, request) := ScopeMatches(request.principal, policy.principalScope) ∧ ScopeMatches(request.action, policy.actionScope) ∧ ScopeMatches(request.resource, policy.resourceScope) ∧ ∀ w ∈ policy.whenClauses: EvaluateCondition(w, request) = true ∧ ∀ u ∈ policy.unlessClauses: EvaluateCondition(u, request) = falseImplications for Arda
Section titled “Implications for Arda”Cedar’s model (entities with hierarchies, rich context, typed schema, default deny, forbid override) maps directly to the Arda Multi-Enterprise Authorization Model requirements:
- Multi-tenant principals can be modelled with entity hierarchies (
UserAccount→Tenant). - Cross-enterprise resource access policies can use
forbidoverrides for explicit denials that survive anypermit. - The schema validates that only declared entity types and actions appear in policies, catching authoring errors before deployment.
Copyright: © Arda Systems 2025-2026, All rights reserved