Skip to content
Latest (currently 2026.7.0) has the newest features, bug fixes, and CVE patches of Solo Enterprise for agentregistry.

For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.

About access control

Page as Markdown

Learn how AccessPolicy controls access at every layer — from registry operations and chat invocation to agent-to-agent calls at runtime.

Solo Enterprise for agentregistry uses a multi-layer approach to secure access to the registry and its AI artifacts, and to control the actions that registry users and deployed agents can perform.

Access control layers

Access is enforced at three layers, each building on the previous one.

Layer 1: Authentication

Solo Enterprise for agentregistry relies on an external OIDC-compliant identity provider (IdP), such as Keycloak, Okta, or Auth0, to authenticate users with the registry. Every request to the registry must carry a valid JWT that is issued and signed by the IdP. The registry validates the token against the IdP’s JWKS public keys on every request. A missing or invalid token is rejected with 401 Unauthorized before any policy is evaluated.

The OIDC configuration uses four separate clients, each serving a different part of the system.

ClientTypePurpose
ar-backendConfidentialUsed by the registry server to validate access tokens. Every token issued to ar-cli-interactive, ar-cli-password, or ar-ui must include ar-backend in its aud claim, or the request is rejected.
ar-cli-interactivePublicUsed by the arctl CLI for interactive logins. Authenticates users via the device authorization grant flow (RFC 8628), which prompts the user to open a URL in a browser.
ar-cli-passwordPublicUsed by the arctl CLI for scripted user authentication in CI/CD pipelines. Authenticates via the password credentials grant using a username and password.
ar-uiPublicUsed by the browser-based registry UI. Authenticates users via the authorization code flow with PKCE.

For example OIDC setups, see Set up an OIDC provider.

Layer 2: User authorization

After a token is successfully validated, the registry extracts the role claim from the JWT to determine a user’s permissions. The claim that you want to use for the role can be configured by one of the following Helm values or environment variables:

Helm valueEnv variableDefaultDescription
oidc.roleClaimRBAC_ROLE_CLAIMGroupsA dot path into the JWT claims to extract the role information. For example, you can use a format, such as roles for root-level claims or realm.roles for nested claims. If not set, the role is extracted from the Groups root-level claim. This setting is ignored when oidc.roleMapper is set.
oidc.roleMapperRBAC_ROLE_MAPPER_CEL_EXPRA CEL expression to extract roles from the JWT claims map. Use this setting for advanced scenarios where you cannot extract the role information with the dot-path approach.

After the role information is extracted from the claim, Solo Enterprise for agentregistry validates the type of user that tries to log into the registry. Solo Enterprise for agentregistry differentiates between the following user types:

User typeHelm valueEnvironment variableDescription
Superuseroidc.superuserRole (default: admin)RBAC_ROLE_CLAIMUsers where the role matches this value bypass all policy checks and have full access to the registry. No AccessPolicy is required. By default, the super user role is set to admin meaning that if the role information that is extracted from the JWT matches admin, the user is considered a super user and granted full access to the registry.
All other usersN/AN/ANo access by default. You must create an AccessPolicy that grants the role the specific actions it needs. The AccessPolicy’s spec.principals[].name field must match the extracted role to get applied. Without a matching AccessPolicy, every request from that role is denied. For example, you can create separate AccessPolicy resources for a reader and writer role to the registry.

The following example shows an AccessPolicy that grants a developers role read access to all agents and runtimes, and allows those users to invoke the myagent agent through the chat UI.

apiVersion: ar.dev/v1alpha1
kind: AccessPolicy
metadata:
  name: developers
spec:
  description: "Access policy for the developers group"
  principals:
    - kind: Role
      name: developers       # must match the OIDC group claim value
  rules:
    - actions:
        - "registry:read"    # controls catalog access
      resources:
        - kind: agent
          name: "*"
        - kind: runtime
          name: "*"
    - actions:
        - "runtime:*"        # controls chat invocation
      resources:
        - kind: agent
          name: myagent      # restrict chat to a specific agent
FieldDescription
spec.principals[].kindSet to Role for user-scoped policies. The registry matches the policy to requests whose JWT contains a claim value that equals spec.principals[].name.
spec.principals[].nameMust match the OIDC group claim value that is configured by the oidc.roleClaim Helm value (default: Groups). For example, set to developers to match this policy to users with the Groups: ["developers"] claim in their JWT.
spec.rules[].actionsThe operations the user is allowed to perform. Use registry:<verb> to control the type of catalog access that you want to grant. Supported verbs: read, publish, edit, deploy, delete, admin, *. Use runtime:* or runtime:invoke to allow the user to invoke an agent through the chat UI.
spec.rules[].resources[].kindThe type of registry artifact the rule applies to. Supported kinds: agent, server, runtime.
spec.rules[].resources[].nameThe name of the specific artifact the rule applies to. Use "*" to apply the rule to all instances of that kind.

Tip

You can add an additional review gate for non-admin users by enabling artifact approval mode. When enabled, any create, update, or delete operation on an AI artifact, such as an agent or MCP server, is staged instead of applied immediately. An admin user must approve the request before the change becomes visible in the catalog. For more information, see Artifact approval.

Layer 3: Agent runtime authorization

You can use the same AccessPolicy resource to control the actions that deployed agents can perform at runtime, such as invoking other agents or calling MCP tools. To scope a policy to an agent, you must set the spec.principals[].kind field to Deployment instead of Role and point it to agent deployment.

Depending on the runtime that you deployed the agent to, different prerequisites are required to enforce AccessPolicies during runtime.

RuntimePrerequisites
AWS Bedrock AgentCoreYou must install Solo Enterprise for agentregistry and connect to your AWS runtime by using AWS IRSA credentials or pod identity. When you apply an AccessPolicy, a gateway is automatically deployed into an AWS EC2 instance and configured with the Solo Enterprise for agentgateway binary. When the agent invokes MCP tools, traffic is sent through the gateway to determine the agent’s runtime permissions.
Solo Enterprise for kagentYou must install Solo Enterprise for Istio and Solo Enterprise for agentgateway alongside Solo Enterprise for agentregistry to enforce AccessPolicies for agents. The AccessPolicy is translated into a kagent AccessPolicy and further translated into an agentgateway waypoint configuration via xDS. Every MCP tool call and agent-to-agent request passes through the waypoint to enforce your AccessPolicy before reaching the target.

The following AccessPolicy allows the myagent agent deployment to invoke the k8s-agent agent during runtime and to call the get_object tool of the runtime-mcp MCP server. Invoking other agents or calling other MCP server tools is denied.

apiVersion: ar.dev/v1alpha1
kind: AccessPolicy
metadata:
  name: k8s-agent-policy
spec:
  description: "Runtime access policy for k8s-agent"
  principals:
    - kind: Deployment
      name: myagent  
  rules:
    - actions:
        - "runtime:invoke" 
      resources:
        - kind: agent
          name: k8s-agent
        - kind: server
          name: runtime-mcp
          subresources:
            - tool/get_object
FieldDescription
spec.principals[].kindSet to Deployment and point to the agent deployment that you want to configure permissions for.
spec.principals[].nameMust match the name of the agent deployment in the registry catalog.
spec.rules[].actionsThe operations the agent is allowed to perform. Use runtime:invoke to allow the agent to call the target resource.
spec.rules[].resources[].kindThe type of artifact the rule applies to. Supported kinds: agent, server.
spec.rules[].resources[].nameThe name of the specific artifact the rule applies to. Use "*" to apply the rule to all instances of that kind.
spec.rules[].resources[].subresourcesApplies to server resources only. Lists specific MCP tools the agent is allowed to call, for example tool/get_object. Omit to allow all tools on the server.

For an example for how to set up runtime authorization, see Agent runtime authorization.

How the layers work together

    sequenceDiagram
    participant User as User
    participant Agent as Agent
    participant IdP as IdP (Keycloak / Okta)
    participant AR as agentregistry
    participant GW as Gateway
    participant Target as MCP server / Agent

    Note over User,AR: Layer 1 — Authentication
    User->>IdP: Login (device flow, password credentials (CI/CD), or PKCE)
    IdP-->>User: Signed JWT (Groups: ["developers"], aud: ar-backend)
    User->>AR: API request (Bearer token)
    AR->>IdP: Fetch JWKS (public keys)
    IdP-->>AR: Public keys
    AR->>AR: Validate token signature, verify aud = ar-backend

    Note over AR: Layer 2 — User authorization (kind: Role)
    AR->>AR: Read Groups claim → match AccessPolicy principal
    AR->>AR: Evaluate registry:* / runtime:* rules
    AR-->>User: Response (catalog or chat)

    Note over Agent,Target: Layer 3 — Agent runtime authorization (kind: Agent)
    Agent->>GW: MCP tool call or agent invoke
    GW->>GW: Match calling agent → AccessPolicy principal
    GW->>GW: Evaluate runtime:invoke rule
    alt Allowed
        GW->>Target: Forward request
    else Denied
        GW-->>Agent: 403 Forbidden
    end
  

Next steps