Ga naar inhoud

Trust Score

Trust Score is één getal tussen 0 en 100 dat de operationele betrouwbaarheid van je hele tenant samenvat. Geschikt voor je board-meeting; afgeleide bewijzen voor je auditor.

Component Gewicht Bron
Patch hygiene 30% inventory_dependency_cves + cve_matches, KEV/EPSS-gewogen, age-since-fix
Agent health 20% agents.last_seen_at + version-currency, excluding agents in maintenance window
Secrets exposure 15% inventory_security_findings open vs resolved
Configuration drift 15% process_dna + config_file_baselines (zie Drift detection) + MCP-toolschema-drift (onbevestigde wijzigingen, zie Agent-kanalen)
EAT resolution discipline 10% emergency_tokens: % met exit_code = 0 vs gefaald
Evidence continuity 10% (0% voor tenants < 90d) maandelijkse audit-pack coverage

Score = gewogen gemiddelde, met blanked componenten herverdeeld.

Nieuwe tenants hebben per definitie nul evidence-continuity. Dat zou hun score artificieel laag maken. Daarom:

Tenant-leeftijd Evidence-continuity weight Herverdeeld naar
< 30 dagen 0% patch_hygiene +5, agent_health +5
30: 90 dagen 5% patch_hygiene +2, agent_health +1, secrets +1, drift +1
≥ 90 dagen 10% (volledig) -

Het dashboard toont een blauwe banner “tenant {N} dagen oud: score wordt volledig vanaf dag 90” zodat de operator niet schrikt van een tijdelijk hoge score.

Een agent binnen een actieve maintenance_windows row krijgt geen heartbeat-penalty in agent_health. Geplande downtime ≠ ongezond. Belangrijk voor NIS2-rapportage: je wilt geen score-dip alleen omdat je een upgrade hebt aangekondigd.

Componenten zonder onderliggende data worden geblancht:

  • configuration_drift blanked als agent op binary < v1823 (geen config_hashes rapportage)
  • evidence_continuity blanked tijdens bootstrap (< 30d)

De score loopt door op de overige componenten, gewichten worden geherverdeeld. UI toont in de breakdown welke componenten geblancht zijn en waarom: geen verborgen leeg getal.

TrustScoreWorker draait elke 30 minuten:

  • per agent → row in trust_score_snapshots (agent_id NOT NULL)
  • per tenant → aggregate row (agent_id IS NULL)

Idempotent via inputs_hash: geen duplicate rows wanneer niets is veranderd binnen het uur.

  • /trust-score: tenant aggregate met sparkline + 6-component breakdown
  • /trust-score/agents/[id]: per-agent score + component-evidence-counts
  • Mobile PWA /m/trust-score: quick-glance gauge
GET /api/v1/trust-score/v12/tenant?range=30d|90d|365d
GET /api/v1/trust-score/v12/agents/:id?range=30d|90d|365d

Beide vereisen viewer role.

Standaard weights uit trust_score_weights table. Override per tenant door een rij in te voegen met tenant_id IS NOT NULL en je eigen config JSON. Geen breaking change: bestaande weights versions blijven naast nieuwe leven.

Een server die zich al meer dan een uur niet meldt (buiten een onderhoudsvenster), een gearchiveerde server of een server zonder één beoordeelbaar onderdeel krijgt geen score, met de reden erbij. Vroeger hield zo een server zijn laatste getal; een server die 67 dagen stil was, kon zo groen blijven. De score van de tenant is het gemiddelde van de servers die wel verse data leveren; is er geen enkele, dan is er geen tenantscore (vroeger een neutrale 70).