Chapter 27 — Threat intelligence and OSINT: control design
Lesson map
Lesson 27 published. Map, example, EX079.
flowchart TD
N0["Learning outcomes"]
N1["27.1 TLP as a control"]
N2["Lab 5 — dissemination gate"]
N3["27.2 Reading the gate"]
N4["27.3 Fail closed"]
N5["27.4 Approval gates"]
N6["27.5 Audit"]
N7["Training the humans"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7
N7 --> EX["Worked example"]
EX --> Q["Exercise EX079"]
Logical drawing
flowchart LR
N0["Learning outcomes"]
N1["27.1 TLP as a control"]
N2["Lab 5 — dissemination gate"]
N3["27.2 Reading the gate"]
N4["27.3 Fail closed"]
N5["27.4 Approval gates"]
N6["27.5 Audit"]
N7["Training the humans"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> N7 --> Q["EX079"]
[Learning outcomes]
|
v
[27.1 TLP as a control]
|
v
[Lab 5 — dissemination gate]
|
v
[27.2 Reading the gate]
|
v
[27.3 Fail closed]
|
v
[27.4 Approval gates]
|
v
[27.5 Audit]
|
v
[Training the humans]
|
v
[Worked example] --> [Exercise EX079]
Learning outcomes
You will (1) implement TLP 2.0 as an enforceable dissemination control; (2) fail closed on unknown labels; (3) design approval gates for high-impact actions; (4) log control decisions for audit.
27.1 TLP as a control
FIRST TLP 2.0 defines who may receive information: CLEAR without restriction; GREEN within the community; AMBER within the recipient organisation and its clients on a need-to-know basis; AMBER+STRICT within the organisation only; RED to named recipients only. Lantern turns those definitions into a gate on every export and every analyst view.
Kofi's gate reads the label from the object and the audience from the request, then checks the pair against a table derived from the definitions. Keeping the table separate from the code means a reviewer can compare it line by line with the published standard.
Lab 5 — dissemination gate
"""Lab 5 (ch 27): TLP 2.0 dissemination gate for synthetic reports and audiences."""
ALLOWED = {
"TLP:CLEAR": {"public", "community", "org", "team"},
"TLP:GREEN": {"community", "org", "team"},
"TLP:AMBER": {"org", "team"},
"TLP:AMBER+STRICT": {"team", "org-only"},
"TLP:RED": {"named-recipients"},
}
requests = [("R-1", "TLP:GREEN", "public"), ("R-2", "TLP:AMBER", "org"),
("R-3", "TLP:RED", "team"), ("R-4", "TLP:CLEAR", "public"), ("R-5", "TLP:PURPLE", "team")]
for rid, label, aud in requests:
if label not in ALLOWED:
verdict = "BLOCK unknown label"
else:
verdict = "ALLOW" if aud in ALLOWED[label] else "BLOCK"
print(rid, label, "->", aud, verdict)
Run with python3 lab_tlp.py. Verified output:
R-1 TLP:GREEN -> public BLOCK
R-2 TLP:AMBER -> org ALLOW
R-3 TLP:RED -> team BLOCK
R-4 TLP:CLEAR -> public ALLOW
R-5 TLP:PURPLE -> team BLOCK unknown label
27.2 Reading the gate
GREEN to the public is blocked; AMBER to the organisation is allowed; RED to a team is blocked because only named recipients qualify; CLEAR to the public is allowed; an unknown label, TLP:PURPLE, is blocked. The lab simplifies audiences into categories; production rules also check recipient identity.
Those checks matter for RED in particular. A category such as team would let anyone in the team through, while the label allows only the people named. Kofi's production gate looks up the recipient list stored with each RED report and compares it with the person requesting access.
27.3 Fail closed
Unknown or missing labels must block, not allow. A typo in a label should never publish restricted content.
The lab shows this with the invented label, which the gate blocks rather than treating as permissive. Kofi's gate also blocks objects with no label at all, objects whose label has extra spaces and objects with two conflicting labels. Each block writes a reason, so the analyst who hit it can ask the source to correct the label. Allowing on error would turn every data-quality problem into a possible leak, which is the worst way for the gate to fail.
27.4 Approval gates
Pushes to OT firewalls, sharing beyond the community and deleting indicators are high-impact. Each requires a named approver, and the approval is recorded with the object version.
Kofi's approval service shows the approver exactly what will change: the rules to be added or removed, the source of each and the segments affected. Approvers cannot approve their own requests. If the object changes after approval, the approval no longer applies and must be given again, which closes the gap between what was reviewed and what was sent.
27.5 Audit
Every allow and block decision is logged with requester, label, audience and time. Auditors and partners can then verify that agreements were honoured.
Kofi tested the log by asking a colleague to pick ten past decisions at random and trace each one back to the request and the label. All ten could be traced. The log is kept in a store analysts cannot edit, and its retention follows the longest sharing agreement, so a partner's question about how their material was handled can be answered for as long as the material was kept.
Training the humans
Kofi runs a short session for analysts showing the gate's decisions on real-looking synthetic examples. When people understand why GREEN cannot reach the public blog, they ask partners for publishable summaries instead of hunting for workarounds.
Worked example
An analyst tries to post a GREEN partner bulletin to BEN's public blog. The gate blocks it; the analyst asks the partner for permission to publish a CLEAR summary instead, which the partner provides in writing.
Synthetic case. The bulletin and request are invented.
Errors and limits
Labels describe sharing limits, not classification levels in a government sense. Gates cannot stop someone retyping content; training and culture still matter.
Exercises
- EX079 — Gate verdicts. Quote the lab verdicts for R-1 and R-3. Rubric: 3 = R-1 BLOCK (GREEN to public), R-3 BLOCK (RED to team); 2 = one; 1 = allow; 0 = none.
- EX080 — Unknown label. Why does R-5 block rather than allow? Rubric: 3 = unknown label → fail closed; 2 = unknown; 1 = should allow; 0 = none.
- EX081 — Approval record. What must be stored with an approved OT firewall push? Rubric: 3 = approver, time, object/rule version, reason; 2 = two; 1 = vague; 0 = none.
Synthesis
Encode TLP as a gate, fail closed, require approval for high-impact actions and log every decision.
Continue studying — chapter 27 of 50
← Chapter 26 (draft) · Course chapter index · Chapter 28 (draft) →