-
Notifications
You must be signed in to change notification settings - Fork 1
features_compliance_governance
Policy-Engine fΓΌr Governance und Policy-Management.
- π Γbersicht
- β¨ Features
- π Schnellstart
- π Detaillierte Dokumentation
- π‘ Best Practices
- π§ Troubleshooting
- π Siehe auch
- π Changelog
Ziel: Umfassende Compliance- und Governance-Architektur fΓΌr ThemisDB mit PKI-signiertem Audit-Trail, DSGVO-by-Design, automatischer PII-Erkennung und konfigurierbaren Governance-Policies.
Kernprinzipien:
- π UnverΓ€nderlicher Audit-Trail: SAGA-Log regelmΓ€Γig PKI-signiert, Log-Keys sicher gespeichert
- π DSGVO by Design: Automatische PII-Erkennung, UUID-Ersetzung, Original-Blob zugriffsbeschrΓ€nkt
- βοΈ Regulatory Compliance: GDPR/DSGVO, HIPAA, BSI C5, SOC2 UnterstΓΌtzung
- π― Policy-Driven: Alle Governance-Regeln in YAML/JSON konfigurierbar
- π Transparenz: VollstΓ€ndige Nachvollziehbarkeit aller Datenoperationen
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ThemisDB Compliance Layer β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β SAGA Logger β β PII Detector β β Retention β β
β β + PKI Sign β β + Anonymizer β β Manager β β
β ββββββββ¬ββββββββ ββββββββ¬ββββββββ ββββββββ¬ββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β Governance Policy Engine (GPE) β β
β β - Policy Validation & Enforcement β β
β β - Config-Driven Rules (YAML/JSON) β β
β β - Audit Trail Generation β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
β β VCC-PKI β β VCC-User β β Encryption β β
β β Integration β β Integration β β Layer β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Was wird geschΓΌtzt:
- β Audit-IntegritΓ€t: SAGA-Logs unverΓ€nderlich durch PKI-Signaturen
- β PII-Schutz: Automatische Erkennung und Anonymisierung sensibler Daten
- β Rechtssicherheit: VollstΓ€ndige Nachvollziehbarkeit aller Operationen
- β DatensouverΓ€nitΓ€t: On-Premise mit VCC-PKI/User Integration
Compliance-Szenarien:
- β DSGVO Artikel 17 (Recht auf Vergessenwerden): PII durch UUID ersetzt, Original-Zugriff widerrufbar
- β DSGVO Artikel 30 (Verarbeitungsverzeichnis): SAGA-Log als lΓΌckenloser Audit-Trail
- β DSGVO Artikel 32 (Datensicherheit): VerschlΓΌsselung + PKI-Signaturen
- β HIPAA Audit Controls: Strukturierte JSON-Logs mit medizinischen Daten-Tags
- β BSI C5 Logging: Zeitstempel, User-ID, Operation, Result in jedem Log-Entry
Problem: SAGA-Logs (Transaktions-Kompensationen) mΓΌssen manipulationssicher sein fΓΌr rechtliche Nachweisbarkeit.
LΓΆsung: RegelmΓ€Γige PKI-Signierung von Log-Batches mit VCC-PKI Intermediate CA.
// Beispiel: SAGA-Log Entry (vor Signierung)
{
"saga_id": "tx_20251031_123456_789",
"timestamp": "2025-10-31T14:23:45.123Z",
"operation": "vectorAdd",
"entity_pk": "doc_12345",
"user_id": "user_alice@example.com",
"compensated": false,
"duration_ms": 42,
"status": "success"
}Workflow:
- Batch-Collection: Alle SAGA-Steps seit letzter Signierung sammeln (z.B. 1000 EintrΓ€ge oder 5 Minuten)
- Canonical JSON: Sortierte Keys, UTF-8, keine Whitespace β deterministischer Klartext
- AES-VerschlΓΌsselung (LEK): Klartext-Batch mit tΓ€glichem LEK per AES-256-GCM verschlΓΌsseln β Ciphertext + IV + Tag
-
SHA-256 Hash (ΓΌber Ciphertext):
hash = SHA256(ciphertext_batch)β Encrypt-then-Hash -
PKI-Signierung (Ciphertext-Hash): VCC-PKI REST API aufrufen β
POST /api/v1/sign{ "service_id": "themis-db", "data_hash": "abcdef123456...", "signature_type": "RSA-SHA256" } -
Signatur speichern: In RocksDB unter
saga:signature:<timestamp>{ "batch_id": "batch_20251031_142300", "log_entries": 1000, "first_saga_id": "tx_...", "last_saga_id": "tx_...", "hash": "abcdef...", "signature": "MIIBIjANBg...", "cert_serial": "03:A5:B2:...", "signed_at": "2025-10-31T14:25:00Z", "signer": "themis-service-cert", "enc": { "alg": "AES-256-GCM", "lek_id": "lek:20251031", "iv": "base64(...)", "tag": "base64(...)" } }
Verifizierung (Ciphertext zuerst):
bool verifySAGABatch(const std::string& batch_id) {
// 1. Lade Signatur-Metadata
auto sig_data = db_.get("saga:signature:" + batch_id);
// 2. Lade gespeicherten Ciphertext-Batch (ohne EntschlΓΌsselung)
std::string ciphertext = loadEncryptedBatch(sig_data["batch_id"]);
// 3. Hash ΓΌber Ciphertext bilden
std::string hash = sha256(ciphertext);
// 4. VCC-PKI Signature Verify (Ciphertext-Hash)
return vcc_pki_client_->verify(
hash,
sig_data["signature"],
sig_data["cert_serial"]
);
}Problem: Log-EintrΓ€ge kΓΆnnen sensitive Daten enthalten (vor Anonymisierung) β VerschlΓΌsselung erforderlich.
LΓΆsung: Separater Log-Encryption-Key (LEK) pro Zeitperiode (z.B. tΓ€glich).
# config/governance.yaml
saga_log:
signature:
enabled: true
batch_size: 1000
batch_interval_minutes: 5
algorithm: "RSA-SHA256"
pki_service: "https://localhost:8443/api/v1"
encryption:
enabled: true
key_rotation: "daily" # daily, weekly, monthly
algorithm: "AES-256-GCM"
key_storage: "rocksdb" # Key encrypted with KEK from PKI
retention:
keep_signed_logs_days: 2555 # 7 Jahre (DSGVO Artikel 17)
archive_to_cold_storage: true
cold_storage_path: "/mnt/archive/saga_logs"LEK-Ablauf:
- TΓ€gliche KEK-Ableitung: VCC-PKI Service-Zertifikat β HKDF β KEK(date)
- LEK-Generierung: ZufΓ€llige 256-bit AES-Key β LEK(date)
-
LEK-Speicherung:
lek:20251031 = AES-GCM-Encrypt(KEK, LEK)in RocksDB -
Log-VerschlΓΌsselung: Jeder SAGA-Entry β
AES-GCM-Encrypt(LEK, canonical_json) - Dekodierung: Bei Audit-Anfrage β Lade LEK β EntschlΓΌssele Logs
Vorteil: Bei Daten-Leak nur aktuelle LEK kompromittiert, nicht gesamte Historie.
DSGVO Artikel 25 (Data Protection by Design):
- Sensitive PII automatisch erkennen
- Original-EntitΓ€t durch UUID ersetzen (Pseudonymisierung)
- Original-Blob bleibt verschlΓΌsselt, Zugriff nur mit User-Berechtigung
- LΓΆschung: UUID-Mapping lΓΆschen β Original unwiederbringlich
Multi-Strategy-Ansatz:
class PIIDetector {
public:
enum class PIIType {
EMAIL, // RFC 5322 Email-Regex
PHONE, // E.164 + lokale Formate
SSN, // Social Security Number (US, DE, etc.)
IBAN, // International Bank Account Number
CREDIT_CARD, // Luhn-Algorithm Validation
PASSPORT, // Country-specific patterns
IP_ADDRESS, // IPv4/IPv6
MEDICAL_ID, // Krankenversicherungsnummer
TAX_ID, // Steuernummer, UID
CUSTOM // User-defined regex
};
struct PIIMatch {
PIIType type;
std::string field_path; // e.g., "user.profile.email"
std::string original_value;
std::string anonymized_value; // UUID
size_t offset;
size_t length;
};
std::vector<PIIMatch> detectPII(
const json& entity_data,
const PIIConfig& config
);
};Detection-Strategien:
-
Regex-Based Detection (schnell, hohe PrΓ€zision):
const std::regex EMAIL_REGEX( R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b)" ); const std::regex IBAN_REGEX( R"([A-Z]{2}\d{2}[A-Z0-9]{10,30})" );
-
NER (Named Entity Recognition) (Machine Learning, optional):
- Integration mit lokalen NER-Modellen (z.B. spaCy, Flair)
- Erkennung von Namen, Adressen, Organisationen in Freitext
-
Schema-Based Detection (Metadaten):
# config/pii_schema.yaml field_annotations: - field: "email" type: EMAIL auto_anonymize: true - field: "phone_number" type: PHONE auto_anonymize: true - field: "medical_records.patient_id" type: MEDICAL_ID auto_anonymize: true retention_days: 3650 # 10 Jahre HIPAA
Beispiel: Graph-Entity mit PII
// Original-Entity (vor Import)
{
"pk": "patient_001",
"name": "Max Mustermann",
"email": "max.mustermann@example.com",
"ssn": "123-45-6789",
"diagnosis": "..."
}
// Nach PII-Detection & Anonymisierung
{
"pk": "patient_001",
"name": "pii_uuid_7a3f2e1b-4c5d-6a7b-8c9d-0e1f2a3b4c5d",
"email": "pii_uuid_9f8e7d6c-5b4a-3c2d-1e0f-a9b8c7d6e5f4",
"ssn": "pii_uuid_3e2d1c0b-a9f8-e7d6-c5b4-a3f2e1d0c9b8",
"diagnosis": "..."
}
// PII-Mapping in separater CF (RocksDB Column Family)
Key: pii_uuid_7a3f2e1b-4c5d-6a7b-8c9d-0e1f2a3b4c5d
Value: {
"original_value": "Max Mustermann", // AES-256-GCM encrypted
"field": "name",
"entity_pk": "patient_001",
"pii_type": "PERSON_NAME",
"detected_at": "2025-10-31T14:30:00Z",
"detected_by": "regex_ner",
"retention_policy": "gdpr_erasure",
"access_control": {
"allowed_roles": ["doctor", "admin"],
"audit_access": true
}
}Zugriff auf Original:
std::string revealPII(
const std::string& pii_uuid,
const UserContext& user
) {
// 1. Lade PII-Mapping
auto pii_data = db_.get("pii:" + pii_uuid);
// 2. ACL-Check
if (!checkAccess(pii_data["access_control"], user)) {
THEMIS_AUDIT_LOG("PII_ACCESS_DENIED", {
{"pii_uuid", pii_uuid},
{"user_id", user.id},
{"timestamp", now()}
});
throw AuthorizationException("Access to PII denied");
}
// 3. Audit-Log
THEMIS_AUDIT_LOG("PII_ACCESS_GRANTED", {
{"pii_uuid", pii_uuid},
{"user_id", user.id},
{"field", pii_data["field"]},
{"entity_pk", pii_data["entity_pk"]}
});
// 4. EntschlΓΌsseln & ZurΓΌckgeben
std::string encrypted = pii_data["original_value"];
return decryptField(encrypted, user.field_key);
}Recht auf Vergessenwerden (DSGVO Artikel 17):
void erasePII(const std::string& entity_pk) {
// 1. Finde alle PII-UUIDs fΓΌr Entity
auto pii_uuids = findPIIForEntity(entity_pk);
// 2. LΓΆsche PII-Mappings (Original unwiederbringlich)
for (const auto& uuid : pii_uuids) {
db_.delete("pii:" + uuid);
THEMIS_AUDIT_LOG("PII_ERASED", {
{"pii_uuid", uuid},
{"entity_pk", entity_pk},
{"timestamp", now()},
{"reason", "gdpr_article_17"}
});
}
// 3. Entity bleibt mit UUIDs (Pseudonymisiert, aber nutzbar fΓΌr Statistik)
}ThemisDB unterscheidet mehrere Log-Typen:
| Kategorie | Zweck | Signiert | VerschlΓΌsselt | Retention |
|---|---|---|---|---|
| SAGA | Transaktions-Kompensationen | β Ja | β Ja | 7 Jahre |
| AUDIT | Datenzugriffe, ACL-PrΓΌfungen | β Ja | β Ja (Encrypt-then-Sign bei Query-Daten) | 7 Jahre |
| SECURITY | Auth-Failures, Anomalien | β Ja | β Nein | 10 Jahre |
| OPERATIONAL | Performance, Errors | β Nein | β Nein | 90 Tage |
| DEBUG | Entwickler-Traces | β Nein | β Nein | 7 Tage |
FΓΌr alle Log-Kategorien, die Query-Daten, Query-Parameter, Result-Samples oder PII enthalten kΓΆnnen (insb. AUDIT, SAGA), gilt:
- Erst wird der Log-Eintrag als Canonical JSON serialisiert
- Dann wird der Klartext mit dem tagesaktuellen LEK via AES-256-GCM verschlΓΌsselt
- Der Hash fΓΌr die PKI-Signatur wird ΓΌber den Ciphertext gebildet (nicht ΓΌber den Klartext)
- Signatur und AES-Metadaten (iv, tag, lek_id, optional aad) werden gemeinsam persistiert
- Eine redaktierte, nicht sensible Kurzform wird optional in stdout/file geloggt
Diese Reihenfolge verhindert, dass sensible Daten in Signaturvorlagen, SIEM-Pipelines oder Transportebenen im Klartext erscheinen.
Standard-Schema:
{
"log_id": "uuid_v7",
"timestamp": "2025-10-31T14:45:32.123Z",
"category": "AUDIT",
"severity": "INFO",
"service": "themis-server",
"host": "themis-prod-01",
"user": {
"id": "user_alice@example.com",
"role": "analyst",
"ip": "192.168.1.42",
"session_id": "jwt_..."
},
"operation": {
"type": "query",
"resource": "graph:patients",
"action": "read",
"query_aql": "FOR p IN patients FILTER p.age > 50 RETURN p",
"result_count": 42,
"duration_ms": 156
},
"compliance": {
"pii_accessed": ["email", "ssn"],
"purpose": "medical_research",
"legal_basis": "gdpr_article_6_1_e"
},
"metadata": {
"saga_id": "tx_...",
"trace_id": "otel_...",
"correlation_id": "req_..."
}
}Log-Sink Integration:
// include/utils/audit_logger.h
class AuditLogger {
public:
static void logDataAccess(
const UserContext& user,
const std::string& resource,
const std::string& action,
const std::vector<std::string>& pii_fields,
int64_t duration_ms
);
static void logSecurityEvent(
const std::string& event_type,
const json& details
);
static void logSAGAStep(
const Saga::Step& step,
const std::string& saga_id
);
};spdlog Integration (Encrypt-then-Sign):
// src/utils/audit_logger.cpp
void AuditLogger::logDataAccess(...) {
json log_entry = {
{"log_id", generate_uuid_v7()},
{"timestamp", iso8601_now()},
{"category", "AUDIT"},
{"user", {
{"id", user.id},
{"role", user.role},
{"ip", user.ip_address}
}},
{"operation", {
{"resource", resource},
{"action", action},
{"duration_ms", duration_ms}
}},
{"compliance", {
{"pii_accessed", pii_fields}
}}
};
// 1) Canonical JSON
std::string canonical = toCanonicalJSON(log_entry);
// 2) Encrypt with LEK (AES-256-GCM) if category contains query data
if (governance_->shouldEncryptLogs("AUDIT")) {
AAD aad{ {"log_id", log_entry["log_id"]}, {"category", "AUDIT"}, {"timestamp", log_entry["timestamp"]} };
auto enc = aes_gcm_encrypt(lek_manager_.current(), canonical, aad);
// 3) Hash ciphertext and queue for signing (Encrypt-then-Sign)
auto hash = sha256(enc.ciphertext);
queueForSigning(hash, enc.meta); // enc.meta carries iv, tag, lek_id, aad
// 4) Persist encrypted envelope for audit storage
persistEncryptedAudit(enc, log_entry["log_id"]);
// 5) Emit redacted line to console/file sinks only
auto logger = spdlog::get("audit");
logger->info("{{\"log_id\":\"{}\",\"category\":\"AUDIT\",\"encrypted\":true}}", (std::string)log_entry["log_id"]);
} else {
// Non-sensitive: plain JSON to sinks and to signing queue (still encrypted if policy enforces)
auto logger = spdlog::get("audit");
logger->info(canonical);
addToPendingSAGABatch(log_entry);
}
}Export zu externen SIEM-Systemen:
# config/governance.yaml
audit_export:
enabled: true
destinations:
- type: syslog
host: "siem.internal.vcc"
port: 514
protocol: "TCP"
tls: true
categories: ["AUDIT", "SECURITY"]
encryption:
encrypt_payloads: true
sign_ciphertext: true
redact_console_output: true
- type: elasticsearch
url: "https://elastic.internal.vcc:9200"
index: "themis-audit-{date}"
auth_type: "api_key"
api_key_env: "ELASTIC_API_KEY"
encryption:
encrypt_payloads: true
sign_ciphertext: true
- type: file
path: "/var/log/themis/audit_{date}.json.gz"
rotation: "daily"
compression: true
max_size_mb: 500
encryption:
encrypt_payloads: true
sign_ciphertext: trueZentrale Governance-Konfiguration:
# config/governance_policies.yaml
governance:
version: "1.0"
effective_date: "2025-11-01"
# ========== DATA CLASSIFICATION ==========
data_classification:
levels:
- name: "public"
encryption_required: false
pii_detection: false
retention_days: 365
- name: "internal"
encryption_required: true
pii_detection: true
retention_days: 2555 # 7 Jahre
access_control: "role_based"
- name: "confidential"
encryption_required: true
pii_detection: true
retention_days: 3650 # 10 Jahre
access_control: "attribute_based"
audit_all_access: true
- name: "restricted"
encryption_required: true
encryption_algorithm: "AES-256-GCM"
pii_detection: true
pii_auto_anonymize: true
retention_days: 3650
access_control: "multi_factor"
audit_all_access: true
require_approval: true
# ========== PII DETECTION RULES ==========
pii_detection:
enabled: true
strategies:
- type: "regex"
patterns:
email: '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
phone_de: '\+49\s?\d{2,5}\s?\d{3,10}'
iban: '[A-Z]{2}\d{2}[A-Z0-9]{10,30}'
ssn_us: '\d{3}-\d{2}-\d{4}'
- type: "schema_annotation"
fields:
- path: "*.email"
type: EMAIL
- path: "patient.medical_id"
type: MEDICAL_ID
- path: "user.ssn"
type: SSN
anonymization:
method: "uuid_replacement"
uuid_prefix: "pii_uuid_"
store_mapping: true
mapping_encryption: true
access_control:
default_deny: true
allowed_roles:
- "gdpr_officer"
- "compliance_admin"
audit_all_reveals: true
# ========== RETENTION POLICIES ==========
retention:
default_days: 2555 # 7 Jahre DSGVO
overrides:
- resource_pattern: "medical_records.*"
retention_days: 3650 # 10 Jahre HIPAA
legal_basis: "HIPAA_164_316"
- resource_pattern: "financial.*"
retention_days: 3650 # 10 Jahre HGB
legal_basis: "HGB_257"
- resource_pattern: "debug_logs.*"
retention_days: 7
auto_purge: true
archive:
enabled: true
after_days: 365
storage: "cold_storage"
compression: "zstd"
encryption: true
# ========== SAGA LOG SIGNING ==========
saga_signing:
enabled: true
batch_size: 1000
batch_interval_minutes: 5
signature_algorithm: "RSA-SHA256"
pki_endpoint: "https://localhost:8443/api/v1/sign"
cert_service_id: "themis-db"
encrypt_then_sign: true # Erzwingt: erst AES-256-GCM verschlΓΌsseln, dann Ciphertext hash/sign
categories:
encrypt_before_sign: ["SAGA", "AUDIT"]
verification:
on_query: true # Bei Audit-Anfragen automatisch verifizieren
periodic_check: true
check_interval_hours: 24
# ========== COMPLIANCE FRAMEWORKS ==========
compliance_frameworks:
gdpr:
enabled: true
data_protection_officer: "dpo@example.com"
article_30_register: "/var/themis/gdpr_register.json"
breach_notification_hours: 72
hipaa:
enabled: true
covered_entity: true
business_associate: false
security_officer: "ciso@example.com"
bsi_c5:
enabled: true
attestation_level: "Type 2"
audit_frequency_months: 12
soc2:
enabled: false
# ========== DE (VS) KLASSIFIZIERUNG ==========
vs_classification:
levels:
- name: "offen"
encryption_profile:
required: false
algorithm: "AES-256-GCM"
double_encrypt: false
hsm_only: false
logs:
encrypt_then_sign: false
redact: false
vector_policy: "allow"
export_policy: "allow"
cache_policy: { persistent: true, ttl_seconds: 86400 }
- name: "vs-nfd"
encryption_profile:
required: true
algorithm: "AES-256-GCM"
double_encrypt: false
hsm_only: false
logs:
encrypt_then_sign: true
lek_rotation: "daily"
redact: true
vector_policy: "allow_metadata_only"
export_policy: "allow_with_approval"
cache_policy: { persistent: false, ttl_seconds: 3600 }
- name: "geheim"
encryption_profile:
required: true
algorithm: "AES-256-GCM"
double_encrypt: true
hsm_only: true
logs:
encrypt_then_sign: true
lek_rotation: "daily"
redact: "strict"
vector_policy: "restricted" # keine Klartext-Embeddings-Exporte
export_policy: "approval_only"
cache_policy: { persistent: false, ttl_seconds: 0 }
- name: "streng-geheim"
encryption_profile:
required: true
algorithm: "AES-256-GCM"
double_encrypt: true
hsm_only: true
logs:
encrypt_then_sign: true
lek_rotation: "daily"
redact: "strict"
minimal_plain_meta: ["log_id", "category", "timestamp"]
vector_policy: "disable_ann"
export_policy: "forbidden"
cache_policy: { persistent: false, ttl_seconds: 0 }
enforcement:
default_classification: "vs-nfd"
map_resources:
- resource_pattern: "patients.*"
classification: "geheim"
- resource_pattern: "intelligence.*"
classification: "streng-geheim"
- resource_pattern: "public_docs.*"
classification: "offen"
endpoint_switches:
headers:
classification: "X-Classification" # offen|vs-nfd|geheim|streng-geheim
governance_mode: "X-Governance-Mode" # enforce|simulate
encrypt_logs: "X-Encrypt-Logs" # on|off|auto
redaction_level: "X-Redaction-Level" # none|standard|strict
response_headers:
policy: "X-Themis-Policy"
integrity: "X-Themis-Integrity"// include/governance/policy_engine.h
class GovernancePolicyEngine {
public:
explicit GovernancePolicyEngine(const std::string& config_path);
// Policy-Validierung
bool validateOperation(
const UserContext& user,
const std::string& resource,
const std::string& action
);
// Data Classification
std::string getClassificationLevel(const std::string& resource);
// Retention
int getRetentionDays(const std::string& resource);
bool shouldArchive(const std::string& resource, int age_days);
bool shouldPurge(const std::string& resource, int age_days);
// PII
bool shouldDetectPII(const std::string& resource);
bool shouldAutoAnonymize(const std::string& resource);
std::vector<std::string> getAllowedPIIRoles();
// Audit
bool shouldAuditAccess(const std::string& resource);
std::vector<std::string> getComplianceFrameworks();
// VS-Classification helpers
std::string resolveClassification(const std::string& resource, const std::optional<std::string>& header_cls);
EncryptionProfile getEncryptionProfile(const std::string& classification);
LogRules getLogRules(const std::string& classification);
VectorPolicy getVectorPolicy(const std::string& classification);
bool isExportAllowed(const std::string& classification, bool hasApproval);
private:
json config_;
std::unordered_map<std::string, json> classification_cache_;
};Endpoint-Durchsetzung (Skizze):
auto hdr_cls = req.header("X-Classification");
auto cls = gpe.resolveClassification(resource, hdr_cls);
auto enc = gpe.getEncryptionProfile(cls);
auto logs = gpe.getLogRules(cls);
auto vecp = gpe.getVectorPolicy(cls);
if (vecp == VectorPolicy::DISABLE_ANN) {
return Status::PermissionDenied("ANN disabled for classification: " + cls);
}
applyEncryptionProfile(entity, enc, user);
auditLogger.logWithRules(user, resource, action, logs);Verwendung im Query-Engine:
// src/query/query_executor.cpp
Status QueryExecutor::executeQuery(
const AQLQuery& query,
const UserContext& user,
QueryResult& result
) {
auto start = std::chrono::steady_clock::now();
// 1. Policy-Check
for (const auto& collection : query.collections) {
if (!gpe_->validateOperation(user, collection, "read")) {
THEMIS_AUDIT_LOG("QUERY_DENIED", {
{"user", user.id},
{"collection", collection},
{"reason", "policy_violation"}
});
return Status::PermissionDenied("Access to " + collection + " denied");
}
}
// 2. PII-Detection aktivieren?
bool detect_pii = gpe_->shouldDetectPII(query.collections[0]);
// 3. Query ausfΓΌhren
auto status = executor_->execute(query, result);
// 4. PII-Anonymisierung (wenn konfiguriert)
if (detect_pii && gpe_->shouldAutoAnonymize(query.collections[0])) {
anonymizePIIInResult(result, user);
}
// 5. Audit-Log
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - start
);
if (gpe_->shouldAuditAccess(query.collections[0])) {
AuditLogger::logDataAccess(
user,
query.collections[0],
"query",
extractPIIFields(result),
duration.count()
);
}
return status;
}// include/governance/retention_manager.h
class RetentionManager {
public:
struct RetentionPolicy {
std::string resource_pattern; // Regex: "medical_records.*"
int retention_days;
bool auto_archive;
int archive_after_days;
bool auto_purge;
std::string legal_basis;
};
explicit RetentionManager(
RocksDBWrapper& db,
const GovernancePolicyEngine& gpe
);
// Background-Task (tΓ€glich ausgefΓΌhrt)
void runRetentionSweep();
// Manuelle Operationen
std::vector<std::string> findExpiredEntities(const std::string& collection);
void archiveEntity(const std::string& pk);
void purgeEntity(const std::string& pk);
private:
RocksDBWrapper& db_;
const GovernancePolicyEngine& gpe_;
};Workflow:
void RetentionManager::runRetentionSweep() {
THEMIS_INFO("Starting retention sweep");
// Alle Collections durchlaufen
for (const auto& collection : getAllCollections()) {
auto policy = gpe_.getRetentionPolicy(collection);
// Finde alte Entities (via created_at/modified_at)
auto expired = findExpiredEntities(collection);
for (const auto& pk : expired) {
auto age_days = getEntityAgeDays(pk);
// Archivierung?
if (policy.auto_archive && age_days >= policy.archive_after_days) {
archiveEntity(pk);
THEMIS_AUDIT_LOG("ENTITY_ARCHIVED", {
{"pk", pk},
{"collection", collection},
{"age_days", age_days},
{"legal_basis", policy.legal_basis}
});
}
// LΓΆschung?
if (policy.auto_purge && age_days >= policy.retention_days) {
purgeEntity(pk);
THEMIS_AUDIT_LOG("ENTITY_PURGED", {
{"pk", pk},
{"collection", collection},
{"age_days", age_days},
{"legal_basis", policy.legal_basis}
});
}
}
}
THEMIS_INFO("Retention sweep completed");
}Archivierung zu externem Storage:
void RetentionManager::archiveEntity(const std::string& pk) {
// 1. Lade vollstΓ€ndige Entity-Daten
auto entity = loadFullEntity(pk); // Mit Graph-Kanten, Content-Blobs, etc.
// 2. Serialize als JSON
json archive_entry = {
{"pk", pk},
{"archived_at", iso8601_now()},
{"original_data", entity},
{"metadata", {
{"collection", entity["_collection"]},
{"created_at", entity["created_at"]},
{"data_classification", gpe_.getClassificationLevel(pk)}
}}
};
// 3. Kompression (ZSTD)
auto json_str = archive_entry.dump();
auto compressed = zstd_compress(json_str.data(), json_str.size(), 19);
// 4. VerschlΓΌsselung (optional, je nach Policy)
auto encrypted = encryptArchive(compressed);
// 5. Export zu Cold Storage
std::string archive_path = config_["cold_storage_path"].get<std::string>()
+ "/" + getCurrentDatePath()
+ "/" + pk + ".zst.enc";
writeToFile(archive_path, encrypted);
// 6. Markiere in DB als archived (nicht lΓΆschen, nur Flag)
db_.put(pk + ":metadata", json{{"archived", true}, {"archive_path", archive_path}}.dump());
}Automatische Generierung:
json generateGDPRArticle30Register() {
json reg = {
{"controller", {
{"name", "VCC GmbH"},
{"contact", "dpo@example.com"},
{"address", "MusterstraΓe 1, 12345 Berlin"}
}},
{"processing_activities", json::array()}
};
// Alle Collections analysieren
for (const auto& collection : getAllCollections()) {
auto classification = gpe_.getClassificationLevel(collection);
auto retention = gpe_.getRetentionDays(collection);
json activity = {
{"purpose", collection + " data processing"},
{"legal_basis", "GDPR Article 6(1)(e)"}, // Public interest
{"data_categories", getDataCategories(collection)},
{"recipients", "Internal staff only"},
{"retention_period", std::to_string(retention) + " days"},
{"security_measures", {
"AES-256-GCM encryption",
"PKI-signed audit logs",
"Role-based access control",
"PII auto-anonymization"
}},
{"data_subjects", "EU citizens"}
};
reg["processing_activities"].push_back(activity);
}
return reg;
}Export:
# HTTP Endpoint
GET /api/compliance/gdpr/article30
# CLI Tool
$ themis-cli compliance gdpr-register --format json > gdpr_register.json
$ themis-cli compliance gdpr-register --format pdf > gdpr_register.pdfjson generateAuditReport(
const std::string& start_date,
const std::string& end_date,
const std::vector<std::string>& categories
) {
json report = {
{"period", {{"start", start_date}, {"end", end_date}}},
{"categories", categories},
{"entries", json::array()},
{"summary", {}}
};
// Lade SAGA-Logs aus Zeitraum
auto logs = loadSAGALogs(start_date, end_date, categories);
// Verifiziere Signaturen
int verified = 0, failed = 0;
for (const auto& batch : getSAGABatches(start_date, end_date)) {
if (verifySAGABatch(batch.id)) {
verified++;
} else {
failed++;
report["integrity_violations"].push_back({
{"batch_id", batch.id},
{"signed_at", batch.signed_at}
});
}
}
report["summary"] = {
{"total_entries", logs.size()},
{"verified_batches", verified},
{"failed_batches", failed},
{"pii_accesses", countPIIAccesses(logs)},
{"security_events", countSecurityEvents(logs)}
};
report["entries"] = logs;
return report;
}Deliverables:
- β
AuditLoggerKlasse mit spdlog JSON-Output - β SAGA-Log-Erweiterung mit Batch-Collection
- β
VCC-PKI Client fΓΌr Signierung (
POST /api/v1/sign) - β LEK (Log Encryption Key) Management mit tΓ€glicher Rotation
- β
verifySAGABatch()Funktion fΓΌr Signatur-Validierung
Config:
# config/governance.yaml (initial)
saga_log:
signature:
enabled: true
batch_size: 1000
batch_interval_minutes: 5
encryption:
enabled: true
key_rotation: dailyDeliverables:
- β
PIIDetectorKlasse mit Regex + Schema-Strategien - β UUID-Replacement-Logik in Entity-Import
- β PII-Mapping-Storage in separater RocksDB CF
- β
revealPII()mit ACL-Check + Audit-Log - β
erasePII()fΓΌr DSGVO Artikel 17
Config:
pii_detection:
enabled: true
strategies:
- type: regex
- type: schema_annotation
anonymization:
method: uuid_replacementDeliverables:
- β
GovernancePolicyEngineKlasse mit YAML-Parsing - β Data Classification API
- β Policy-Validation in Query-Engine
- β Retention-Policy-Integration
- β Multi-Framework Support (GDPR, HIPAA, BSI C5)
Config:
governance:
data_classification:
levels: [public, internal, confidential, restricted]
compliance_frameworks:
gdpr: {enabled: true}
hipaa: {enabled: true}Deliverables:
- β
RetentionManagerKlasse - β Background-Task fΓΌr Daily Sweep
- β Cold-Storage-Export (ZSTD + VerschlΓΌsselung)
- β Archiv-Metadata in RocksDB
- β Compliance-Reports (GDPR Artikel 30, Audit-Trails)
Config:
retention:
default_days: 2555
archive:
enabled: true
storage: /mnt/archive/themisTests:
- β SAGA-Signatur-Roundtrip (Sign β Verify)
- β PII-Detection fΓΌr alle Typen (Email, Phone, SSN, etc.)
- β Anonymisierung + Reveal + Erase Workflow
- β Policy-Engine mit allen Klassifizierungen
- β Retention-Sweep mit Archivierung
- β GDPR Artikel 30 Register-Generierung
- β Multi-User Audit-Trail (verschiedene Rollen)
Performance:
- Benchmark: SAGA-Signierung Overhead (<5% bei Batch=1000)
- Benchmark: PII-Detection Latenz (<1ms pro Entity)
- Load-Test: 1M Entities mit Retention-Sweep (<10min)
# config/governance.yaml (Production)
governance:
version: "1.0"
environment: "production"
# Audit-Logging
audit:
enabled: true
categories:
- SAGA
- AUDIT
- SECURITY
sinks:
- type: file
path: /var/log/themis/audit.json
- type: syslog
host: siem.internal.vcc
port: 514
tls: true
- type: elasticsearch
url: https://elastic.internal.vcc:9200
index: themis-audit-{date}
# SAGA-Signierung
saga_signing:
enabled: true
batch_size: 1000
batch_interval_minutes: 5
signature_algorithm: RSA-SHA256
pki_endpoint: https://pki.internal.vcc:8443/api/v1/sign
cert_service_id: themis-db-prod
encrypt_then_sign: true
categories:
encrypt_before_sign: [SAGA, AUDIT]
verification:
on_query: true
periodic_check: true
check_interval_hours: 24
# Log-VerschlΓΌsselung
log_encryption:
enabled: true
key_rotation: daily
algorithm: AES-256-GCM
key_storage: rocksdb
aad_fields: [log_id, category, timestamp]
encrypt_categories: [SAGA, AUDIT]
# PII-Erkennung
pii_detection:
enabled: true
strategies:
- type: regex
patterns_file: /etc/themis/pii_patterns.yaml
- type: schema_annotation
schema_file: /etc/themis/pii_schema.yaml
anonymization:
method: uuid_replacement
uuid_prefix: "pii_"
store_mapping: true
mapping_encryption: true
access_control:
default_deny: true
allowed_roles: [gdpr_officer, compliance_admin, legal]
audit_all_reveals: true
# Data Classification
data_classification:
levels:
- name: public
encryption_required: false
pii_detection: false
retention_days: 365
- name: internal
encryption_required: true
pii_detection: true
retention_days: 2555 # 7 Jahre
access_control: role_based
- name: confidential
encryption_required: true
pii_detection: true
retention_days: 3650 # 10 Jahre
access_control: attribute_based
audit_all_access: true
- name: restricted
encryption_required: true
encryption_algorithm: AES-256-GCM
pii_detection: true
pii_auto_anonymize: true
retention_days: 3650
access_control: multi_factor
audit_all_access: true
require_approval: true
# Retention
retention:
default_days: 2555
archive:
enabled: true
after_days: 365
storage: /mnt/cold_storage/themis
compression: zstd
encryption: true
policies:
- resource_pattern: "medical_records.*"
retention_days: 3650
legal_basis: HIPAA_164_316
- resource_pattern: "financial.*"
retention_days: 3650
legal_basis: HGB_257
- resource_pattern: "debug_logs.*"
retention_days: 7
auto_purge: true
# Compliance-Frameworks
compliance_frameworks:
gdpr:
enabled: true
data_protection_officer: dpo@vcc.internal
article_30_register: /var/themis/gdpr_register.json
breach_notification_hours: 72
hipaa:
enabled: true
covered_entity: true
security_officer: ciso@vcc.internal
bsi_c5:
enabled: true
attestation_level: Type 2
audit_frequency_months: 12# config/governance.dev.yaml
governance:
version: "1.0"
environment: "development"
saga_signing:
enabled: false # Schnelleres Testing
log_encryption:
enabled: false
pii_detection:
enabled: true
strategies:
- type: regex
patterns:
email: '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
anonymization:
method: uuid_replacement
store_mapping: true
mapping_encryption: false # Dev: PII in Klartext fΓΌr Debugging
access_control:
default_deny: false # Dev: Offener Zugriff
retention:
default_days: 7 # Kurze Retention fΓΌr Dev-DB
archive:
enabled: false
compliance_frameworks:
gdpr:
enabled: true
hipaa:
enabled: false# config/rbac_policies.yaml
roles:
- name: analyst
permissions:
- resource: "patients.*"
actions: [read]
pii_reveal: false # Sieht nur UUIDs
- name: doctor
permissions:
- resource: "patients.*"
actions: [read, write]
pii_reveal: true # Kann PII entschlΓΌsseln
pii_types: [EMAIL, PHONE, MEDICAL_ID]
- name: gdpr_officer
permissions:
- resource: "*"
actions: [read, write, delete]
pii_reveal: true
pii_erase: true # Kann DSGVO-LΓΆschung durchfΓΌhren
- name: compliance_admin
permissions:
- resource: "*"
actions: [read]
pii_reveal: true
audit_access: true
compliance_reports: true// Automatische Verifizierung bei /api/audit/logs Anfragen
GET /api/audit/logs?start=2025-10-01&end=2025-10-31
Response:
{
"logs": [...],
"signature_verification": {
"total_batches": 42,
"verified": 42,
"failed": 0,
"integrity_status": "OK"
}
}Optional: RocksDB SST-Files als Read-Only nach Signierung:
void sealSignedSAGABatch(const std::string& batch_id) {
// 1. Force Flush to SST
db_.flush();
// 2. Hole SST-File-Pfad fΓΌr Batch
auto sst_file = getSSTFileForBatch(batch_id);
// 3. Setze Read-Only (OS-Level)
chmod(sst_file.c_str(), 0444); // r--r--r--
// 4. Optional: Kopiere zu WORM-Storage (Write-Once-Read-Many)
copyToWORMStorage(sst_file);
}| Anforderung | Artikel | Implementierung | Status |
|---|---|---|---|
| VerschlΓΌsselung at-rest | Art. 32 | AES-256-GCM | β |
| Audit-Trail | Art. 30 | PKI-signierte SAGA-Logs | β |
| Recht auf Vergessenwerden | Art. 17 |
erasePII() mit UUID-LΓΆschung |
β |
| Datenminimierung | Art. 5(1)(c) | Auto-Anonymisierung | β |
| Privacy by Design | Art. 25 | PII-Detection bei Import | β |
| Meldepflicht Datenpanne | Art. 33 | Security-Event-Logging | β |
| Verarbeitungsverzeichnis | Art. 30 | Auto-Generierung /compliance/gdpr/article30
|
β |
| Anforderung | Section | Implementierung | Status |
|---|---|---|---|
| Access Controls | Β§164.312(a)(1) | RBAC + ABAC | β |
| Audit Controls | Β§164.312(b) | Structured Audit-Logs | β |
| Integrity Controls | Β§164.312(c)(1) | PKI-Signaturen | β |
| Transmission Security | Β§164.312(e)(1) | TLS 1.3 + mTLS | β |
| Encryption at Rest | Β§164.312(a)(2)(iv) | AES-256-GCM | β |
| Log Retention | Β§164.316(b)(2)(i) | 10 Jahre fΓΌr Medical Records | β |
| Kontrolle | Beschreibung | Implementierung | Status |
|---|---|---|---|
| ORP-4 | Datenschutzbeauftragter | Config: dpo@example.com
|
β |
| OPS-11 | Protokollierung | Structured JSON-Logs | β |
| OPS-12 | Γberwachung | SIEM-Export | β |
| IAM-01 | IdentitΓ€tsmanagement | VCC-User Integration | β |
| IAM-03 | Zugriffsrechte | RBAC + Policy Engine | β |
| CRY-01 | VerschlΓΌsselung | AES-256-GCM | β |
| CRY-02 | SchlΓΌsselmanagement | VCC-PKI Integration | β |
- β SAGA-Log-Erweiterung mit Batch-Collection
- β VCC-PKI REST-Client fΓΌr Signierung
- β LEK (Log Encryption Key) Rotation-Logik
- β
AuditLoggermit spdlog JSON-Output
- β
PIIDetectormit Regex + Schema-Strategien - β UUID-Replacement in Entity-Import
- β
GovernancePolicyEnginemit YAML-Config - β Policy-Validation in Query-Engine
- β
RetentionManagermit Background-Sweep - β Cold-Storage-Export mit ZSTD + Encryption
- β Compliance-Report-Generierung (GDPR, HIPAA)
- β Integration-Tests fΓΌr alle Compliance-Features
- β NER (Named Entity Recognition) fΓΌr ML-basierte PII-Detection
- β Blockchain-Anchoring fΓΌr SAGA-Signaturen (zusΓ€tzliche UnverΓ€nderlichkeit)
- β GDPR-DSR-Workflow (Data Subject Request Automation)
- β Compliance-Dashboard (Web-UI fΓΌr DPO/CISO)
Diese Strategie definiert eine umfassende Compliance & Governance-Architektur fΓΌr ThemisDB:
- π PKI-signierte SAGA-Logs fΓΌr unverΓ€nderliche Audit-Trails
- π DSGVO by Design mit automatischer PII-Erkennung und UUID-Anonymisierung
- βοΈ Multi-Framework-Support (GDPR, HIPAA, BSI C5)
- π― Policy-Driven mit YAML/JSON-Konfiguration fΓΌr alle Governance-Regeln
- π Log-VerschlΓΌsselung mit tΓ€glicher LEK-Rotation
- π¦ Retention & Archival mit Cold-Storage-Export
- π Audit-Reports mit automatischer Signatur-Verifizierung
Kerntechnologien:
- VCC-PKI fΓΌr Signierung & VerschlΓΌsselung
- RocksDB fΓΌr unverΓ€nderliche Log-Storage
- spdlog fΓΌr Structured JSON-Logging
- YAML/JSON fΓΌr Policy-Konfiguration
Die Implementierung erfolgt in 10 Wochen mit vollstΓ€ndiger Integration in bestehende ThemisDB-Infrastruktur (Encryption, VCC-PKI, VCC-User).
ThemisDB 1.9.0-beta Β· Home Β· Wiki-Index Β· Module-Index Β· FAQ Β· Quick-Reference Β· GitHub Β· Issues Β· Discussions Β· License
- Batch Operations
- Best Practices
- CRUD Tutorial
- Custom Document Ingestion
- Getting Started Tutorial
- Interactive Examples
- Schema Design
- Video Tutorials
- AQL Reference
- AQL Examples
- AQL Overview
- AQL Feature Roadmap
- AQL Geospatial Guide
- AQL LLM Migration Guide
- AQL API
- AQL Grammar (EBNF)
- AQL Root Overview
- AQL Examples (root)
- API Reference
- API Module README
- OpenAPI Overview
- Client SDK Overview
- SDK Overview
- Operations
- Operations Overview
- Operations Runbook
- Operations Handbook
- ThemisCtl Admin Guide
- Pipeline E2E SOPs
- Deploy Overview
- Docker Overview
- Docker Hub README
- Helm Overview
- Packaging Overview
- Operator Overview
- Security Policy
- Production Hardening Checklist
- Security Hardening Guide
- Encryption Key Management
- Access Control Framework
- Zero Trust Policy
- API Authentication & Authorization
- HSM Production Setup
- PKCS11 Integration
- DSGVO / SOC2 Checklist
- Access Model Runbooks
- Access Model Dashboard
- Maturity Automation Runbook
- Access Review Automation
- Access Model Dashboard
- Access Model Runbooks
- Rights Revocation
- Dr Checklists
- Dr Testing
- Incident Response Playbook
- Incident Response Testing
- GPU Oom Recovery
- Grammar Debugging
- Metrics Scrape Troubleshooting
- Model Swap Procedure
- Quota Tuning
- Subagent Deployment
- Logging Configuration
- Content Model
- Crypto & Keys
- Feature Flags Reference
- Modular Architecture Roadmap
- Modularization Guide
- Module Architecture Index
- PostgreSQL Wire Protocol
- Query Scheduling
- Raft Consensus Design
- Resource Pooling
- Source Directory Guide
- Unified Access Model
- E1 001 Layered Retrieval Design
- E1 002 Ann Abstraction Strategy
- E1 003 Tensor Summary Types
- E1 004 Lora Package Distinction
- E1 005 Model Switch Compatibility
- E1 006 Federated Tensor Summaries
- E2 001 Evaluation Framework Design
- E2 002 Hardware Profile Strategy
- E2 003 Query Planner Routing Model
- E2 004 Approximation Governance Rules
- E2 005 Cross Layer Fallback Confidence Policy
- E3 001 Distributed Tensor Design
- E3 002 Manifest Coordination Strategy
- E3 003 Recovery And Erasure Choice
- E3 004 Tensor Fabric Infrastructure
- Contributing
- Contributing (root)
- Code of Conduct
- Support
- Maintainers
- CTest Guide
- Build Quick Reference
- Developer Wiki Index
- Build / Test / CI
- Module Index
- Branching Strategy
- Disabled Stub Policy
- Docs PR Policy
- GA Promotion Sign Off
- Github Milestones Setup
- Maturity Claim Verification Checklist
- Maturity Evidence Registry
- Merge Gate Bot Config
- Merge Gate Status Live
- Phase 1 Closure Report
- Phase Closure Policy
- Phase Dependency Graph
- Phase3 Enforcement Runbook
- Plugin Submodule Rollback
- PR Version Targeting
- PR Version Targeting Backfill
- Production Ready 2026 Delivery Plan
- Query Module Status
- Readme
- Release Promotion Gate Policy
- Release Validation Checklist
- Security Module 5671 Evidence Summary
- Sharding P6 Residual Risk Acceptance
- Sourcecode Compliance Governance
- Updates Development Status Sign Off
- Wave C Implementation Complete
- Blob Storage
- Cuda
- Ethics Ai
- Exporters
- Huggingface
- Image Analysis
- Importers
- RPC
- Scraper
- Themisdb Ai Watermark Detector
- User Storage Encrypted
- Chimera Architecture
- Chimera Future
- Chimera Readme
- Chimera Roadmap
- Covina Fastapi Ingestion Architecture
- Covina Fastapi Ingestion Future
- Covina Fastapi Ingestion Roadmap
- Vcc Base Architecture
- Vcc Base Future
- Vcc Base Roadmap
- Vcc Clara Ingestion Architecture
- Vcc Clara Ingestion Future
- Vcc Clara Ingestion Roadmap
- Vcc Veritas Architecture
- Vcc Veritas Future
- Vcc Veritas Roadmap
- 01 Hello World
- 02 Todo App
- 03 Contact Manager
- 04 Inventory System
- 05 Time Series Monitor
- 06 Graph Social Network
- 07 Vector Search Documents
- 08 Dms Erp System
- 09 Iot Sensor Network
- 10 Drone Image Analysis
- 11 Blog Wiki
- 12 Expense Tracker
- 13 Recipe Manager
- 14 Ecommerce Catalog
- 15 Event Management
- 16 Kanban Board
- 17 Crm
- 18 Realtime Chat
- 19 Recommendation Engine
- 20 Smart Home
- 21 Coding Platform
- 22 AQL Diagram Tool
- 23 Traveling Salesman
- 24 Moral Philosophy Debates
- API Versioning
- Distributed Sharding
- Feedback Plugins
- Geo
- Gnn
- Image Analysis
- Legal Lora Training
- LLM
- Lora Sync
- Migration
- Nlp
- Performance
- Railway
- Replication
- Rope Visualization
- Sample Product Config
- Security
- Client SDK Overview
- Quickstart
- Sdk Enhancements
- Sdk Implementation Summary
- Test Suite Readme
- Go
- Java
- Javascript
- Php
- Python
- Ruby
- Rust
- Typescript
- 01 Grundlegende Operationen
- 02 AQL Queries
- 03 Graph Daten
- 04 Multimodell Anwendung
- 01 Quickstart Guide
- 02 AQL Referenz Kurzuebersicht
- 03 Datenmodellierung Guide
- 04 Uebungsaufgaben
- 05 Best Practices Guide
- Training Documents
- Training Overview
- 01 Einfuehrung Und Uebersicht
- 02 Datenmodelle Und Architektur
- 03 AQL Abfragesprache
- 04 Installation Und Setup
- 05 Anwendungsbeispiele
- Training Presentations
- Dependencies Readme
- Processmonitor Readme
- Themis.admintools.shared Readme
- Themis.aqlquerybuilder Readme
- Themis.aqlquerybuilder Roadmap
- Themis.auditlogviewer Readme
- Themis.auditlogviewer Roadmap
- Themis.classificationdashboard Readme
- Themis.classificationdashboard Roadmap
- Themis.compliancereports Readme
- Themis.compliancereports Roadmap
- Themis.gisviewer.controlpanel Readme
- Themis.gisviewer.controlpanel Roadmap
- Themis.impactanalysisviewer Readme
- Themis.impactanalysisviewer Roadmap
- Themis.ingestiontool Readme
- Themis.ingestiontool Roadmap
- Themis.keyrotationdashboard Readme
- Themis.keyrotationdashboard Roadmap
- Themis.piimanager Readme
- Themis.piimanager Roadmap
- Themis.retentionmanager Readme
- Themis.retentionmanager Roadmap
- Themis.sagaverifier Readme
- Themis.sagaverifier Roadmap
- Themis.usbadmintool Readme
- Themis.usbadmintool Roadmap
- CI Readme
- CI Roadmap
- Compiler Diagnostics Readme
- Compiler Diagnostics Roadmap
- Completion Readme
- Copilot Ollama Router Readme
- Copilot Ollama Router Roadmap
- Gnn Readme
- Gnn Roadmap
- Rope Visualizer Readme
- Rope Visualizer Roadmap
- Tco Calculator Readme
- Tco Calculator Roadmap
- Tests Readme
- Tests Roadmap
- Themis Config Wx Readme
- Themis Docs Builder Readme
- Wikipedia Ingestion Readme