Skip to main content

Security reference

The access rules and safety settings of the server. Setting defaults are in the Configuration reference; how to apply them is in Secure the server; the reasoning is in Security model.

Default posture

API keys

One key list guards REST (/api/**), MCP (/mcp) and /actuator/** (except /actuator/health). A client sends the key in Authorization: Bearer <key> or X-API-Key: <key>.

Responses

These refusals have no JSON body.

Roles

A key limited to sessions reaches only /api/sessions/{session}/..., /api/workflow/{session}/... and /api/executions/{executionId}/... of its own sessions. Every other path is refused with 403, including the global event stream, the worker list and the audit list; it never reaches /actuator/**. POST /api/inputs/token-answer needs no key: it takes a one-time token made for one request and one tier, and answers 403 for a replayed, changed, expired or unknown token and 429 once an address has had 30 refused calls in a minute (or one request 10).

MCP tool roles

Each tools/call is checked against the key’s role; a tool not in the role table needs ADMIN. A session-limited key must pass a sessionId it may reach, except for the tools that name no session (list_plugins, list_ai_backends, get_plugin_details, get_session_creation_instructions, get_plugin_creation_guide, list_supervisor_engines, get_supervisor_engine, get_supervisor_contract, list_supervisor_presets, whoami). For a key that is not an unrestricted ADMIN, an unparsable POST body is refused with 403 and one above 1 MiB with 413. The role of each tool is listed in the MCP tools reference.

Host and Origin checks

Active only while no key of any kind is configured. A refused request gets 403 with no body.

Response headers

Audit actors

Control commands are recorded in the execution log with their sender; read them with GET /api/control/audit (limit 1 to 500, default 100; executionId). Only control commands are audited, not ordinary reads and starts.

Input request authorisation

Agent credentials

A supervisor of type http is operated with its own credential, made by POST /api/supervisors/{id}/credential (ADMIN), shown once and kept as a SHA-256 hash. It works only on /api/agent/v1; no person’s key works there, and its actor kind is SUPERVISOR. GET on the same path shows issue time and last use, never the secret; DELETE, or disabling the supervisor, cuts it at once. Limits are yukta.agent.* in the Configuration reference.

Process execution

The allow-list names an executable, not what it does with its arguments; it is not a sandbox. A supervisor of engine type process also needs its executable in the list and runs with an empty environment, reading one output line of at most 64 KB.

Outbound hosts

Entries are host names or IP addresses (case-insensitive) or *.example.com (subdomains, not example.com). A call must pass the plugin’s list and every applicable egress list; an empty list does not restrict. The host is read from the URL, so https://good.com@evil.com/ counts as evil.com; names are not resolved. Link-local and metadata addresses (169.254.0.0/16, fe80::/10, metadata.google.internal, and their numeric spellings) are refused unless listed by name.

Model and tool call filters

Applied to every LLM_CALL and MCP_TOOL_CALL node; a refused call fails as bad input and is not retried. A pattern containing a comma (a{1,3}) must be an indexed entry: yukta.llm.deny-input-patterns[0]=....

Secrets and variables

Limits

Expressions and scripts are written by trusted authors: whoever can save a definition (ADMIN) can already run code on the server.

Workers

Workers connect over plain TCP unless TLS is configured; both sides refuse that mode off the local machine unless yukta.workers.allow-insecure=true. A worker runs only the plugin types in its own yukta.workers.plugin-types.