Skip to content

Role Comparison Matrix ​

Permissions traced from the portal routes (cyberrange/portal/src/lib/routeRoles.ts, middleware.ts), the API guards (cyberrange/src/provisioning/auth.py, pods_router.py, alerts_endpoint.py, users_router.py, onboarding_router.py, infra_health.py, audit_router.py) and the route classification test (cyberrange/src/provisioning/test_sec01_rbac_matrix.py).

Legend: Yes allowed · No refused · Own only limited to the caller's own data · Not implemented

Portal pages ​

PageStudentInstructorAdmin
/dashboard (student dashboard)YesNo (redirect to /instructor)No (redirect to /admin)
/scenarios, /scenario/[id] (student workspace)YesYes (no role restriction on these paths)Yes
/orientation (first-login orientation)Yes (student steps)Yes (instructor steps)Skipped (redirect to /admin)
/lab/dvwa/* (DVWA proxy for the caller's own lab)Own onlyOwn onlyOwn only
/instructor and sub-pagesNo (redirect to /dashboard)YesYes
/admin and sub-pagesNo (redirect to /dashboard)No (redirect to /instructor)Yes
Sidebar links shownDashboard, My LabsDashboard, Live labs, Students, ReviewsDashboard, Users, Pods, System, Audit log, Instructor view

Student lab pages are open to every role

requiredRolesForPath() only restricts /admin and /instructor, and since pull request 176 redirectPathForRole() also moves staff off /dashboard. Instructors and admins can still open /scenarios and /scenario/[id] directly and start a lab for themselves (every app role may call POST /pods/provision). This is useful for testing, and it is still limited to the caller's own lab.

Labs ​

ActionStudentInstructorAdminEnforced by
Start a lab (one live lab per account)Own onlyOwn onlyOwn onlyidentity from token; idx_pods_one_active_per_student
See lab statusOwn onlyOwn onlyAny labrequire_owner_or_admin on GET /pods/{id}/status
List live labs via GET /podsOwn onlyOwn onlyAlladmin branch in list_pods()
List all live labs (instructor view, internals hidden)NoYesYesrequire_role(instructor, admin)
Open the terminalOwn onlyOwn onlyAny lab (backend only, no UI)bridge ownership check uses /pods/{id}/status
DVWA and SIEM links (lab-urls)Own onlyOwn onlyOwn onlyrequire_owner
End a lab (destroy)Own onlyOwn onlyOwn onlyrequire_owner
Force-destroy any lab (audited)NoNoYesrequire_role(admin)

Scoring and progress ​

ActionStudentInstructorAdminEnforced by
Manual Check on a milestone (once per task)Own labOwn labOwn labrequire_owner, lab must be ACTIVE, manual_check_attempts
Read milestones and progressOwn onlyAll studentsAll studentsself-scoped routes; instructor routes
See where each attempt came from (source: auto, manual, browser, flag, review)NoYesYesGET /instructor/students/{id} only
Read check-failure reason codes (scoring diagnostics)No (generic result only)YesYesrequire_role(instructor, admin) on GET /instructor/students/{id}/diagnostics
Reset own progress for a scenario ("Try again")Own onlyOwn onlyOwn onlyidentity from token, audited
Submit a flagOwn onlyOwn onlyOwn onlyidentity from token; portal box on flag-only tasks
Award a milestone PASS by approving a milestone-scoped reviewNoYesYesresolve_student_review (conflicts, reports and manual reviews)
Edit scenarios, milestones or pointsNot implementedNot implementedNot implementedstatic catalog

SIEM (Wazuh alerts) ​

ActionStudentInstructorAdmin
Alerts for own active lab (Scenario 3 viewer)Own onlyOwn onlyOwn only
Alerts for any live labNoYesYes
Lab history and archived alerts for ended labsNoYesYes
Alerts frozen with a submitted reportNoYesYes

Reviews and evidence ​

ActionStudentInstructorAdmin
Submit a report / manual review requestOwnOwnOwn
Read a reviewOwn onlyAnyAny
Resubmit a review returned for retryOwn onlyOwn onlyOwn only
Upload or delete evidence screenshotsOwn reviewsOwn reviewsOwn reviews
View evidence screenshotsOwn reviewsAnyAny
Review queue, resolve (Approve, Reject, Retry, score, feedback)NoYesYes
Knowledge-gain export, anonymized (JSON/CSV)NoYesYes
Knowledge-gain export with real usernames (anonymize=false) or including excluded accountsNoNo (403, audited)Yes
Download one student's progress as CSV (milestones, reviews, live alerts)NoYesYes

Administration ​

ActionStudentInstructorAdmin
List Keycloak users with their roleNoNoYes
Create a user (single role, temporary password)NoNoYes
Enable or disable a userNoNoYes (not self, not the last admin)
Change a user's roleNoNoYes (not self)
Reset a user's passwordNoNoYes (not self)
Reset a user's MFANoNoYes (not self)
Exclude an account from, or include it in, research reportsNoNoYes (the API allows any account; the page offers it on other students only)
Delete a userNot implementedNot implementedNot implemented
System health (API, LXD, Keycloak, Wazuh, capacity, RAM)NoNoYes
Read the audit log (read-only) and download it as CSVNoNoYes
Record own orientation as completedOwn onlyOwn onlyOwn only (the page skips it)
Public /health and /capacityanyone who can reach the API (host-internal)samesame

Sources

cyberrange/src/provisioning/test_sec01_rbac_matrix.py classifies every API route as public, any application role, instructor or admin, and fails if a route is added without a classification. The page-level rules come from cyberrange/portal/src/lib/routeRoles.ts and cyberrange/portal/src/lib/navigation.ts.

Cyber Range capstone documentation (Capstone 2 · Group 2 · A4102). Documents main at commit 6971373.