Rack Gateway uses a structured permission system based on scopes, resources, and actions.
Every permission follows a three-part format:
{scope}:{resource}:{action}
Examples:
convox:app:list - List Convox applications
convox:process:exec - Execute commands in containers
gateway:user:create - Create gateway users
gateway:deploy_approval_request:read - View deploy approval requests
Permissions are organized into four scopes:
Scope Description convoxOperations passed through to the Convox API gatewayOperations implemented within the gateway itself authAuthentication-related operations securitySecurity-specific operations
Resources that map to Convox API operations:
Resource Description appApplications buildDocker image builds deployDeployment operations envEnvironment variables instanceEC2/container instances logApplication logs objectBuild artifacts and objects processRunning processes/containers rackRack configuration releaseApplication releases secretSecret env var values (convox:secret:read reveals them)
The gateway forwards only the rack API routes it has a permission for (see
Rack API Routes ). Requests to any other route are refused with 404 and logged as denied,
whatever the caller’s role, so Convox’s certificates, registries, resources, instance keyroll and terminate, and
canceling an app update aren’t available through the gateway (the rack-gateway CLI has no commands for them).
Resources specific to the gateway:
Resource Description api_tokenAPI tokens for automation audit_logThe gateway audit log deploy_approval_requestDeploy approval requests integrationThird-party integrations jobBackground jobs settingA single gateway or app setting setting_groupA group of settings saved together (one settings form) userGateway users
Resource Description secretsecurity:secret:update refreshes the pinned rack TLS certificate
Authentication and MFA resources:
Resource Description authAuthentication sessions mfa_backup_codesMFA recovery codes mfa_methodMFA methods (TOTP, WebAuthn) mfa_preferencesPreferred MFA method mfa_verificationMFA verification challenges trusted_deviceTrusted device tokens
Action Description approveApprove a request createCreate a new resource deleteDelete a resource deploy_with_approvalDeploy requiring prior approval execExecute commands generateGenerate credentials/codes importImport external resources listList resources manageGeneral management operations promotePromote a release readRead/view a resource restartRestart a service run_privilegedStart a process with privileged options setSet a value set_protectedChange or remove a protected value startStart a resource stopStop a resource terminateTerminate a resource unsetRemove a value updateUpdate a resource update_nameUpdate only the name
Permission Description Roles convox:app:listList all applications viewer, ops, deployer, cicd, admin convox:app:readView application details viewer, ops, deployer, cicd, admin convox:app:createCreate new application admin convox:app:updateUpdate application settings deployer, admin convox:app:deleteDelete application admin convox:app:restartRestart application ops, deployer, admin
Permission Description Roles convox:build:listList builds viewer, ops, deployer, admin convox:build:readView build details viewer, ops, deployer, admin convox:build:createCreate new build deployer, admin convox:build:updateUpdate a build admin convox:build:importImport an exported build (its manifest and images aren’t checked) admin
Permission Description Roles convox:release:listList releases ops, deployer, admin convox:release:readView release details deployer, admin convox:release:createCreate release deployer, admin convox:release:promotePromote release to production deployer, admin
Permission Description Roles convox:env:readView environment variables ops, deployer, admin convox:env:setSet environment variables deployer, admin convox:env:unsetRemove environment variables deployer, admin convox:env:set_protectedChange or remove an app’s protected environment variables with --allow-protected admin
Note
set_protected is checked in addition to release:create when an env set or env unset names a protected key with --allow-protected. The request must also carry MFA, which the gateway verifies even within the step-up window. API tokens can never change protected env vars, whatever their permissions. See Protected env vars .
Permission Description Roles convox:process:listList running processes viewer, ops, deployer, cicd, admin convox:process:readView process details viewer, ops, deployer, cicd, admin convox:process:startStart a process ops, deployer, admin convox:process:execExecute command in container ops, deployer, admin convox:process:terminateTerminate a process ops, deployer, admin convox:process:run_privilegedStart a process with options that escape the release (Image, Volumes, Privileged, node placement) admin
Permission Description Roles convox:instance:listList instances viewer, ops, deployer, cicd, admin convox:instance:readView instance details viewer, ops, deployer, cicd, admin convox:rack:readView rack configuration viewer, ops, deployer, cicd, admin convox:rack:updateUpdate the rack, change its parameters or scale it admin convox:log:readStream logs viewer, ops, deployer, admin convox:object:createUpload build artifacts deployer, admin
Permission Description Roles gateway:user:listView the team directory (names, emails, roles, locked status) viewer, ops, deployer, admin gateway:user:readView any user’s details, sessions, lock reasons and MFA preferences admin gateway:user:createCreate new user admin gateway:user:updateChange a user’s roles, lock or unlock them, revoke their sessions admin gateway:user:update_nameChange a user’s display name admin gateway:user:deleteDelete user admin gateway:audit_log:readRead and export every user’s audit log admin
Note
Every user may view their own details, list and revoke their own sessions, and read their own audit log without these permissions (revoking a session still needs MFA on that request). API tokens can’t use these endpoints at all.
Permission Description Roles gateway:api_token:readList and view your own tokens viewer, ops, deployer, admin gateway:api_token:createCreate tokens for yourself deployer, admin gateway:api_token:updateRename or change permissions of your own tokens deployer, admin gateway:api_token:deleteDelete your own tokens deployer, admin gateway:api_token:manageSee and change every user’s tokens, and create tokens for other users admin
Permission Description Roles gateway:deploy_approval_request:createCreate approval request deployer, cicd, admin gateway:deploy_approval_request:readView approval status deployer, cicd, admin gateway:deploy_approval_request:listList every request and its audit trail admin gateway:deploy_approval_request:approveApprove/reject request admin convox:deploy:deploy_with_approvalExecute approved deploy (API tokens) deployer, cicd, admin
Permission Description Roles gateway:setting:{key}Modify specific setting admin gateway:setting_group:{group}Modify a setting group admin
Settings are controlled by key or group. See Settings for available keys.
Permission Description Roles gateway:integration:readView the Slack integration and list its channels admin gateway:integration:createConnect Slack admin gateway:integration:updateChange Slack channels and alerts, send a Slack test message or a Sentry test event admin gateway:integration:deleteDisconnect Slack admin
Permission Description Roles gateway:job:listList background jobs admin gateway:job:readView a background job admin gateway:job:updateRetry a job admin gateway:job:deleteDelete a job admin
These permissions control MFA and authentication operations:
Permission Description Notes auth:mfa_method:createEnroll new MFA method Self-service auth:mfa_method:updateRename an MFA method Self-service auth:mfa_preferences:updateChoose the preferred MFA method Self-service auth:mfa_method:deleteRemove MFA method Self-service auth:mfa_backup_codes:generateGenerate backup codes Self-service auth:mfa_verification:createInitiate MFA challenge System auth:trusted_device:createTrust a device Self-service auth:trusted_device:deleteRemove trusted device Self-service
Permission Description Roles security:secret:updateRefresh the pinned rack TLS certificate admin
Each permission also says how recently the caller must have verified MFA. A request needs the strictest level of
any permission it uses:
Level What the request needs None A signed-in session Step-up An MFA verification within the step-up window (mfa_step_up_window_minutes, 10 minutes by default). The CLI asks once per command Step-up once enrolled Nothing for a user’s first MFA method; step-up once they have one Always An MFA proof verified on that request, even within the step-up window
Reads and lists need none. Any other permission needs always unless it’s listed below:
Level Permissions None convox:object:create, gateway:deploy_approval_request:create, auth:mfa_verification:create, and the settings ci_provider, circleci_approval_job_name, default_branch, github_post_pr_comment, vcs_provider, vcs_repoStep-up once enrolled auth:mfa_method:createStep-up convox:app:create, convox:app:update, convox:app:restart, convox:build:create, convox:build:update, convox:release:create, convox:release:promote, convox:env:set, convox:env:unset, convox:process:start, convox:process:exec, convox:process:stop, convox:process:terminate, convox:rack:update, convox:secret:read, gateway:user:update_name, gateway:integration:create, gateway:integration:update, gateway:integration:delete, gateway:job:update, gateway:job:delete, the vcs_and_ci_defaults and session_configuration setting groups, the settings allow_deploy_from_default_branch, approved_deploy_commands, audit_visible_env_vars, circleci_auto_approve_on_approval, service_image_patterns, verify_git_commit_mode, and the auth permissions other than those above and auth:mfa_method:delete
So these always need MFA on the request itself: deleting apps, importing builds, creating, changing, locking and
deleting users, revoking sessions, creating, changing and deleting API tokens, approving, rejecting and extending deploy approvals, removing an MFA method, refreshing the rack TLS certificate,
changing protected env vars, privileged process options, and the settings that protect secrets or loosen deploy
checks (mfa_configuration, allow_destructive_actions, deploy_approvals, vcs_ci_deploy,
protected_env_vars, secret_env_vars, github_verification, require_pr_for_branch).
API tokens can’t verify MFA, so MFA levels don’t apply to them; what a token may do is limited by its permissions and
its owner’s role. The levels are defined in internal/gateway/rbac/mfa_requirements.go.
Admin role uses wildcard permissions:
Permission Matches convox:*:*All Convox operations gateway:*:*All Gateway operations security:*:*Security operations (e.g. refreshing the rack TLS certificate)
Wildcards match any value in that position:
convox:app:* would match all app actions
convox:*:read would match all read actions
When a request arrives, the gateway:
Identifies the user from session or API token
Maps the endpoint to a permission (e.g., DELETE /apps/myapp → convox:app:delete). Every gateway endpoint under /api/v1 is declared in a route policy table with the permissions it needs; an endpoint that isn’t in the table is refused.
Checks the caller’s current roles against the required permission. Roles are read from the database on every request, so a demotion takes effect immediately. An API token must hold the permission itself and its owner’s current role must allow it.
Logs the decision to audit trail
Common API endpoints and their required permissions:
Endpoint Method Permission /api/v1/rack-proxy/appsGET convox:app:list/api/v1/rack-proxy/apps/:nameGET convox:app:read/api/v1/rack-proxy/apps/:nameDELETE convox:app:delete/api/v1/rack-proxy/apps/:name/buildsPOST convox:build:create/api/v1/rack-proxy/apps/:name/builds/importPOST convox:build:import/api/v1/rack-proxy/apps/:name/processesGET convox:process:list/api/v1/rack-proxy/apps/:name/processes/:id/execGET (WebSocket) convox:process:exec/api/v1/apps/:app/envGET convox:env:read/api/v1/apps/:app/envPUT convox:env:set/api/v1/rack-proxy/apps/:name/releases/:id/promotePOST convox:release:promote
These are the only rack API routes the gateway forwards (under /api/v1/rack-proxy), from
internal/gateway/rbac/http_routes.go:
Route Permission GET /apps, GET /apps/{name}, GET /apps/{app}/services, GET /apps/{app}/budget, GET /apps/{app}/budget/shutdown-stateconvox:app:list, convox:app:readPOST /appsconvox:app:createPUT /apps/{name}, PUT /apps/{app}/services/{name}convox:app:updatePOST /apps/{app}/restart, POST /apps/{app}/services/{service}/restartconvox:app:restartDELETE /apps/{name}convox:app:deleteGET /apps/{app}/builds, GET /apps/{app}/builds/{id}, GET /apps/{app}/builds/{id}.tgzconvox:build:list, convox:build:readPOST /apps/{app}/builds, PUT /apps/{app}/builds/{id}convox:build:create, convox:build:updatePOST /apps/{app}/builds/importconvox:build:importPOST /apps/{app}/objects/tmp/{name}convox:object:createGET /apps/{app}/releases, GET /apps/{app}/releases/{id}convox:release:list, convox:release:readPOST /apps/{app}/releasesconvox:release:createPOST /apps/{app}/releases/{id}/promoteconvox:release:promoteGET /apps/{app}/processes, GET /apps/{app}/processes/{pid}convox:process:list, convox:process:readPOST /apps/{app}/services/{service}/processesconvox:process:startDELETE /apps/{app}/processes/{pid}convox:process:terminateGET /apps/{app}/processes/{pid}/exec (WebSocket)convox:process:execApp, process, build and rack logs (.../logs, HTTP or WebSocket) convox:log:readGET /instances, GET /instances/{id}convox:instance:list, convox:instance:readGET /system, /system/capacity, /system/metrics, /system/processes, /system/releasesconvox:rack:readPUT /systemconvox:rack:update