Files
obsidian-sympozium/04-Zarządzanie-Agentami/Skill Sidecars i auto-RBAC.md
2026-03-25 00:05:57 +01:00

4.1 KiB

Skill Sidecars i auto-RBAC

#sympozium #agenty #skills #rbac #security

Koncepcja

Skill Sidecars to najważniejsza innowacja bezpieczeństwa Sympozium. Zamiast dawać agentowi bezpośredni dostęp do kubectl/helm/git, narzędzia uruchamiane są w oddzielnym kontenerze z własnym, efemerycznym RBAC.

Dlaczego to ważne?

Problem: In-process tool execution

W frameworkach jak kagent/LangChain, narzędzia działają w tym samym procesie co agent:

Agent (z credentials) → tool call → kubectl (z credentials agenta)

Jeśli LLM zostanie "przekonany" do złośliwego tool call, ma pełne uprawnienia procesu.

Rozwiązanie: Sidecar isolation

Agent (BEZ credentials) → /ipc/tools/*.json → IPC Bridge → NATS
    → Skill Sidecar (z WŁASNYMI, scoped credentials) → kubectl

Agent nigdy nie posiada credentials do K8s API. Tylko sidecar je ma, i to z least-privilege RBAC.

Mechanizm

1. Deklaracja RBAC w SkillPack

# SkillPack CRD
spec:
  sidecar:
    rbac:                    # Namespace-scoped
      - apiGroups: ["", "apps"]
        resources: ["pods", "deployments"]
        verbs: ["get", "list", "watch"]
    clusterRBAC:             # Cluster-scoped
      - apiGroups: [""]
        resources: ["nodes"]
        verbs: ["get", "list"]

2. Auto-provisioning przy starcie AgentRun

AgentRun Pending:
    ↓
Controller czyta SkillPack RBAC declarations
    ↓
Tworzy:
  ├── ServiceAccount: sympozium-agent (w namespace runu)
  ├── Role: agentrun-<name>-<skill>
  │   └── rules: [z SkillPack rbac]
  ├── RoleBinding: agentrun-<name>-<skill>
  │   └── roleRef → Role, subject → ServiceAccount
  ├── ClusterRole: agentrun-<name>-<skill>
  │   └── rules: [z SkillPack clusterRBAC]
  └── ClusterRoleBinding: agentrun-<name>-<skill>
      └── roleRef → ClusterRole, subject → ServiceAccount

3. Garbage collection po zakończeniu

AgentRun Succeeded/Failed:
    ↓
Namespace RBAC:
  └── Automatyczne via ownerReference → AgentRun
      (K8s GC czyści gdy AgentRun usunięty)
    ↓
Cluster RBAC:
  └── Controller szuka po labelach:
      sympozium.ai/agentrun: <name>
      → Delete ClusterRole
      → Delete ClusterRoleBinding

Lifecycle RBAC

AgentRun created
  ↓
[RBAC created] ← credentials istnieją
  ↓
Agent pod running - sidecar używa credentials
  ↓
AgentRun completed
  ↓
[RBAC deleted] ← credentials nie istnieją

Czas życia credentials = czas życia AgentRun - to odpowiednik temporary IAM session credentials w AWS.

Secret mirroring

Jeśli SkillPack referencjonuje Secret (np. GH_TOKEN):

Secret w sympozium-system → Kopia w namespace AgentRun
    → Montowany w sidecarze pod /secrets/<name>/
    → Usuwany po zakończeniu

Parametryzacja

Ten sam SkillPack może być konfigurowany inaczej per instancja:

# Instance A
skills:
  - skillPackRef: github-gitops
    params:
      REPO: team-a/repo-a

# Instance B
skills:
  - skillPackRef: github-gitops
    params:
      REPO: team-b/repo-b

Params → env vars SKILL_REPO w sidecarze.

Architektura bezpieczeństwa

┌─────────────────────────────────┐
│          Agent Pod               │
│                                  │
│  ┌──────────┐  ┌──────────────┐ │
│  │  Agent    │  │ Skill Sidecar│ │
│  │          │  │              │ │
│  │ BEZ K8s  │  │ Z RBAC:     │ │
│  │ credentials│ │ - Role      │ │
│  │          │  │ - Binding   │ │
│  │ /ipc →   │  │ - SA token  │ │
│  └──────────┘  └──────────────┘ │
│       │              ↑           │
│       └──── IPC ─────┘           │
└─────────────────────────────────┘

Powiązane: Efemeryczny RBAC per-run | SkillPack | Model bezpieczeństwa Defence-in-Depth