◇ OpenCyber Academy
Technical · Chapter 3 · English

Chapter 3 — Operating systems and identities

Open, free learning for anyone who wants to protect people and technology. No account is required to read this text or its worked answers.

Chapter 3 — Operating systems and identities

Lesson map

Lesson 03 published. Map, example, EX009.

flowchart TD
  N0["Learning outcomes and connection"]
  N1["3.1 Name the layers before joining them"]
  N2["3.2 Synthetic host/identity/application bundle"]
  N3["3.3 A timeline with uncertainty and hypothesis branc"]
  N4["3.4 Worked join audit"]
  N5["3.5 Safe next actions and verification design"]
  N6["3.6 Identifier scope, lifetime and fan-out"]
  N7["3.7 Paper decision lab: approval is not attribution"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
  N7 --> EX["Worked example"]
  EX --> Q["Exercise EX009"]

Logical drawing

flowchart LR
  N0["Learning outcomes and connection"]
  N1["3.1 Name the layers before joining them"]
  N2["3.2 Synthetic host/identity/application bundle"]
  N3["3.3 A timeline with uncertainty and hypothesis branc"]
  N4["3.4 Worked join audit"]
  N5["3.5 Safe next actions and verification design"]
  N6["3.6 Identifier scope, lifetime and fan-out"]
  N7["3.7 Paper decision lab: approval is not attribution"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX009"]
[Learning outcomes and connection]
    |
    v
[3.1 Name the layers before joining them]
    |
    v
[3.2 Synthetic host/identity/application bundle]
    |
    v
[3.3 A timeline with uncertainty and hypothesis branc]
    |
    v
[3.4 Worked join audit]
    |
    v
[3.5 Safe next actions and verification design]
    |
    v
[3.6 Identifier scope, lifetime and fan-out]
    |
    v
[3.7 Paper decision lab: approval is not attribution]
    |
    v
[Worked example] --> [Exercise EX009]

Learning outcomes and connection

The learner will distinguish a host process, an operating-system account, an identity principal, a session and a human; reconstruct only supported joins across host, IdP and application records; and specify a safe collection request when a join key is missing. Chapter 2 left the API-path explanation open. This chapter asks whether identity and host records narrow an observed reservation change without turning a service account into a person. NIST SP 800-61 Rev. 3 informs coordinated response, while NIST SP 800-86 provides forensic vocabulary from 2006; current OS/vendor collection details require separate verification.

3.1 Name the layers before joining them

A process is an executing program instance in a host namespace, identified locally by fields such as PID, start time and executable path. A PID can be reused after exit and is meaningless without host and time. An OS account supplies local privilege context for a process, but a daemon's account is not necessarily the user who initiated a request. An identity principal is an entity represented to an IdP or application; it may be a human, service or workload identity. A session is a particular authenticated context with an identifier and lifetime; a service principal can have many sessions. A human actor is a person whose actions require independent attribution evidence. These categories overlap but are not interchangeable.

An application may log a principal label but omit the session ID. A host may log a process owned by a service account but omit the IdP token used on an outbound request. Nearby timestamps and the same account string make a hypothesis, not a cryptographic or semantic join. To claim a direct join, ask the producer whether two records share an identifier with the same meaning and whether the logs cover the relevant route. A shared identity can be used by a legitimate scheduler and an emergency operator; a label alone cannot distinguish them. Blank actor means the producer did not provide a value, not that an anonymous attacker has been identified.

The response decision also has a service dependency. In the Chapter 1 graph, the worker and api both depend on idp; a broad principal disablement could stop approved scheduled work. A scoped read-only request for status and source coverage is safer than an unsupervised account action. A later containment proposal must include target session/principal, approving roles, expected legitimate service effect, verification and rollback. This chapter performs only a paper and offline analysis.

3.2 Synthetic host/identity/application bundle

The following records are fictional LLR data. They are supplied as snippets, not certified complete exports. All event times are source-reported UTC; the custodian has not supplied clock-offset measurements or original-object digests. No record contains personal information.

ID Source event Supplied record What it supports Missing for a stronger claim
I01 11:58:00 IdP reports principal=svc-reserve, session=sid-88, client=runner-02, outcome success. A sign-in for that principal/session/client in the sampled IdP record. Token binding to a specific API request; person behind it.
H01 11:58:04 Host runner-02 reports process PID 420, start 11:58:04, executable /opt/llr/worker, OS user svc-reserve. A process with that name and local privilege context existed in the sampled host record. Whether it used sid-88, its code integrity and initiator.
A01 12:00:03 API audit reports reservation R42 changed, request_id=r-202, principal=svc-reserve, session field blank. The API recorded a change under that principal label. Direct sid-88 → r-202 key, approval scope and human attribution.
I02 12:00:04 IdP reports denied session=sid-89 for svc-reserve from runner-02. A separate denied attempt in the sampled identity record. Whether it is related to A01; a denial does not undo an earlier success.
CH01 11:50 Change calendar lists approved worker job for reservations R40 and R41 until 12:10. Those two reservations are in the visible change scope. Any approved R42 addendum or emergency exception.

A01 is not the same request as Chapter 2's r-201: its request ID is r-202, and this chapter's bundle asks a distinct question about a reservation change, not the earlier /rooms 503. Both may belong to the same synthetic service, but no supplied producer links them. CH01 shows that R42 lies outside the visible approval record, not that a person acted maliciously. The next bounded request should ask the application owner whether r-202 carried an IdP session/actor mapping in a restricted server-side source and ask the change owner whether a valid R42 addendum exists. A trustworthy negative response requires coverage and version information, not just a search screenshot.

3.3 A timeline with uncertainty and hypothesis branches

At 11:58:00, I01 reports an IdP success. Four seconds later, H01 reports a process start on the named runner. At 12:00:03 A01 reports a change; one second later I02 reports a denied attempt. Because source clocks and collection paths are not verified, do not infer a four-second causal chain or treat I02 as proof that the A01 request failed. Three hypotheses remain plausible in the supplied evidence: H1, the approved worker was misconfigured to touch R42; H2, an unapproved operator or different task used the shared principal; H3, a change/addendum record is missing from the supplied calendar. A fourth option is an API audit error. Each has a falsifiable discriminator: a complete signed job manifest and request-ID map for H1; approved operator/session-to-request records for H2; versioned change ledger for H3; and an authoritative R42 state/audit reconciliation for the logging-error option. The provided snippets do not settle any branch.

At this point a technical analyst should preserve the snippets and request narrow source metadata: source object ID, producer, query, interval, collector, time basis, field definitions and digest of the copy actually received. A digest helps detect byte changes between copies; it does not prove completeness, correct collection or truth. If identity logs expire sooner than the calendar, prioritize a permitted preservation request with an owner and time limit, but do not silently expand it to all staff sign-ins. NIST SP 800-92 discusses log-management processes at a high level; real retention and access must be confirmed with the actual system owners.

3.4 Worked join audit

Draw four nodes: I01/sid-88, H01/runner-02:PID420, A01/r-202, CH01/R40-R41. I01 and H01 share a client/host label runner-02, but no session ID in H01. I01 and A01 share principal label svc-reserve, but A01 lacks a session ID. A01 and CH01 refer to different reservation sets, so CH01 is evidence of an approval-scope tension. The graph has dotted candidate edges, not validated direct joins. Do not turn the dotted I01–A01 edge into a solid arrow because the times are close. An extra record keyed by r-202 and a producer-validated sid-88 mapping could change that conclusion; so could an approved R42 addendum. Until then, the claim is “an R42 change was recorded under a shared principal outside the visible change scope.”

Offline check: paste the dictionary into Python 3 or reason about it on paper. It has no environment access. A blank value is deliberately represented as an empty string. The code tests only whether a literal matching session key exists; it cannot validate source semantics.

idp = {"principal": "svc-reserve", "session": "sid-88", "client": "runner-02"}
api = {"principal": "svc-reserve", "session": "", "request": "r-202"}
same_principal = idp["principal"] == api["principal"]
direct_session_join = bool(api["session"]) and idp["session"] == api["session"]
print("same principal label:", same_principal)
print("direct session join:", direct_session_join)

Expected lines: same principal label: True and direct session join: False. In a separate synthetic variant, set api["session"] = "sid-88"; the second line becomes True as a string comparison. Even that variant would require proof that the two producers use the same session namespace and the copied records are authentic before it supports a case conclusion. Restore the original fixture for the main LLR analysis. The test guards against a common automation bug: treating an empty session field as if it matched any successful session for the same principal.

3.5 Safe next actions and verification design

At the current checkpoint, preserve the raw snippets and a derived timeline separately; ask the identity custodian for a scoped session-to-request mapping if one exists and the application/change owners for R42 state and approval scope. The decision record should have explicit fields: source IDs; request window; custodian; permission; expected field; what a no-result means; collection receipt; remaining uncertainty. A read-only check must still respect data minimization and access control. If an owner later considers restriction, compare one session, one task and whole-principal options against the Chapter 1 dependency graph. The record needs an expiry, operator, service-health check and rollback owner before approval; this manuscript provides no actual operator procedure or credentials.

Verification should include both security and legitimate-function conditions. For example, if a narrow task pause is approved, a positive check asks whether the task stopped issuing out-of-scope R42 changes; a negative/business check asks whether approved R40/R41 work still functions. A failure to see R42 changes in a short sample is not proof that the path cannot recur; record coverage and next observation. Those checks belong to later containment chapters and a separately authorized lab. Here the learner designs them without touching a service.

3.6 Identifier scope, lifetime and fan-out

An identifier becomes useful only after its namespace, lifetime and cardinality are known. PID 420 is local to one host and execution interval and may be reused. A principal can outlive many sessions; a session can issue many requests; a request ID may be regenerated at a gateway; a reservation ID can be changed by several requests. A one-to-many relationship cannot be inferred as one-to-one simply because one sample shows only one row. A rigorous mapping claim has the shape “producer X reports field A in record Y corresponds to field B in record Z under rule R for interval T.” Without R, draw a dotted candidate edge.

For I01/H01/A01, use a join ledger with five columns: candidate edge, literal overlap, producer semantics, collection coverage and decision consequence. I01→H01 shares runner-02 and nearby time, but H01 has no session field. I01→A01 shares the svc-reserve label, but A01 has a blank session. H01→A01 has no request key. The immediate consequence is a bounded mapping request, not attribution of R42 to the worker. I02's denial belongs to a separate sid-89; it does not reverse I01's successful sid-88 or A01's change record.

In a separate hypothetical L3-V branch, imagine the application custodian supplies a producer-validated r-202→sid-88 mapping with an identified source object and covered time window. That would strengthen the I01→A01 session-level edge. It would not prove H01's process used sid-88, that the change was approved, or that a named person initiated it. If the mapping were instead assembled in an unversioned spreadsheet without original-object references, state the weaker provenance. Do not import L3-V into the main case; A01's supplied session field remains blank. This staged branch helps a learner identify exactly which uncertainty one new source can remove.

3.7 Paper decision lab: approval is not attribution

Consider a proposed broad disablement of svc-reserve because R42 is outside CH01's visible approval. The proposed control targets a principal, but the suspicious observation is a reservation change under a label. A broad restriction might stop the worker and an API dependency together. Compare a verified single-task pause, a single-session restriction and principal revocation. For each, specify target, approver, duration, rollback owner, positive security test and legitimate-work test. Also ask whether the control covers the hypothesized route: a task pause fails if another task used the principal; a session restriction fails if an actor can create a fresh session.

Outcome A, a hypothetical new approval ledger and producer-validated request map, shows a valid R42 addendum and maps r-202 to the approved job. The visible scope tension is resolved for this one request; keep the record and do not invent malicious intent. Outcome B shows a complete approval ledger with no R42 authorization, while the application source still lacks a session map. The business-approval concern strengthens, but actor attribution remains unresolved. Escalate a bounded preservation and control decision to the owners. The correct output distinguishes approval status, request provenance and human attribution. These are three questions, not three names for the same conclusion.

Before Chapter 4, state the data-handling consequence: a missing session value must not be filled from the nearest timestamp; a reused request ID needs a namespace check; a rejected line stays in the rejection inventory. This is why the identity memo must carry raw-source references and explicit unknowns, even when the likely next action feels obvious.

Common errors and limits

Exercises — subject 3

EX009 — Entity separation. Objective: prevent false attribution. Inputs: I01, H01, A01, I02. Draw a five-column matrix for host process, OS account, IdP principal, session and human, and fill only supported fields. State one identifier needed for each proposed join. Evidence: matrix with empty/unknown cells retained. Rubric: 2 = distinguishes all five and no human attribution; 1 = four categories with one ambiguity; 0 = labels the service account as a person.

EX010 — Timeline and alternatives. Objective: preserve time and source limits. Inputs: I01–I02, H01, A01, CH01. Produce four timed event rows plus a separate change-scope row, then H1–H3 with one supporting item and one discriminator each. Evidence: source-linked Markdown. Rubric: 2 = no causal join from proximity and R42 scope tension stated; 1 = useful timeline with weak discriminator; 0 = claims actor or intent.

EX011 — Join-check lab. Objective: reproduce a bounded parser inference. Run §3.4's code or calculate its booleans by hand, then run the separate api["session"]="sid-88" variant. Report exact two-line outputs for both and the extra producer-semantic check needed before a real direct join. Evidence: original and variant transcript. Rubric: 2 = outputs and source-authenticity caveat; 1 = outputs only; 0 = main case recorded as a direct join.

EX012 — Collection and control proposal. Objective: connect evidence request to a reversible choice. Inputs: A01/CH01 and the Chapter 1 graph. Write a 150–200-word plan for a scoped r-202 mapping request, a versioned R42 approval check, and a proposed task-versus-principal restriction comparison. Name custodians, expiry/retention question, approved-change role, positive/negative verification and rollback owner. Evidence: paper request with blank execution fields. Rubric: 2 = exact scope and separate authorization/verification; 1 = plausible but missing one owner or negative check; 0 = directs an unapproved real change.

Subject synthesis

Host, identity and application records answer different questions. A shared label and close timestamps are starting points for an investigation, not a validated session-to-request edge or a human identity. Chapter 4 adds schema and parser checks so later source comparisons do not quietly discard malformed or ambiguous records.

Continue studying — chapter 03 of 18

← Chapter 02 · Course chapter index · Chapter 04 →

Continue to the next authored lesson.

Worked answers

EX009 — Model entity matrix. Host process = H01 runner-02, PID 420, start 11:58:04; OS account = H01 svc-reserve; IdP principal = I01/I02 svc-reserve and A01 label; IdP session = I01 sid-88, I02 separate denied sid-89; human = unknown. H01 has no session ID; A01 has a blank session field; no person field exists. To join I01→A01, request producer-validated session/request mapping for r-202; to join H01→I01, request a host/process-to-token relationship with stable host/time context. A matching label is insufficient.

EX010 — Model timeline. 11:58:00 I01 successful sid-88 reported; 11:58:04 H01 process start on runner-02; 12:00:03 A01 R42 change under shared principal, blank session; 12:00:04 I02 denied sid-89. Separately, CH01's 11:50 approved calendar covers R40/R41 through 12:10 but not R42 in the supplied version. H1 misconfigured worker: shared principal and nearby process are suggestive; ask for complete signed job manifest and r-202 mapping. H2 other task/operator: R42 is outside visible scope; ask for authorized session/request trail and task inventory. H3 missing addendum: ask change owner for the versioned R42 ledger. Clock offset and export completeness are unverified. Neither four-second spacing nor I02's denial proves a causal path.

EX011 — Model join-check outputs. Original: same principal label: True and direct session join: False. Separate variant with api["session"] = "sid-88": same principal label: True and direct session join: True. The booleans test strings in two synthetic dictionaries. Before a real case join, establish that both producers use the same session namespace, capture the source objects and collection method, and check whether the mapping can be forged or altered. The original A01 remains unjoined even though its principal label matches I01.

EX012 — Model paper proposal. “Preserve I01/H01/A01/CH01 snippets without overwriting their raw forms. Ask the application custodian, under a bounded 11:58–12:01 UTC approval, whether a restricted audit source maps r-202 to a session ID, with source object, collection time, field semantics and retention. Ask the change owner for the official versioned R42 approval scope; a missing row in this snippet is not a complete ledger result. Ask the identity owner how long the relevant session detail remains and who may collect it. Record the producer clock basis and collector so the resulting join can be independently checked. If a continuing unapproved task is later confirmed, compare an exact task pause with shared-principal revocation. Service and identity owners must approve target and expiry; an authorized operator and rollback owner remain pending. Positive check: observed out-of-scope R42 writes stop in a defined window. Negative check: approved R40/R41 worker operations and audit continue. The rollback owner should restore the approved task only after verifying the intended scope and recording the result. No change is executed by this request.” Equivalent text passes when it retains source limits and both verification dimensions.