ProofedMesh/db/trust/migrations/0002_agents.up.sql

34 lines
1.7 KiB
MySQL
Raw Permalink Normal View History

-- Migration: 0002_agents
-- Agent Registry (Identitäten) gemäß docs/architecture/v1.1.md §4.4.
--
-- Phase 1 nutzt diese Tabelle rein lesend (SELECT) aus Signing Service und
-- Verification Service, um Pocket-ID-Client-IDs und K8s-ServiceAccount-Paare
-- auf stabile agent_ids zu mappen. Eine HTTP-API-Schale folgt in Phase 2.
--
-- Design-Entscheidungen:
-- * agent_id ist ein stabiler, lesbarer Slug (`agent-<rolle>`), kein UUID.
-- Er taucht in Attestations (`actor`, `issuer`), DSSE-key_ids,
-- Policy-Dateien und Audit-Logs auf — Lesbarkeit zählt.
-- * (k8s_namespace, k8s_service_account) ist zusätzlich UNIQUE: die
-- doppelte Identitätsprüfung im Signing Service (Pocket-ID + K8s
-- TokenReview) MUSS auf genau einen Agenten mappen.
-- * allowed_actions ist NOT NULL, darf aber eine leere Liste sein; die
-- effektive Autorisierung macht OPA im Signing / Verification Service.
CREATE TABLE IF NOT EXISTS agents (
agent_id TEXT PRIMARY KEY
CHECK (agent_id ~ '^[a-z0-9][a-z0-9-]{0,126}[a-z0-9]$'),
pocket_id_client TEXT UNIQUE NOT NULL
CHECK (length(pocket_id_client) BETWEEN 1 AND 256),
k8s_namespace TEXT NOT NULL
CHECK (k8s_namespace ~ '^[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$'),
k8s_service_account TEXT NOT NULL
CHECK (k8s_service_account ~ '^[a-z0-9][a-z0-9.-]{0,251}[a-z0-9]$'),
display_name TEXT NOT NULL
CHECK (length(display_name) BETWEEN 1 AND 200),
allowed_actions TEXT[] NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
CONSTRAINT agents_k8s_identity_unique
UNIQUE (k8s_namespace, k8s_service_account)
);