SentriScope Connector Architecture
Governed connector ingestion lifecycle, idempotency model, supported integrations, trust tiers, and control effectiveness strategy.
1. Overview
The connector architecture provides governed, idempotent, tenant-safe ingestion from all external security data sources. No ingestion may bypass canonical boundaries. Every connector follows the same lifecycle, validation, and audit pattern.
2. ConnectorSession Lifecycle
The CanonicalConnectorSession model manages connector state:
| Field | Description |
|---|---|
id |
UUID primary key |
tenant |
FK to Tenant (always scoped) |
name |
Human-readable session name |
connector_type |
FK to ConnectorType registry |
connector_config |
JSON: api_base_url, sync_strategy, rate_limit_config |
credential secret reference |
Pointer to Secrets Manager — never plaintext |
health_status |
Healthy, Degraded, Failed |
last_sync_status |
Success, Failed, Running |
last_sync_at |
Timestamp of last successful sync |
last_error_message |
Sanitized error (no credentials, no raw tokens) |
is_enabled |
Boolean — disabled sessions do not run |
created_by |
FK to User (nullable for system-created) |
3. Ingestion Flow
Every connector follows this pattern:
1. run_connector_with_tenant(session, fn)
├── Set tenant context from session
├── Open transaction
├── assert_tenant_context_set()
└── fn() (connector logic)
│
2. validate_external_payload(payload, ...)
├── external_id required
├── source_system required
├── No tenant_id from payload (tenant from context only)
├── Reject if tenant context not set
└── Severity normalization enforced when required
│
3. upsert_by_external_id(model, ...)
├── Unique key: (tenant_id, source_system, external_id)
├── No overwrite of immutable fields (id, canonical_id, tenant_id, created_at)
└── Audit: DATA_CREATED or DATA_UPDATED with connector_type, external_id
4. create_risk_snapshot(tenant, profile) [after successful ingestion]
4. Canonical Write Constraints
All canonical writes must:
| Constraint | Rule |
|---|---|
tenant_id source |
From execution context only — never from payload |
source_system |
Required — identifies the connector |
external_id |
Required — deduplication key per source |
source_updated_at |
Required — provenance timestamp |
severity_normalized |
Required for exposures/findings |
| Tenant context | Reject if get_current_tenant() is None |
5. Idempotency Model
Idempotency prevents duplicate creation and enables safe re-sync:
- Key:
(tenant_id, source_system, external_id) - Behavior:
get_or_createwith that key; on match, update non-immutable fields only - Immutable fields:
id,canonical_id,tenant_id,created_at— never overwritten - Same ingestion twice: produces identical
content_hash(determinism guarantee)
6. Error Handling Model
| Error Type | Behavior |
|---|---|
| Execution failure | Update session: last_error_message (sanitized), last_sync_status=Failed, health_status=Degraded; log warning; re-raise |
| Validation failure | IngestionGuardrailError raised; no write proceeds |
| Audit | DATA_CREATED/DATA_UPDATED with connector_type, external_id, canonical_id — no credentials |
7. Supported Connectors
CMDB Connectors
| Connector | Slug | Models Fed |
|---|---|---|
| ServiceNow CMDB | SERVICENOW_CMDB |
CanonicalAsset, CanonicalApplication, CanonicalAssetRelationship |
| Jira Service Management Assets | JSM_ASSETS_CMDB |
CanonicalAsset, CanonicalApplication, CanonicalAssetRelationship |
Vulnerability Scanners
| Connector | Slug | Models Fed |
|---|---|---|
| Tenable Vulnerability Scan | TENABLE_VULNERABILITY |
CanonicalAsset, CanonicalExposure, CanonicalVulnerability |
| Qualys VMDR | QUALYS_VM |
CanonicalAsset, CanonicalExposure, CanonicalVulnerability |
EDR / Endpoint Security
| Connector | Slug | Models Fed |
|---|---|---|
| Microsoft Defender for Endpoint | MICROSOFT_DEFENDER_ENDPOINT |
CanonicalAsset, CanonicalExposure, CanonicalIncident |
| SentinelOne Singularity | SENTINELONE_SINGULARITY |
CanonicalAsset, CanonicalIncident |
| CrowdStrike Falcon | CROWDSTRIKE_FALCON |
CanonicalAsset, CanonicalIncident |
| Palo Alto Cortex XDR | PALOALTO_CORTEX_XDR |
CanonicalAsset, CanonicalIncident |
| Trellix ENS / ePO | TRELLIX_ENS |
CanonicalAsset, CanonicalIncident |
Network / OT / Cloud
| Connector | Slug | Models Fed |
|---|---|---|
| Akamai Guardicore Segmentation | AKAMAI_GUARDICORE |
CanonicalAsset, CanonicalAssetNetworkFlow, CanonicalSegmentationPolicy |
| Nozomi Vantage | NOZOMI_VANTAGE |
CanonicalAsset (OT assets) |
| Palo Alto Cortex Cloud (Prisma) | PALOALTO_CORTEX_CLOUD |
CanonicalAsset, CanonicalExposure, CanonicalVulnerability |
Identity
| Connector | Slug | Models Fed |
|---|---|---|
| Microsoft Entra ID | ENTRA_ID |
CanonicalIdentity, CanonicalIdentityCredential, CanonicalIdentityAuthEvent |
Security Ratings and DRP
| Connector | Slug | Models Fed |
|---|---|---|
| SecurityScorecard | SECURITY_SCORECARD |
CanonicalAsset, CanonicalExposure |
| Tempest Prospero DRP | TEMPEST_PROSPERO_DRP |
CanonicalExposure, CanonicalAsset, CanonicalIdentity, CanonicalCredentialLeak |
8. Connector Trust Levels
| Trust Tier | Auth Method | Payload Validation |
|---|---|---|
| Tier 1 | API key / OAuth2 | Standard guardrails |
| Tier 2 | OAuth2 + token refresh | Standard guardrails + replay protection |
| Tier 3 | Webhook (push) | Full payload signature verification + timestamp check + nonce |
All connectors enforce rate limits per tenant. Retry strategy: MAX_RETRIES=5, exponential backoff + jitter, cap 120s. No retry on 401/403.
9. Sync Modes
| Mode | Description |
|---|---|
FULL |
Fetch all records from source (default) |
SINCE_LAST_SYNC |
Fetch only records updated since session.last_sync_at |
last_sync_at is updated only on successful run. Partial or failed runs do not advance the watermark.
10. Severity Normalization in Connectors
All connectors must use:
normalize_severity(
value,
source_system="CONNECTOR_SLUG",
source_scale=SOURCE_SCALE_0_10 | SOURCE_SCALE_0_100
)
source_scale must be explicit — inference is forbidden. Categorical severity (critical/high/medium/low/info) is mapped to numeric before normalization.
11. Control Effectiveness Strategy
Security controls are assessed against assets using SecurityCoverage:
- Control coverage: Which controls are deployed on which assets/segments
- Effectiveness score: 0–100 based on deployment quality, configuration, and gap analysis
- Risk influence: Coverage effectiveness reduces
residual_risk_scoreinRiskSnapshotItem
| Coverage Quality | Effectiveness Score | Risk Reduction |
|---|---|---|
| Full, well-configured | 80–100 | High reduction |
| Partial or degraded | 40–79 | Medium reduction |
| Missing or failed | 0–39 | No reduction |
Control effectiveness feeds the risk scoring engine after canonical ingestion.
12. Run ID and Traceability
Every connector run generates a run_id (UUID):
- Included in all audit events for this run
- Stored in session.connector_config["last_run_id"]
- Returned in API response for correlation
- Audit metadata: run_id, connector_type, session_id, asset_count, exposure_count, duration_ms