Skip to content

CISO Assistant ↔ Knowledge Graph (bidirectional, OWL/RDF-native)

CONCEPT:AU-KG.enrichment.ciso-assistant-extraction (extractor) · CONCEPT:AU-KG.enrichment.ciso-2 (writeback sink)

intuitem CISO Assistant is the homelab's open-source GRC system-of-record (Risk, Compliance & Audit, AppSec, TPRM, BIA, Privacy). This connector federates its governance data with the one ontology-driven Knowledge Graph hub — bidirectionally — and, through that hub, reconciles it with the Egeria open-metadata catalog and the Camunda business-process estate that already live in the graph.

The one ontology

CISO Assistant records are mapped to the canonical governance classes shared across the ecosystem (the same classes the Egeria extractor emits, see ontology_egeria.ttl / ontology_enterprise.ttl), so they reconcile by GUID / qualifiedName rather than living in a CISO-specific schema:

CISO Assistant object KG node (idtype)
policy ciso_assistant_policy:{id}Policy
applied / reference control ciso_assistant_control:{id}Control
risk scenario ciso_assistant_risk:{id}Risk
threat ciso_assistant_threat:{id}Threat
risk assessment ciso_assistant_risk_assessment:{id}RiskAssessment
compliance assessment ciso_assistant_compliance_assessment:{id}ComplianceAssessment
framework ciso_assistant_framework:{id}Framework
asset ciso_assistant_asset:{id}Asset
incident ciso_assistant_incident:{id}Incident
third-party entity ciso_assistant_entity:{id}Entity

Every node carries domain="ciso_assistant", externalToolId (the CISO uuid) and qualifiedName (the CISO urn/ref_id) — the federation keys.

Inbound — ingest CISO Assistant INTO the KG

enrichment/extractors/ciso_assistant.py (CATEGORY="ciso_assistant", self-registering) consumes the injected ciso_assistant_api.Api facade, calling its generated list methods (api_policies_list, api_applied_controls_list, api_risk_scenarios_list, api_compliance_assessments_list, …) and emitting:

  • Nodes — the canonical mapping above.
  • Internal edgesRisk —MITIGATED_BY→ Control, Risk —PART_OF→ RiskAssessment, ComplianceAssessment —CONFORMS_TO→ Framework.

The extractor is import-safe (no CISO imports at module top; client is None yields an empty batch) and tolerant of partial client surfaces.

The crosswalk — CISO ↔ Egeria ↔ Camunda

Reconciliation is the established ALIGNED_WITH equivalence pattern. When a CISO record carries an explicit twin id (populated by an operator mapping field), the extractor emits an ALIGNED_WITH edge to the twin's deterministic node id:

  • a CISO control/policy with an Egeria GUID → ALIGNED_WITH egeria_policy:{guid}
  • a CISO risk/compliance process with a Camunda/BPMN id → ALIGNED_WITH bpmn_process:{id}

The OWL reasoner (run after every materialize via OntologyReasoningDriver) treats ALIGNED_WITH as sameAs, so a CISO control aligned to an Egeria policy, or a CISO compliance process aligned to a Camunda process, collapses into one logical concept — governance intelligence then transits CISO ↔ Egeria ↔ Camunda. Absent an explicit twin id, the shared qualifiedName/name lets the reasoner reconcile by sameAs. No edits to the existing Egeria/Camunda connectors are needed — they already mint the canonical, deterministically-keyed twin nodes.

Outbound — enrich data back INTO CISO Assistant

enrichment/writeback/sinks/ciso_assistant.py (CisoAssistantSink, domain="ciso_assistant") pushes KG-derived governance entities back as CISO objects via the generated api_*_create methods (Policy/Control/Asset/ Finding/SecurityException/Entity). It is standard tier, fail-closed, dry-run-first: live writes require CISO_ASSISTANT_ENABLE_WRITE, and every CISO object must name a folder (domain) — never guessed; missing-folder creations are skipped, not invented.

Components

Path Role
enrichment/extractors/ciso_assistant.py inbound extractor (AU-KG.enrichment.ciso-assistant-extraction)
enrichment/writeback/sinks/ciso_assistant.py outbound sink (AU-KG.enrichment.ciso-2)
enrichment/materialize.py _CLIENT_MODULES["ciso_assistant"]="ciso_assistant_api", MATERIALIZE_SOURCES membership
agents/ciso-assistant-api the ciso_assistant_api.Api client / MCP / agent (CONCEPT:AU-ECO.connector.ciso-assistant)

Configuration

The connector resolves its vendor client in-process from the ciso_assistant_api package's auth.get_client() — which reads CISO_ASSISTANT_URL + CISO_ASSISTANT_TOKEN (or CISO_ASSISTANT_USERNAME / CISO_ASSISTANT_PASSWORD) from its own environment. Writeback is gated by CISO_ASSISTANT_ENABLE_WRITE (default off).

Verification

# inbound, live (needs a running CISO Assistant backend + the package installed)
source_sync(source="ciso_assistant", mode="delta")   # via served MCP
source_sync(source="ciso_assistant", mode="delta")   # re-run → skipped_unchanged > 0

# outbound writeback dry-run (fail-closed; CISO_ASSISTANT_ENABLE_WRITE unset)
graph_writeback(target="ciso_assistant", dry_run=True)   # proposals only, created == 0

# unit
pytest tests/unit/knowledge_graph/enrichment/test_ciso_assistant_extractor.py \
       tests/unit/knowledge_graph/enrichment/test_ciso_assistant_writeback.py -q

See also Camunda + ARIS ↔ KG and KG Connectors, Ingestors & Enrichers.