RBAC Permissions Replaced by Resource and Action Model

For the complete documentation index, see llms.txt. For a full content snapshot, see llms-full.txt. Append .md to any kestra.io/docs/* URL for plain Markdown.

Kestra 2.0 replaces the CRUD-based permission model (READ, CREATE, UPDATE, DELETE) with a resource and action model where each resource has its own set of specific actions.

What changed

Previously, every resource shared the same four CRUD actions. Kestra 2.0 removes this uniform set and gives each resource its own actions that match what users actually do with it. For example:

  • EXECUTION: READ no longer exists. Instead, EXECUTION now has VIEW, LIST, ACCESS_LOGS, ACCESS_OUTPUTS, ACCESS_FILES, and FOLLOW as separate actions.
  • FLOW: UPDATE no longer covers enabling, disabling, or executing flows. Those are now FLOW: ENABLE, FLOW: DISABLE, and FLOW: EXECUTE.
  • Namespace files moved from FLOW: READ/UPDATE to NAMESPACE: MANAGE_FILES.
  • Triggers moved from FLOW: READ to their own TRIGGER resource.

Resources that were renamed or consolidated

Old resourceNew resourceNotes
SETTINGSYSTEM_SETTINGS + TENANT_SETTINGSSplit into two resources
AI_COPILOTCOPILOTRenamed
APPEXECUTIONAPPMerged; app execution actions moved onto APP
TENANT_ACCESSUSERMerged; tenant access actions moved onto USER
GROUP_MEMBERSHIPGROUPMerged; membership actions (MANAGE_MEMBERS) moved onto GROUP
IMPERSONATEUSER: IMPERSONATEConverted from a standalone resource to an action on USER

Resources that were removed

Removed resourceReason
TEMPLATETemplates were deprecated in an earlier release and are no longer permission-controlled

Automatic migration

Existing role permissions in the database are migrated automatically when you upgrade. You do not need to manually recreate roles. The database migration (V2_1RolePermissionMigration) runs on startup and expands each old (resource, CRUD action) pair into the equivalent new actions.

CRUD → action migration mapping

The table below shows exactly how the migration expands each old CRUD action. Actions not listed for a combination are not granted.

Resource (old)CRUD actionNew resourceNew actions granted
FLOWREADFLOWVIEW, LIST, EXPORT
FLOWCREATEFLOWCREATE, IMPORT
FLOWUPDATEFLOWUPDATE, EXECUTE, DISABLE, ENABLE, VALIDATE
FLOWDELETEFLOWDELETE
EXECUTIONREADEXECUTIONVIEW, LIST, ACCESS_LOGS, ACCESS_OUTPUTS, ACCESS_FILES, EXPORT, FOLLOW
EXECUTIONUPDATEEXECUTIONUPDATE, RESTART, KILL, REPLAY, PAUSE, RESUME, CHANGE_LABELS, UNQUEUE, FORCE_RUN
EXECUTIONDELETEEXECUTIONDELETE
TRIGGERREADTRIGGERVIEW, LIST, EXPORT
TRIGGERUPDATETRIGGERUNLOCK, RESTART, DISABLE, ENABLE, BACKFILL
TRIGGERDELETETRIGGERDELETE
NAMESPACEREADNAMESPACEVIEW, LIST, EXPORT_PLUGIN_DEFAULTS
NAMESPACEUPDATENAMESPACEUPDATE, MANAGE_FILES, IMPORT_PLUGIN_DEFAULTS
NAMESPACECREATENAMESPACECREATE
NAMESPACEDELETENAMESPACEDELETE
APPUPDATEAPPUPDATE, EXECUTE, ACCESS_FILES, ACCESS_LOGS
APPCREATEAPPCREATE
APPDELETEAPPDELETE
USERREADUSERVIEW, LIST
USERUPDATEUSERUPDATE, MANAGE_GROUP_MEMBERSHIP
USERCREATEUSERCREATE
USERDELETEUSERDELETE
GROUPREADGROUPVIEW, LIST
GROUPUPDATEGROUPUPDATE, MANAGE_MEMBERS
GROUPCREATEGROUPCREATE
GROUPDELETEGROUPDELETE
AUDITLOGREADAUDITLOGVIEW, LIST, EXPORT
AUDITLOGCREATE / UPDATE / DELETENot migrated (no equivalent actions)
SETTINGREADSYSTEM_SETTINGS + TENANT_SETTINGSVIEW on each
SETTINGUPDATESYSTEM_SETTINGS + TENANT_SETTINGSUPDATE on each
SETTINGCREATE / DELETENot migrated
AI_COPILOTREADCOPILOTUSE
AI_COPILOTCREATE / UPDATE / DELETENot migrated
All other resourcesREADSame resourceVIEW, LIST
All other resourcesCREATESame resourceCREATE
All other resourcesUPDATESame resourceUPDATE
All other resourcesDELETESame resourceDELETE

kestractl: updating role definitions

The kestractl roles create and kestractl roles update commands use --permission RESOURCE:ACTION[,ACTION] syntax. The action values are now specific names like VIEW, EXECUTE, and ACCESS_LOGS, not CRUD verbs.

Update your kestractl scripts to use the new action names:

# Before
kestractl roles create --name operator \
--permission FLOW:READ,UPDATE \
--permission EXECUTION:READ,UPDATE
# After
kestractl roles create --name operator \
--permission FLOW:VIEW,LIST,EXECUTE,DISABLE,ENABLE \
--permission EXECUTION:VIEW,LIST,RESTART,KILL,ACCESS_LOGS,ACCESS_FILES,FOLLOW

If you use --permissions-file, update your YAML files in the same way:

# Before
FLOW:
- READ
- UPDATE
EXECUTION:
- READ
- UPDATE
# After
FLOW:
- VIEW
- LIST
- EXECUTE
- DISABLE
- ENABLE
EXECUTION:
- VIEW
- LIST
- RESTART
- KILL
- ACCESS_LOGS
- ACCESS_FILES
- FOLLOW

Migration steps

  1. Upgrade to Kestra 2.0 — the database migration runs automatically on startup and expands all existing role permissions.
  2. Review roles that had TEMPLATE or IMPERSONATE permissions — these are dropped and must be reconfigured manually.
  3. Update kestractl scripts and permissions files — replace old CRUD values with the new action names to ensure roles are created with the correct scope.
  4. Verify access with impersonation — use the impersonate feature in the Kestra UI to confirm each role behaves as expected after the upgrade.

Was this page helpful?