Stand: 6. April 2026
Version: v1.3.0
Kategorie: 🔒 Security
- Aktivierung & Laden
- Schema (MVP)
- Action-Mapping (Server)
- Metriken
- Start-Policies (Baseline)
- Tokens (Beispiel)
- Apache Ranger Integration ✅ Implementiert
Die Policy-Engine ergänzt die Token/Scope-Authorisierung um feingranulare Prüfungen auf Basis von Subjekt (Benutzer), Aktion, Ressourcenpfad und optionalen Bedingungen (z. B. IP-Präfixe).
- Policies können als YAML oder JSON hinterlegt werden.
- Bevorzugte Dateien:
config/policies.yamloderconfig/policies.yml - Fallback:
config/policies.json
- Bevorzugte Dateien:
- Der Server lädt diese Datei beim Start automatisch (optional). Existiert keine Datei, gilt bis zum Setzen von Policies: Default-Allow.
- Wenn Policies vorhanden sind und keine Policy passt, wird der Zugriff per Default-Deny blockiert (Secure-by-Default).
Hinweis: Hot-Reload per API folgt in einer späteren Version. Bis dahin: Datei anpassen und Server neu starten.
id(string): Eindeutige Policy-IDname(string): Beschreibungsubjects(array): Benutzer-IDs oder"*"(Wildcard)actions(set): z. B.read,write,delete,query,config.read,metrics.read,cdc.read,cdc.admin,vector.search,vector.write,"*"resources(array): Pfadpräfixe, z. B."/entities/","/vector/search","/"(alles)effect("allow" | "deny"): Effekt der Policyallowed_ip_prefixes(optional array): Wenn gesetzt, muss die Client-IP (ausX-Forwarded-ForoderX-Real-IP) mit mindestens einem Präfix übereinstimmen
Beispiel (YAML):
- id: hr-allow-internal
name: HR nur im Intranet zulassen
subjects: ["*"]
actions: [read, write, delete]
resources: ["/entities/hr:"]
allowed_ip_prefixes: ["10.", "192.168.", "172.16.", "172.17.", "172.18."]
effect: allowBeispiel (JSON):
{
"id": "hr-allow-internal",
"name": "HR nur im Intranet zulassen",
"subjects": ["*"],
"actions": ["read", "write", "delete"],
"resources": ["/entities/hr:"],
"allowed_ip_prefixes": ["10.", "192.168.", "172.16.", "172.17.", "172.18."] ,
"effect": "allow"
}
Die wichtigsten Endpunkte lösen folgende actions aus (neben Scope-Pflicht):
GET /metrics→metrics.readGET/POST /config→config.read/config.writeGET /entities/:key→readPUT /entities/DELETE /entities/:key→write/deletePOST /query→queryPOST /vector/search→vector.searchPOST /vector/batch_insert,DELETE /vector/by-filter→vector.writeGET /changefeed,GET /changefeed/stream→cdc.readGET /changefeed/stats,POST /changefeed/retention→cdc.admin
Zusätzlich ist weiterhin ein gültiger Scope am Token erforderlich (z. B. data:read, data:write, metrics:read, ...).
Im Prometheus-Endpoint /metrics verfügbar:
vccdb_policy_eval_totalvccdb_policy_allow_totalvccdb_policy_deny_total
Wir liefern eine Basis-Datei unter config/policies.json mit (du kannst sie 1:1 als policies.yaml umsetzen):
- Admin:
admindarf alles (actions: ["*"],resources: ["/"]) - Readonly:
readonlydarf Metriken, Config-Read, Daten-Reads, Query, Vector-Search, CDC-Read auf passenden Pfaden - Analyst:
analyst(+ analyst1/analyst2) darf Query/Vector-Search/Data-Read - HR-Bereich: erlauben aus internen Netzen (
10.*,192.168.*,172.16/12) und sonst explizit deny
Die folgenden Umgebungsvariablen werden beim Start eingelesen:
THEMIS_TOKEN_ADMIN→ Benutzeradminmit breiten ScopesTHEMIS_TOKEN_READONLY→ Benutzerreadonly(Read-Scopes)THEMIS_TOKEN_ANALYST→ Benutzeranalyst(Read-Scopes, inkl. Vector/Query)
Beispiel (PowerShell):
$env:THEMIS_TOKEN_ADMIN = "<geheim>"
$env:THEMIS_TOKEN_READONLY = "<readonly-token>"
$env:THEMIS_TOKEN_ANALYST = "<analyst-token>"Wichtig: Scopes im Token und Policies müssen zusammenpassen. Beispiel:
vector.searchbedingt i. d. R. den Scopedata:read.
Die interne Policy-Engine deckt das operative Enforcen ab (schnell, lokal, ohne externen Hop). Die Apache Ranger-Integration ist vollständig implementiert und ermöglicht die Synchronisierung von Policies aus zentralen Ranger-Instanzen.
| Feature | Status | Implementierung |
|---|---|---|
| Ranger Client | ✅ Produktionsreif | src/server/ranger_adapter.cpp (208 Zeilen) |
| Policy Import | ✅ Implementiert | POST /policies/import/ranger |
| Policy Export | ✅ Implementiert | GET /policies/export/ranger |
| Bearer Token Auth | ✅ Implementiert | Header-basierte Authentifizierung |
| TLS/mTLS | ✅ Implementiert | Volle SSL-Unterstützung |
| Retry-Logic | ✅ Implementiert | Exponential Backoff |
| Timeout-Config | ✅ Implementiert | Connect + Request Timeouts |
Wichtig: Die Ranger-Integration ist keine Planung oder Stub, sondern eine vollständige Implementierung mit echten HTTP-Aufrufen via libcurl. Siehe src/server/ranger_adapter.cpp und include/server/ranger_adapter.h.
- Zentrale Verwaltung/Review von Policies (UI, Workflows, Versionierung, Audit)
- Einheitliche Governance über mehrere Systeme hinweg (Data Lake, DBs, Services)
- Nutzung von Tag-basierten Policies und fortgeschrittenen ABAC-Mustern
- Zusätzliche Infrastruktur (Ranger Admin/DB), Betrieb und AuthN/SSO-Anbindung
- Modellsynchronisation (Ranger-Objektmodell vs. unsere Pfad-/Action-Logik)
- Fehler- und Latenz-Domäne, wenn Policies live remote abgefragt würden
- Ranger bleibt Management-Ebene. Policies werden periodisch über die Ranger-REST-API gelesen und in unsere lokale
policies.jsonübersetzt (Snapshot). - Enforcen erfolgt weiterhin lokal – robust gegen Netzausfälle und mit konstanter Latenz.
- Optional: manuelles Import/Export (Admin-API), sowie Hintergrund-Sync (z. B. alle 60s) mit ETag/Version.
- Import/Export-Endpunkte:
POST /policies/import/ranger,GET /policies/export/ranger - Übersetzung Ranger → intern:
- Ranger „resource.path" →
resources(Pfad-Präfix) - Ranger „users/groups" →
subjects - Ranger „accessTypes" →
actions(Mapping, z. B.read/write/adminzu unseren Actions) - Ranger „allow/deny" →
effect
- Ranger „resource.path" →
- Client-Konfiguration: Timeouts, Retry-Policy, TLS-Optionen
- Lokales Enforcen mit synchronisiertem Snapshot. Remote-Live-Enforcen vermeiden (Latenz, SPOF).
- Ein dedizierter Service-Name in Ranger für ThemisDB (z. B.
themisdb-prod). - Einfache, dokumentierte Action-Mappings (siehe oben). Feingranularere Attribute/Tags können in einer zweiten Ausbaustufe ergänzt werden.
- Import-Adapter mit mTLS/OAuth2 gegen Ranger absichern.
- Änderungen auditieren (z. B. in unserem Audit-Logger + Ranger Audit).
- Fallback: Wenn Ranger nicht erreichbar ist, wird die letzte gültige lokale Policy weiter genutzt.
Fazit: Die Ranger-Integration ist vollständig implementiert und produktionsbereit. Sie ermöglicht die nahtlose Integration in bestehende Enterprise-Sicherheitsinfrastrukturen.
- Import:
POST /policies/import/ranger(erfordert Scopeadminsowie passende Policy)- Liest Ranger-Policies via REST (Bearer-Token) und konvertiert sie nach intern; Ergebnis wird als Snapshot in
config/policies.jsongespeichert.
- Liest Ranger-Policies via REST (Bearer-Token) und konvertiert sie nach intern; Ergebnis wird als Snapshot in
- Export:
GET /policies/export/ranger(erfordert Scopeadmin)- Gibt ein minimales, Ranger-ähnliches JSON aus (nicht 1:1 Schema), für Review/Debugging.
Sicherheit (ENV-Variablen, Beispiel – Secrets gehören in sichere Secret-Stores):
# Ranger Endpoint + Service
$env:THEMIS_RANGER_BASE_URL = "https://ranger.example.com"
$env:THEMIS_RANGER_SERVICE = "themisdb-prod"
# Optional: Pfad (Default: /service/public/v2/api/policy)
$env:THEMIS_RANGER_POLICIES_PATH = "/service/public/v2/api/policy"
# AuthN
$env:THEMIS_RANGER_BEARER = "<ranger-api-token>" # Authorization: Bearer
# TLS
$env:THEMIS_RANGER_TLS_VERIFY = "1" # 1=verify (Default), 0=skip (nur Test!)
$env:THEMIS_RANGER_CA_CERT = "C:\\certs\\ca.pem" # optional eigenes CA-Bundle
# mTLS (optional)
$env:THEMIS_RANGER_CLIENT_CERT = "C:\\certs\\client.crt"
$env:THEMIS_RANGER_CLIENT_KEY = "C:\\certs\\client.key"
# Timeouts & Retry (optional, defaults shown)
$env:THEMIS_RANGER_CONNECT_TIMEOUT_MS = "5000" # Verbindungsaufbau-Timeout
$env:THEMIS_RANGER_REQUEST_TIMEOUT_MS = "15000" # Gesamt-Request-Timeout
$env:THEMIS_RANGER_MAX_RETRIES = "2" # Anzahl Wiederholungen bei 5xx/Netzfehlern
$env:THEMIS_RANGER_RETRY_BACKOFF_MS = "500" # Initialer Backoff (exponentiell)Hinweise:
- Standard ist TLS-Verifikation aktiv. Abschalten nur in Testumgebungen.
- Admin-geschützte Endpunkte zusätzlich durch Policies abgesichert (action
admin). - Import erfolgt als Snapshot; Enforcen bleibt lokal → keine Ranger-Latenz im Hot-Path.