コンテンツにスキップ
これは最新の機能を備えた最新リリースですが、長期サポートは提供されません。サポートを継続するには、新しいリリースごとにアップグレードするか、四半期ごとの安定版リリースをご利用ください。

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

レジストリアクセスを制限する

Page as Markdown

特定の権限を持つアクセスポリシーを作成し、IdP グループをそれらのポリシーにマッピングして、ユーザーがレジストリで実行できる操作を制御します。

Solo Enterprise for agentregistry では、AccessPolicy リソースを作成して OIDC プロバイダーの JWT グループクレームにマッピングすることで、個々のユーザーまたはグループがレジストリで実行できる操作を制限できます。AccessPolicy がすべてのアクセス制御レイヤーにわたってどのように機能するかの概念的な概要については、アクセス制御についてを参照してください。

始める前に

  1. OIDC プロバイダーをセットアップして、ユーザーがレジストリで認証できるようにします。

  2. Solo Enterprise for agentregistry をインストールし、arctl CLI をセットアップします。

  3. まだ実行していない場合は、Solo Enterprise for agentregistry サーバーをポート 12121 でポートフォワードします。レジストリはデフォルトでは外部に公開されないため、ローカルマシンから到達するにはポートフォワードが必要です。

    kubectl -n agentregistry-system port-forward svc/agentregistry-enterprise-server 12121:12121
  1. AI アーティファクトのカタログを構築します

ステップ 1: Keycloak グループとユーザーを作成する

Keycloak Admin REST API を使用して、developers グループとそのグループに属するユーザーを作成します。

  1. 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)
  2. 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"}'
  3. 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}"
  4. 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 サーバーへの読み取りアクセスを許可します。

  1. 管理者ユーザー(admin-user/password)として Solo Enterprise for agentregistry にログインします。管理者ユーザーは AccessPolicy を作成する権限を持っています。

    export OIDC_ISSUER=$KEYCLOAK_ISSUER
    export OIDC_CLIENT_ID=ar-cli-interactive
    arctl user login
  2. AccessPolicy を作成します。次の例では、すべてのエージェントと 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
    
  3. ポリシーが作成されたことを確認します。

    arctl get accesspolicies

    出力例:

    NAME         DESCRIPTION
    developers   Read-only access to all artifacts
    

ステップ 3: 新しいユーザーとしてアクセスを確認する

  1. 現在の CLI セッションからログアウトします。

    arctl user logout
  2. CLI 出力に表示された URL とコードを使用してブラウザーでデバイス認証を完了します。dev-user というユーザー名と password というパスワードでログインします。

    arctl user login
  3. Keycloak が返した 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"
      ]
    }
    
  4. ユーザーの 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   configured
    
  5. dev-user がカタログ内のエージェントを一覧表示できることを確認します。

    arctl get agents

    出力例:

    NAME      TAG      FRAMEWORK   LANGUAGE   PROVIDER   MODEL
    myagent   latest   adk         python     gemini     gemini-2.5-flash
    
  6. dev-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 apply
    
  7. dev-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