Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

A local, file-based detection workflow lab for reviewer-verifiable telemetry and detection demos.

Latest milestone: [v0.6.0 — fourth demo and config-change investigation](https://github.com/stacknil/telemetry-lab/releases/latest).
Current focus: v1 reviewer contract stabilization for the five-demo matrix.

Latest tagged release: [v0.6.0 — fourth demo and config-change investigation](https://github.com/stacknil/telemetry-lab/releases/latest).

## Reviewer Start

Expand Down
10 changes: 10 additions & 0 deletions demos/cloud-iam-change-investigation-demo/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,16 @@ Every input record includes this CloudTrail-like skeleton:
- `responseElements`
- `eventID`

Optional input fields:

- `observedTime`

## Time Model

- `eventTime` is normalized to `event_time` and drives sorting, bounded correlation, and signal timing.
- optional `observedTime` is preserved as `observed_time` when present, but it is not used for detection ordering.
- committed artifacts avoid `artifact_generated_at` so the demo output remains deterministic across local reruns.

AWS CloudTrail documentation describes event record contents for who made a request, the service and action, request parameters, response data, errors, source IP, user agent, Region, time, and event ID. This demo uses a synthetic subset of that shape for local review only.

Reference:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ It uses no live AWS account, no real account IDs, no realtime ingestion, and no
- normalized_events: 14
- investigation_signals: 5
- attack_mapping_count: 5
- time_model: eventTime is normalized to event_time; optional observedTime is preserved as observed_time but not used for detection ordering

## Signals

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
"evidence_events": [
{
"eventID": "evt-cti-001",
"event_time": "2026-04-07T10:00:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:00:00Z",
"actor": "USER_A",
"eventSource": "signin.amazonaws.com",
Expand All @@ -29,6 +31,8 @@
},
{
"eventID": "evt-cti-002",
"event_time": "2026-04-07T10:01:20Z",
"observed_time": null,
"eventTime": "2026-04-07T10:01:20Z",
"actor": "USER_A",
"eventSource": "signin.amazonaws.com",
Expand All @@ -40,6 +44,8 @@
},
{
"eventID": "evt-cti-003",
"event_time": "2026-04-07T10:03:05Z",
"observed_time": null,
"eventTime": "2026-04-07T10:03:05Z",
"actor": "USER_A",
"eventSource": "signin.amazonaws.com",
Expand Down Expand Up @@ -87,6 +93,8 @@
"evidence_events": [
{
"eventID": "evt-cti-001",
"event_time": "2026-04-07T10:00:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:00:00Z",
"actor": "USER_A",
"eventSource": "signin.amazonaws.com",
Expand All @@ -98,6 +106,8 @@
},
{
"eventID": "evt-cti-002",
"event_time": "2026-04-07T10:01:20Z",
"observed_time": null,
"eventTime": "2026-04-07T10:01:20Z",
"actor": "USER_A",
"eventSource": "signin.amazonaws.com",
Expand All @@ -109,6 +119,8 @@
},
{
"eventID": "evt-cti-003",
"event_time": "2026-04-07T10:03:05Z",
"observed_time": null,
"eventTime": "2026-04-07T10:03:05Z",
"actor": "USER_A",
"eventSource": "signin.amazonaws.com",
Expand All @@ -120,6 +132,8 @@
},
{
"eventID": "evt-cti-005",
"event_time": "2026-04-07T10:05:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:05:00Z",
"actor": "USER_A",
"eventSource": "iam.amazonaws.com",
Expand Down Expand Up @@ -166,6 +180,8 @@
"evidence_events": [
{
"eventID": "evt-cti-006",
"event_time": "2026-04-07T10:08:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:08:00Z",
"actor": "USER_A",
"eventSource": "iam.amazonaws.com",
Expand Down Expand Up @@ -209,6 +225,8 @@
"evidence_events": [
{
"eventID": "evt-cti-005",
"event_time": "2026-04-07T10:05:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:05:00Z",
"actor": "USER_A",
"eventSource": "iam.amazonaws.com",
Expand All @@ -222,6 +240,8 @@
},
{
"eventID": "evt-cti-006",
"event_time": "2026-04-07T10:08:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:08:00Z",
"actor": "USER_A",
"eventSource": "iam.amazonaws.com",
Expand All @@ -236,6 +256,8 @@
},
{
"eventID": "evt-cti-007",
"event_time": "2026-04-07T10:10:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:10:00Z",
"actor": "USER_A",
"eventSource": "cloudtrail.amazonaws.com",
Expand Down Expand Up @@ -284,6 +306,8 @@
"evidence_events": [
{
"eventID": "evt-cti-005",
"event_time": "2026-04-07T10:05:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:05:00Z",
"actor": "USER_A",
"eventSource": "iam.amazonaws.com",
Expand All @@ -297,6 +321,8 @@
},
{
"eventID": "evt-cti-006",
"event_time": "2026-04-07T10:08:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:08:00Z",
"actor": "USER_A",
"eventSource": "iam.amazonaws.com",
Expand All @@ -311,6 +337,8 @@
},
{
"eventID": "evt-cti-008",
"event_time": "2026-04-07T10:13:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:13:00Z",
"actor": "USER_A",
"eventSource": "ec2.amazonaws.com",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
"security_group_ingress_opened_after_identity_change": 1
},
"attack_mapping_count": 5,
"time_model": {
"event_time_source": "eventTime",
"observed_time_source": "observedTime when present",
"detection_ordering": "event_time",
"observed_time_event_count": 0
},
"boundaries": [
"Synthetic CloudTrail-like events only",
"No live AWS account",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
[
{
"eventID": "evt-cti-001",
"event_time": "2026-04-07T10:00:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:00:00Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand All @@ -26,6 +28,8 @@
},
{
"eventID": "evt-cti-002",
"event_time": "2026-04-07T10:01:20Z",
"observed_time": null,
"eventTime": "2026-04-07T10:01:20Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand All @@ -51,6 +55,8 @@
},
{
"eventID": "evt-cti-003",
"event_time": "2026-04-07T10:03:05Z",
"observed_time": null,
"eventTime": "2026-04-07T10:03:05Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand All @@ -76,6 +82,8 @@
},
{
"eventID": "evt-cti-004",
"event_time": "2026-04-07T10:04:10Z",
"observed_time": null,
"eventTime": "2026-04-07T10:04:10Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand All @@ -101,6 +109,8 @@
},
{
"eventID": "evt-cti-005",
"event_time": "2026-04-07T10:05:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:05:00Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand Down Expand Up @@ -131,6 +141,8 @@
},
{
"eventID": "evt-cti-006",
"event_time": "2026-04-07T10:08:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:08:00Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand All @@ -156,6 +168,8 @@
},
{
"eventID": "evt-cti-007",
"event_time": "2026-04-07T10:10:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:10:00Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand All @@ -180,6 +194,8 @@
},
{
"eventID": "evt-cti-008",
"event_time": "2026-04-07T10:13:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:13:00Z",
"actor": "USER_A",
"identityType": "IAMUser",
Expand Down Expand Up @@ -219,6 +235,8 @@
},
{
"eventID": "evt-cti-009",
"event_time": "2026-04-07T10:20:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:20:00Z",
"actor": "ADMIN_USER",
"identityType": "IAMUser",
Expand All @@ -243,6 +261,8 @@
},
{
"eventID": "evt-cti-010",
"event_time": "2026-04-07T10:25:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:25:00Z",
"actor": "ADMIN_USER",
"identityType": "IAMUser",
Expand Down Expand Up @@ -273,6 +293,8 @@
},
{
"eventID": "evt-cti-011",
"event_time": "2026-04-07T10:30:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:30:00Z",
"actor": "ADMIN_USER",
"identityType": "IAMUser",
Expand All @@ -298,6 +320,8 @@
},
{
"eventID": "evt-cti-012",
"event_time": "2026-04-07T10:45:00Z",
"observed_time": null,
"eventTime": "2026-04-07T10:45:00Z",
"actor": "NETWORK_ADMIN",
"identityType": "IAMUser",
Expand Down Expand Up @@ -337,6 +361,8 @@
},
{
"eventID": "evt-cti-013",
"event_time": "2026-04-07T11:00:00Z",
"observed_time": null,
"eventTime": "2026-04-07T11:00:00Z",
"actor": "USER_B",
"identityType": "IAMUser",
Expand All @@ -362,6 +388,8 @@
},
{
"eventID": "evt-cti-014",
"event_time": "2026-04-07T11:30:00Z",
"observed_time": null,
"eventTime": "2026-04-07T11:30:00Z",
"actor": "SECURITY_AUDITOR",
"identityType": "IAMUser",
Expand Down
4 changes: 2 additions & 2 deletions docs/event-time-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ This model is informed by the OpenTelemetry Logs Data Model distinction between

| Field | Meaning | Used for detection ordering? | Current repository mapping |
| --- | --- | --- | --- |
| `event_time` | Time the source event happened. | Yes | The default input column is named `timestamp`; configs may use `time.timestamp_col` to point at a source column such as `event_time`. |
| `observed_time` | Time a collector, loader, or intermediary observed the event. | No, unless a demo explicitly documents fallback behavior. | Optional future input or artifact field. Current core demos do not require it. |
| `event_time` | Time the source event happened. | Yes | The default input column is named `timestamp`; configs may use `time.timestamp_col` to point at a source column such as `event_time`. The CloudTrail-like demo normalizes source `eventTime` into `event_time`. |
| `observed_time` | Time a collector, loader, or intermediary observed the event. | No, unless a demo explicitly documents fallback behavior. | Optional input or artifact field. The CloudTrail-like demo preserves optional source `observedTime` as `observed_time` but does not use it for ordering. |
| `window_start` / `window_end` | Deterministic analysis interval derived from `event_time`. | Yes | Feature rows, alert rows, and dedup artifacts use these boundaries. Windows are treated as `[window_start, window_end)`. |
| `artifact_generated_at` | Time an output artifact was rendered or written. | No | Optional provenance metadata for reports, summaries, or reviewer packs. It must not be used as event evidence. |

Expand Down
Loading
Loading