For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.
レジストリアクセスを制限する
特定の権限を持つアクセスポリシーを作成し、IdP グループをそれらのポリシーにマッピングして、ユーザーがレジストリで実行できる操作を制御します。
Solo Enterprise for agentregistry では、AccessPolicy リソースを作成して OIDC プロバイダーの JWT グループクレームにマッピングすることで、個々のユーザーまたはグループがレジストリで実行できる操作を制限できます。AccessPolicy がすべてのアクセス制御レイヤーにわたってどのように機能するかの概念的な概要については、アクセス制御についてを参照してください。
始める前に
OIDC プロバイダーをセットアップして、ユーザーがレジストリで認証できるようにします。
Solo Enterprise for agentregistry をインストールし、
arctlCLI をセットアップします。まだ実行していない場合は、Solo Enterprise for agentregistry サーバーをポート 12121 でポートフォワードします。レジストリはデフォルトでは外部に公開されないため、ローカルマシンから到達するにはポートフォワードが必要です。
kubectl -n agentregistry-system port-forward svc/agentregistry-enterprise-server 12121:12121
ステップ 1: Keycloak グループとユーザーを作成する
Keycloak Admin REST API を使用して、developers グループとそのグループに属するユーザーを作成します。
Keycloak Admin REST API の管理者トークンを取得します。
export KEYCLOAK_ADMIN_TOKEN=$(curl -s \ -d "client_id=admin-cli" -d "username=admin" -d "password=admin" \ -d "grant_type=password" \ "${KEYCLOAK_URL}/realms/master/protocol/openid-connect/token" \ | jq -r .access_token)developersグループを作成します。curl -s -X POST \ -H "Authorization: Bearer ${KEYCLOAK_ADMIN_TOKEN}" \ -H "Content-Type: application/json" \ "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/groups" \ -d '{"name": "developers"}'dev-userアカウントを作成し、developersグループに割り当てます。curl -s -X POST \ -H "Authorization: Bearer ${KEYCLOAK_ADMIN_TOKEN}" \ -H "Content-Type: application/json" \ "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/users" \ -d '{ "username": "dev-user", "email": "dev-user@example.com", "firstName": "Dev", "lastName": "User", "enabled": true, "credentials": [{"type": "password", "value": "password", "temporary": false}] }' export DEV_USER_ID=$(curl -s \ -H "Authorization: Bearer ${KEYCLOAK_ADMIN_TOKEN}" \ "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=dev-user" \ | jq -r '.[0].id') export DEVELOPERS_GROUP_ID=$(curl -s \ -H "Authorization: Bearer ${KEYCLOAK_ADMIN_TOKEN}" \ "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/groups?search=developers" \ | jq -r '.[0].id') curl -s -X PUT \ -H "Authorization: Bearer ${KEYCLOAK_ADMIN_TOKEN}" \ "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/users/${DEV_USER_ID}/groups/${DEVELOPERS_GROUP_ID}"developersグループとdev-userが作成され、グループ割り当てが設定されていることを確認します。curl -s \ -H "Authorization: Bearer ${KEYCLOAK_ADMIN_TOKEN}" \ "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/groups" \ | jq '.[].name' curl -s \ -H "Authorization: Bearer ${KEYCLOAK_ADMIN_TOKEN}" \ "${KEYCLOAK_URL}/admin/realms/${KEYCLOAK_REALM}/users?username=dev-user" \ | jq '.[0].username'出力例:
"developers" "dev-user"
ステップ 2: アクセスポリシーを作成する
developers グループのユーザーが実行できる操作を定義する AccessPolicy リソースを作成します。この例では、すべてのエージェントと MCP サーバーへの読み取りアクセスを許可します。
管理者ユーザー(
admin-user/password)として Solo Enterprise for agentregistry にログインします。管理者ユーザーは AccessPolicy を作成する権限を持っています。export OIDC_ISSUER=$KEYCLOAK_ISSUER export OIDC_CLIENT_ID=ar-cli-interactive arctl user loginAccessPolicy を作成します。次の例では、すべてのエージェントと MCP サーバーの一覧表示と表示を許可しますが、公開やデプロイは許可しない、
developersグループ向けの読み取り専用ポリシーを作成します。cat <<EOF | arctl apply -f - apiVersion: ar.dev/v1alpha1 kind: AccessPolicy metadata: name: developers spec: description: "Read-only access to all artifacts" principals: - kind: Role name: developers rules: - actions: - "registry:read" resources: - kind: server name: "*" - kind: agent name: "*" EOF出力例:
✓ AccessPolicy/developers createdポリシーが作成されたことを確認します。
arctl get accesspolicies出力例:
NAME DESCRIPTION developers Read-only access to all artifacts
ステップ 3: 新しいユーザーとしてアクセスを確認する
現在の CLI セッションからログアウトします。
arctl user logoutCLI 出力に表示された URL とコードを使用してブラウザーでデバイス認証を完了します。
dev-userというユーザー名とpasswordというパスワードでログインします。arctl user loginKeycloak が返した JWT を検査して、
developersグループクレームがトークンに含まれていることを確認します。arctl user info --show-tokens \ | jq -r '.access_token | split(".") | .[1] | @base64d | fromjson | {sub, email, Groups}'出力例:
{ "sub": "fbb5e028-4ef7-41de-8a6b-88365c26287d", "email": "dev-user@example.com", "Groups": [ "developers" ] }ユーザーの ID を確認します。CLI 出力で、
developersロールのステータスがconfiguredであることを確認します。この設定は、レジストリコントローラーがdevelopersクレーム値を持つユーザーに対応する AccessPolicy を見つけたことを意味します。arctl user whoami出力例:
FIELD VALUE Subject fbb5e028-... Email dev-user@example.com Issuer http://172.18.0.15:8080/realms/agentregistry Superuser false ROLE STATUS developers configureddev-userがカタログ内のエージェントを一覧表示できることを確認します。arctl get agents出力例:
NAME TAG FRAMEWORK LANGUAGE PROVIDER MODEL myagent latest adk python gemini gemini-2.5-flashdev-userユーザーがエージェントを公開できないことを確認します。arctl apply -f - <<EOF apiVersion: ar.dev/v1alpha1 kind: Agent metadata: name: test-agent spec: description: Test agent language: python framework: adk modelProvider: gemini modelName: gemini-2.5-flash source: image: localhost:5001/myagent:latest EOF出力例:
✗ Agent/test-agent failed: forbidden: forbidden Error: one or more resources failed to applydev-userユーザーがデプロイを作成できないことを確認します。arctl apply -f - <<EOF apiVersion: ar.dev/v1alpha1 kind: Deployment metadata: name: test-agent spec: targetRef: kind: Agent name: myagent tag: "latest" runtimeRef: kind: Runtime name: local EOF想定される出力:
✗ Deployment/test-agent failed: forbidden: forbidden Error: one or more resources failed to apply
アクセスポリシーの例
一般的な権限設定の例を示します。
読み取りとデプロイのみ(公開と削除は不可):
cat <<EOF | arctl apply -f -
apiVersion: ar.dev/v1alpha1
kind: AccessPolicy
metadata:
name: deployers
spec:
principals:
- kind: Role
name: deployers
rules:
- actions:
- "registry:read"
- "registry:deploy"
resources:
- kind: agent
name: "*"
- kind: server
name: "*"
EOF削除を除くフルアクセス:
cat <<EOF | arctl apply -f -
apiVersion: ar.dev/v1alpha1
kind: AccessPolicy
metadata:
name: publishers
spec:
principals:
- kind: Role
name: publishers
rules:
- actions:
- "registry:read"
- "registry:publish"
- "registry:edit"
- "registry:deploy"
resources:
- kind: agent
name: "*"
- kind: server
name: "*"
EOF削除を含むフルアクセス:
cat <<EOF | arctl apply -f -
apiVersion: ar.dev/v1alpha1
kind: AccessPolicy
metadata:
name: admins
spec:
principals:
- kind: Role
name: admins
rules:
- actions:
- "registry:*"
resources:
- kind: agent
name: "*"
- kind: server
name: "*"
EOF特定のエージェントへのスコープ限定アクセス: チームが特定のエージェントを管理し、そのエージェントへの完全な公開権限が必要だが、他のすべてへは読み取りアクセスのみが必要な場合に使用します。
cat <<EOF | arctl apply -f -
apiVersion: ar.dev/v1alpha1
kind: AccessPolicy
metadata:
name: myagent-owners
spec:
principals:
- kind: Role
name: myagent-team
rules:
- actions:
- "registry:read"
- "registry:publish"
- "registry:edit"
- "registry:deploy"
resources:
- kind: agent
name: myagent
- actions:
- "registry:read"
resources:
- kind: agent
name: "*"
- kind: server
name: "*"
EOFカタログへの読み取りアクセスとチャット呼び出し: UI からカタログを閲覧してエージェントとチャットする必要があるが、公開やデプロイは不要なユーザー向けに使用します。
cat <<EOF | arctl apply -f -
apiVersion: ar.dev/v1alpha1
kind: AccessPolicy
metadata:
name: catalog-viewers
spec:
principals:
- kind: Role
name: viewers
rules:
- actions:
- "registry:read"
resources:
- kind: agent
name: "*"
- kind: server
name: "*"
- actions:
- "runtime:*"
resources:
- kind: agent
name: "*"
EOF