RBAC vs ABAC Authorization Models for CDN Multi-Tenant Access Control

· David Park · 10 min read

Authorization in CDN platforms answers the question that authentication cannot: now that we know who you are, what are you allowed to do? This question has layers. Can this user purge cache? For which zones? At what time of day? Does purging production cache require additional approval? The authorization model determines how these rules are defined, evaluated, and enforced — and the wrong model creates either security gaps (insufficient granularity) or operational paralysis (so many rules that nobody understands who can do what). Two models dominate: Role-Based Access Control (RBAC), which assigns permissions through predefined roles, and Attribute-Based Access Control (ABAC), which evaluates permissions dynamically based on user, resource, action, and environmental attributes.

How Does RBAC Work for CDN Platform Authorization?

RBAC groups permissions into named roles and assigns roles to users. A CDN platform typically defines a hierarchy of roles: Super Admin (full platform access including billing and account management), Admin (full CDN configuration but no billing), DevOps (cache management, configuration deployment, monitoring), Security (WAF rules, security configuration, threat analysis), and Viewer (read-only access to analytics and logs).

When a user authenticates via federation, their JWT carries a roles claim: ["devops", "viewer"]. When they request a cache purge operation, the authorization layer checks: does any assigned role include the cache:purge permission? If yes, the operation proceeds. The evaluation is a simple set intersection — the user's role permissions versus the required operation permission.

RBAC's strength is clarity. An auditor can answer "who can purge production cache?" by listing users with the DevOps or Admin role. A new team member's access is defined by assigning one or two roles, not by configuring individual permissions. And RBAC integrates naturally with SCIM group sync: IdP groups map to CDN roles, and role changes propagate automatically.

RBAC's weakness emerges when access requirements depend on context. "DevOps engineers can purge cache, but only for their team's zones, and only during business hours for production" cannot be expressed as a role. The role says "can purge cache" — it cannot distinguish between zones or times. This gap leads to role explosion: creating increasingly specific roles (devops-team-a-production-business-hours) to capture contextual requirements that RBAC was not designed to express.

How Does ABAC Solve RBAC's Contextual Limitations?

ABAC evaluates authorization decisions against policies that reference attributes from four categories: the subject (user attributes: department, clearance level, team membership), the resource (the CDN resource being accessed: zone ID, environment tag, sensitivity level), the action (the operation: read, purge, configure, delete), and the environment (contextual conditions: time of day, source IP, whether a change ticket exists).

Performance Comparison: Edge vs Origin Processing
Metric Edge Processing Origin Processing Improvement
Latency (p50)8–15 ms120–300 ms15–20x faster
Cache Hit Ratio85–95%N/AReduces origin load
TLS Handshake1–5 ms (nearby PoP)50–150 ms10–30x faster
Bandwidth Cost$0.01–0.04/GB$0.05–0.12/GB3–5x cheaper
Availability99.99% (multi-PoP)99.9% (single DC)10x fewer outages

An ABAC policy for CDN cache purge might read: "ALLOW cache:purge IF subject.department IN resource.zone.owning_departments AND (resource.zone.environment = 'staging' OR (resource.zone.environment = 'production' AND environment.change_ticket_exists = true)) AND environment.time WITHIN subject.team.business_hours." This single policy replaces what would require dozens of RBAC roles to approximate.

ABAC's power is its expressiveness. Any access decision that can be described in terms of attributes can be encoded as a policy. Context-dependent access, resource-level granularity, temporal restrictions, and approval-gate requirements all live in the policy language without creating new roles. Policy changes don't require user-role reassignment — changing the business hours or adding a new team to a zone's ownership list updates the authorization behavior without touching any user's account.

ABAC's cost is complexity. Policies are harder to write, test, and audit than role assignments. Debugging "why was this user denied access?" requires tracing the policy evaluation against all relevant attributes, not just checking role membership. And ABAC evaluation may require attribute lookups that RBAC avoids — the policy engine needs to know the zone's owning departments and the user's team's business hours, data that must be available at evaluation time.

RBAC vs ABAC Authorization Decision Flow Authorization Decision: RBAC vs ABAC Evaluation RBAC Decision Input: user roles + required permission user.roles = ["devops"] required = "cache:purge" devops includes cache:purge → ALLOW ABAC Decision Input: subject + resource + action + env attributes subject.dept=engineering, resource.env=prod action=cache:purge, env.ticket=CHG-4521 env.time=14:30 (within business_hours) All conditions met → ALLOW Comparison RBAC ABAC Evaluation speed ★★★★★ ★★★☆☆ Flexibility ★★☆☆☆ ★★★★★ Auditability ★★★★★ ★★★☆☆ Edge-evaluable ★★★★☆ ★★★★★ Multi-tenant fit
Figure 1: RBAC evaluates role membership (fast, simple); ABAC evaluates multi-attribute policies (flexible, complex)

How Does the Hybrid RBAC+ABAC Model Work?

The hybrid model uses RBAC to define the ceiling (maximum permissions) and ABAC to set the floor (what's actually allowed in context). This gives CDN platforms RBAC's auditability for base access while adding ABAC's contextual refinement for complex requirements.

Implementation: the user's JWT carries their RBAC roles. When they request an operation, the authorization layer first checks RBAC: does any role include this permission? If no, deny immediately (fast path — no ABAC evaluation needed). If yes, evaluate the ABAC policies that apply to this role+operation combination. ABAC policies can only narrow RBAC permissions, never widen them. A user without the DevOps role cannot cache purge regardless of ABAC policy evaluation.

This design works well at CDN edge PoPs. The RBAC check is a fast JWT claim evaluation — no external data needed. If RBAC denies, the response is immediate. ABAC evaluation only runs for RBAC-permitted operations, reducing the attribute lookup load. For edge-evaluable ABAC policies (those using only JWT-embedded attributes and locally available context like time), the entire authorization decision happens at the edge with no origin contact.

For ABAC policies that require data not available at the edge (resource ownership, change ticket status), the edge delegates the authorization decision to a regional policy engine. This adds latency (10-50ms) but enables the full ABAC evaluation. CDN platforms should optimize by embedding frequently-evaluated attributes in the JWT and delegating only the rare, complex evaluations.

The authorization model is the CDN platform's immune system: it determines what each user can do to the infrastructure and under what conditions. Getting it right means enterprise customers can delegate CDN management to their teams with confidence that the right people have the right access, and getting it wrong means either a security incident (too permissive) or an operational bottleneck where every action requires admin involvement (too restrictive). Start with RBAC for its clarity, add ABAC when contextual requirements emerge, and implement the hybrid to get both.

External References

References & Standards: HTTP/2 specification · Cloudflare documentation