34 lines
1.7 KiB
MySQL
34 lines
1.7 KiB
MySQL
|
|
-- 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)
|
||
|
|
);
|