9
distinct OCSF event classes AWS Security Lake maps its natively supported AWS sources to under schema version 1.1.0
1.1.0
OCSF schema version AWS Security Lake's native mappings moved to from 1.0.0-rc.2, splitting one event class into three
5
steps in a versioned OCSF pipeline: map, transform, version, gate, validate

SponsoredHorizon3.ai

Proactive Security for the AI Era

NodeZero continuously and autonomously pentests infrastructure, identity, cloud, and now web applications, chaining weaknesses across every domain the way real attackers do. Every finding ships with replayable proof showing exploitable business impact, not theoretical risk.

See NodeZero WebApp in action

A mid-size security team collecting logs from a firewall, an EDR agent, a cloud provider's audit trail, an identity provider, and a handful of SaaS applications is not managing one log format, it is managing five to fifteen of them, each with its own field names, timestamp formats, and severity scales. Writing a detection that correlates a suspicious login in the identity provider with a follow-on process execution on the endpoint means writing custom parsing logic for both sources first, and that logic breaks quietly every time either vendor changes a field. Ad hoc, source-by-source mapping does not scale past a handful of sources, and it gets worse over time rather than better, because every new source adds another one-off translation layer nobody fully documents. The Open Cybersecurity Schema Framework (OCSF) exists to solve the version of this problem that matters most: pick one normalized schema up front, map every source into it once, and let cross-source detections and queries be written against that shared schema instead of against each vendor's raw format. This guide covers how to build that mapping and transform layer, not how to audit detection rules you already have against MITRE ATT&CK; for that separate question, see our comparison of detection posture management platforms, which assumes you already have normalized, working telemetry and is asking whether your existing rules fire against it.

What OCSF Actually Standardizes

OCSF is an open schema standard, backed by AWS, Splunk, Palo Alto Networks, and a wider community of vendors and practitioners through the OCSF project (published and browsable at schema.ocsf.io), not a single vendor's proprietary data model. It organizes security telemetry around four building blocks. Categories group related event classes by domain, for example System Activity, Findings, Network Activity, or Identity and Access Management. Event classes are the concrete, structured record types inside those categories, DNS Activity, Authentication, API Activity, and HTTP Activity are examples of individual event classes with their own defined attributes. Profiles are optional attribute sets layered on top of a base event class, for instance overlaying a cloud-specific or a malware-specific set of fields onto a class without forking the class itself. Extensions let a vendor or organization add custom attributes for data that does not fit the base schema, without breaking a consumer that only understands the base attributes. Every event carries an explicit metadata.version field identifying which OCSF schema version it was produced against, which is the mechanism the rest of this guide leans on for safe schema evolution.

Prerequisites

Before starting the mapping work, have the following in place. Building the transform layer without them means redoing foundational decisions mid-project.

A defined, finite list of source log types

Know exactly which log sources are in scope for the first pass, firewall, EDR, cloud audit trail, identity provider, and so on, with a sample export of real (or realistic synthetic) events from each. Mapping against a moving, undefined list of sources is the most common reason this kind of project stalls.

A landing zone or object store for raw events

Raw, unmodified logs need to land somewhere before transformation, an S3 bucket, an equivalent object store, or a message queue with durable retention. Keeping the raw copy is what makes it possible to replay and re-normalize after a mapping bug is fixed, rather than losing history to a bad transform.

Basic ETL or pipeline tooling already running

This guide assumes a team already has some scheduled or streaming pipeline mechanism in place, a workflow orchestrator, a stream processor, or scheduled batch jobs, so the OCSF mapping is a new transform stage added to existing infrastructure rather than a request to stand up a data platform from nothing.

One person or small group who owns the schema mapping

The mapping needs a single owner, or a small owning group, who reviews every change to it. Distributed, ad hoc edits from whoever is touching a given source that week are exactly how mappings drift out of sync with what detections expect.

Free daily briefing

Briefings like this, every morning before 9am.

Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.

Step 1: Map Raw Source Fields to OCSF Event Classes and Categories

For each source, start from the OCSF schema browser rather than from the raw log, and identify the closest matching event class before looking at field names. A firewall's traffic log almost always maps to Network Activity; an identity provider's sign-in log maps to Authentication; a cloud provider's control-plane audit log maps to API Activity. Getting the class right first matters more than getting every field mapped on the first pass, because the class determines which attributes are expected, required, or optional, and which profiles are even applicable.

Once the class is chosen, build a field-level mapping table for that source: raw field name, raw field type, target OCSF attribute, and any transform needed (a Unix timestamp to ISO 8601, a vendor-specific severity string to OCSF's normalized severity_id enumeration, a raw source IP into OCSF's structured network endpoint object). AWS Security Lake's own natively supported source mappings are a useful concrete reference for how granular this gets in a real, working pipeline: CloudTrail management events map to API Activity, Authentication, or Account Change depending on the specific API call, Route 53 resolver logs map to DNS Activity, and VPC Flow Logs map to Network Activity, each with its own metadata.product.name, vendor_name, and feature.name values that identify the originating source inside the shared schema. Document every field that does not map cleanly, including source-specific fields with no OCSF equivalent, rather than silently dropping them; that decision belongs in the versioning step next, not buried in code with no record of why a field was left out.

Step 2: Build the Transform Layer That Applies the Mapping

Turn the mapping table from Step 1 into actual transform code, a set of per-source parsers or a rules-driven mapping engine that reads raw events from the landing zone and emits OCSF-shaped records. Two implementation choices matter here. First, keep transforms per-source rather than writing one large, branching function that tries to handle every source, so a change to one source's mapping cannot accidentally affect another's. Second, emit both the normalized OCSF record and a pointer back to the original raw event (an object store path and offset, or a raw event ID), so a normalization bug can be diagnosed and replayed against the original data rather than requiring the raw source to be re-collected.

Wherever the tooling allows it, express the field-level mapping as data (a configuration file or mapping table) rather than as hardcoded transform logic, so a mapping change for an existing source is a reviewable configuration diff, not a code change requiring a full deployment. This also makes Step 3's versioning meaningfully easier to enforce, since a mapping-as-data approach can be diffed and tagged the same way a schema itself is versioned.

Step 3: Version the Schema Mapping So It Can Evolve

Two different things need a version number here, and conflating them is a common source of confusion: the OCSF schema version itself (which the OCSF project publishes and evolves independently), and your own per-source mapping's version (which tracks how your transform code interprets a specific vendor's raw format against that schema). Pin both explicitly. Every normalized event should carry the OCSF schema version it was produced against in its metadata, exactly as OCSF's own metadata.version attribute is designed to do, and your mapping configuration for each source should carry its own version tag that only changes when the mapping logic for that source changes.

AWS Security Lake's own history is a useful real-world illustration of why this matters. Under OCSF schema version 1.0.0-rc.2, AWS Security Hub CSPM findings mapped to a single Security Finding event class. When Security Lake moved its natively supported sources to schema version 1.1.0, that single class was split into three, Vulnerability Finding, Compliance Finding, and Detection Finding, alongside two newly added sources (EKS Audit Logs and AWS WAFv2 Logs) with their own class mappings. Any detection or query that had hardcoded an expectation of a Security Finding class name needed to be updated when that version shipped. A pipeline that records which OCSF version and mapping version produced each event can make that kind of change an explicit, tracked upgrade; a pipeline that does not is left guessing why queries against older and newer data suddenly return inconsistent results.

Step 4: Add Schema-Drift Detection and Quality Gates

Upstream vendors change their log formats without warning far more often than the OCSF schema itself changes, a field gets renamed, a type changes from string to integer, a previously required field goes missing, or a new field appears that no mapping accounts for. Schema-drift detection means comparing every incoming batch of raw source events against the expected raw schema for that source, before the transform runs, and flagging anything that does not match: an unexpected new field, a missing required field, or a field whose type no longer matches what the mapping expects.

Treat that check as a hard quality gate, not an informational log line. A drift detector that only logs a warning gets ignored within a few weeks; a drift detector that blocks the affected batch from reaching the normalized data lake (routing it instead to a quarantine location for review) forces the mapping owner from Step 1's prerequisites to actually look at it before bad data reaches detections. Pair the pre-transform raw-schema check with a post-transform check that validates the OCSF output itself against the target event class's schema, catching the case where the raw data matched expectations but the transform logic itself produced a malformed or incomplete OCSF record.

Step 5: Validate Normalized Output Against the OCSF Schema

Before promoting a new source, or a change to an existing mapping, to production, validate its output against three things. First, the formal OCSF schema for the target event class and version, checking that required attributes are present, enumerations (severity_id, activity_id, and similar coded fields) hold valid values, and object-typed attributes (like the network endpoint or actor objects) are structurally complete rather than partially populated. Second, a small set of hand-built unit tests per source that assert specific known-good raw events produce specific known-good normalized output, so a future change to the transform code cannot silently alter behavior for a case nobody thought to check manually. Third, synthetic edge-case events, malformed timestamps, unexpected null fields, unusually large payloads, deliberately constructed to probe how the transform behaves on inputs that do not look like the clean sample data used to build the mapping in Step 1.

Validation: Confirming Round-Trip Correctness and Live Detection Fire Rates

Schema validation confirms the shape of the data is correct; it does not confirm the data is still meaningful once queried the way an analyst or a detection actually queries it. Close that gap with two additional checks before trusting a source in production. Round-trip validation means taking a known raw event, running it through the transform, and confirming the resulting OCSF record still resolves back to the correct real-world fact, the right actor, the right timestamp, the right outcome, not just the right field names. Detection-fire validation means taking detections already written against the OCSF schema and running them against a window of real, freshly normalized production data (not just the sample data used during mapping) to confirm they still fire at expected rates. A detection that goes silent, or a detection that suddenly fires far more than before, against newly normalized data is often the first visible sign of a mapping or drift problem, well before anyone notices the underlying schema issue directly. If a source's normalized events start tripping meaningfully more (or fewer) alerts than before a mapping change, run that shift through our detection rule signal-to-noise triage framework before assuming either the mapping or the detection logic is at fault; the triage framework helps separate a genuine new threat pattern from a normalization artifact.

Failure Cases

Three failure modes account for most of the real incidents teams report with OCSF normalization pipelines, and all three are addressed by the steps above when they are actually followed rather than skipped under deadline pressure.

A source vendor silently renames or retypes a field without a version bump

Vendors change log formats in a point release, a config update, or a backend migration, often without documenting the change anywhere a downstream consumer would see it. Without the pre-transform schema-drift check from Step 4, a renamed field simply stops populating the OCSF attribute it used to feed, and detections relying on that attribute go quiet with no error, no alert, and no obvious signal that anything changed.

Over-normalization strips source-specific fields a detection actually needs

Forcing every source strictly into the base OCSF event class, and discarding anything that does not have an obvious OCSF equivalent, is a common simplification that later turns into a detection gap. A vendor-specific field, a proprietary risk score, an internal classification tag, may carry signal no OCSF base attribute captures. OCSF's own extension mechanism exists for exactly this case; dropping the field instead of extending the schema for it quietly removes detection capability that existed in the raw data.

The ETL layer is under-provisioned for burst log volume

Normalization pipelines are usually sized against average daily volume, not the burst that arrives during an active incident, a ransomware event, a mass phishing campaign, or a DDoS attempt, which is precisely when log volume from firewalls, EDR, and identity providers spikes hardest and the normalized data is needed fastest. A transform layer that falls behind under burst load either backs up (delaying detections during the exact window they matter most) or drops events under backpressure, and either failure mode is invisible until the incident review afterward shows a gap in the normalized timeline.

Security Tradeoffs of Centralizing Normalized Telemetry

Building a single, normalized data lake is a deliberate concentration of value, and it comes with two tradeoffs that are easy to underweight while focused on the mapping mechanics. First, a data lake holding normalized security telemetry from every source in the environment, authentication events, endpoint activity, network flows, cloud audit trails, is a higher-value target than any single source system was on its own, because it is a one-stop view of the entire environment's security posture and history. That value needs its own access controls, encryption at rest and in transit, and audit logging on who queries it, scoped independently from the access controls on the original source systems, rather than inheriting whatever access model the least-restrictive source system happened to use.

Second, the normalization layer itself becomes a single point of failure for detection coverage, not just for data availability. A source system going down is a visible, alertable outage. A normalization transform silently mis-mapping or dropping a fraction of events from a source that is otherwise reporting healthy is invisible by comparison, and it directly and silently degrades every detection that depends on that source, across every downstream consumer of the normalized data at once. That is the practical argument for treating Steps 4 and 5 (drift detection and schema validation) as production-blocking controls rather than optional hardening, the normalization layer's own health is now load-bearing for detection coverage across the entire environment, not just for one source's pipeline.

The bottom line

An OCSF-normalized data lake trades the ongoing cost of ad hoc, per-source mapping for the upfront cost of building and maintaining a proper transform layer, and that trade only pays off if the mapping is versioned, drift-checked, and validated rather than treated as a one-time project. Map each source to the right OCSF event class before worrying about individual fields, version both the OCSF schema and your own mapping logic explicitly, gate every batch against schema drift before it reaches production data, and validate normalized output against real detections, not just against the schema's shape. Centralizing telemetry this way raises the value of the data lake as a target and makes the normalization layer itself load-bearing for detection coverage, so its access controls and its quality gates deserve the same operational seriousness as the detections built on top of it.

Frequently asked questions

What is OCSF and why use it to normalize a security data lake?

OCSF (Open Cybersecurity Schema Framework) is an open, vendor-neutral schema for security telemetry, backed by AWS, Splunk, Palo Alto Networks, and a wider community, organized into categories, event classes, profiles, and extensions. Normalizing raw logs into OCSF lets a team write detections and queries once against a shared schema instead of once per vendor's raw log format.

What is the difference between an OCSF event class, a category, and a profile?

A category groups related event types by domain, such as Network Activity or Findings. An event class is the concrete, structured record type inside a category, such as DNS Activity or Authentication. A profile is an optional set of additional attributes layered onto an event class, such as cloud-specific or malware-specific fields, without forking the base class itself.

How do you handle a vendor changing a log format without warning?

Add a pre-transform schema-drift check that compares every incoming batch against the expected raw schema for that source, and treat a mismatch as a hard quality gate that quarantines the affected batch rather than a warning that gets logged and ignored. This is what prevents a silent vendor field rename from corrupting normalized data undetected.

Should every raw log field be forced into an OCSF attribute?

No. Forcing every field into the base OCSF schema and discarding what does not fit is a common cause of lost detection capability, since a vendor-specific field with no OCSF equivalent may still carry real signal. OCSF's extension mechanism exists to carry that data forward without breaking consumers that only read the base schema.

How do you validate that an OCSF normalization pipeline is actually working correctly?

Validate at three levels: the normalized output conforms to the formal OCSF schema for its event class and version, known-good raw events produce known-good normalized output through unit tests, and detections already built against the OCSF schema still fire at expected rates against fresh, real production data, not just against the sample data used to build the original mapping.

What are the security risks of centralizing normalized telemetry in one data lake?

Centralizing normalized security telemetry from every source into one lake raises its value as an attacker target, requiring access controls, encryption, and audit logging scoped independently of the original source systems. It also makes the normalization layer itself a single point of failure for detection coverage, since a silent mapping error can degrade every detection relying on that data at once.

Sources & references

  1. Apriorit - Open Cybersecurity Schema Framework (OCSF) Implementation Guide
  2. AWS Security Lake - Open Cybersecurity Schema Framework (OCSF) in Security Lake
  3. OCSF Schema Browser
  4. ocsf/ocsf-schema - GitHub repository and changelog
  5. Databahn - Maintaining OCSF Compliance at Enterprise Scale: The Schema Drift Challenge

Free resources

25
Free download

Critical CVE Reference Card 2025–2026

25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.

No spam. Unsubscribe anytime.

Free download

Ransomware Incident Response Playbook

Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.

No spam. Unsubscribe anytime.

Free newsletter

Get threat intel before your inbox does.

50,000+ security professionals read Decryption Digest for early warnings on zero-days, ransomware, and nation-state campaigns. Free, daily, no spam.

Unsubscribe anytime. We never sell your data.

Eric Bang
Author

Founder & Cybersecurity Evangelist, Decryption Digest

Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.

Giveaway: InfoSec World 2026 All Access Pass ($3,895 value)

Details →
Daily Briefing

Subscribe to enter the giveaway

Every subscriber is automatically entered. You also get daily threat intel every morning: zero-days, ransomware, and nation-state campaigns. Free. No spam.

Already subscribed? You're already entered.

Giveaway

Win a $3,895 InfoSec World 2026 pass.