Builders¶
builders
¶
Map our domain signals onto OCSF Detection Finding (class_uid 2004) models.
The builder returns a typed, already-valid DetectionFinding instance. All
OCSF-specific knowledge (field names, *_id integers, defaults) is confined
to this module and defaults.
build_observable
¶
build_observable(observable: Observable) -> Observable
Map one domain Observable to an OCSF observable model.
OCSF observable.name is the attribute name/path and is required in
1.1.0. When the caller does not supply one we fall back to the observable
type's label (e.g. "ip_address").
Source code in src/ocsf_emitter/builders.py
build_attack
¶
build_attack(attack: MitreAttack) -> Attack
Map a MitreAttack to an OCSF attack object (technique [+ tactic]).
Source code in src/ocsf_emitter/builders.py
build_detection_finding
¶
build_detection_finding(
*,
title: str,
severity: Severity,
message: str,
uid: str | None = None,
observables: Sequence[Observable] | None = None,
activity: Activity = CREATE,
status: Status = NEW,
description: str | None = None,
time_ms: int | None = None,
data_sources: Sequence[str] | None = None,
confidence: Confidence | None = None,
confidence_score: int | None = None,
risk_level: RiskLevel | None = None,
risk_score: int | None = None,
attacks: Sequence[MitreAttack] | None = None,
count: int | None = None,
first_seen_ms: int | None = None,
last_seen_ms: int | None = None,
product: Product | None = None,
clock: Callable[[], int] = _now_ms,
uid_factory: Callable[[], str] = _new_uid,
) -> DetectionFinding
Build a typed, valid OCSF Detection Finding from our fields.
This is the primary entry point. It stamps house defaults (metadata, product, schema version, activity/severity/status mappings, event time) so every finding leaves with a consistent shape.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
title
|
str
|
Short human-facing finding title. |
required |
severity
|
Severity
|
Our severity; mapped to OCSF |
required |
message
|
str
|
Human-readable description of the detection. |
required |
uid
|
str | None
|
Stable unique id (OCSF |
None
|
observables
|
Sequence[Observable] | None
|
Entities the finding refers to. |
None
|
activity
|
Activity
|
Lifecycle activity; drives |
CREATE
|
status
|
Status
|
Triage status; mapped to OCSF |
NEW
|
description
|
str | None
|
Longer detail, stored on |
None
|
time_ms
|
int | None
|
Event time (epoch ms). Defaults to |
None
|
data_sources
|
Sequence[str] | None
|
Provenance, stored on |
None
|
confidence
|
Confidence | None
|
Detector confidence; mapped to |
None
|
confidence_score
|
int | None
|
Numeric confidence (0-100), stored on |
None
|
risk_level
|
RiskLevel | None
|
Risk assessment; mapped to |
None
|
risk_score
|
int | None
|
Numeric risk score, stored on |
None
|
attacks
|
Sequence[MitreAttack] | None
|
MITRE ATT&CK references, stored on |
None
|
count
|
int | None
|
Observation count, stored on |
None
|
first_seen_ms
|
int | None
|
First observation time (epoch ms) -> finding_info.first_seen_time. |
None
|
last_seen_ms
|
int | None
|
Last observation time (epoch ms) -> finding_info.last_seen_time. |
None
|
product
|
Product | None
|
OCSF Product to stamp; defaults to the process-wide product set
via |
None
|
clock
|
Callable[[], int]
|
Injectable time source (epoch ms) for deterministic tests. |
_now_ms
|
uid_factory
|
Callable[[], str]
|
Injectable uid source for deterministic tests. |
_new_uid
|
Returns:
| Type | Description |
|---|---|
DetectionFinding
|
A |
DetectionFinding
|
construction; call :func: |
DetectionFinding
|
for the full pre-flight check. |
Source code in src/ocsf_emitter/builders.py
build_from_signal
¶
build_from_signal(
signal: DetectionSignal,
*,
product: Product | None = None,
clock: Callable[[], int] = _now_ms,
) -> DetectionFinding
Build an OCSF Detection Finding from a fully-formed domain signal.
product overrides the process-wide default set via
defaults.configure_product. If neither is set, raises
:class:OcsfEmitterError rather than emitting an unattributed finding.