graph-the-network
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGraph the network
绘制网络图谱
A list of thirty selectors and a graph of thirty selectors contain identical
information, and only one of them lets you see that two clusters share a node.
That is the entire justification: humans do not detect shared elements across
rows, and detect them instantly in a layout. The beginner mistake is treating
the graph as an output — a picture drawn at the end for the report. It is the
case's working memory, built from the first pivot, and the report is generated
from it.
30个选择器的列表和30个选择器的图谱包含完全相同的信息,但只有图谱能让你看到两个集群共享一个节点。这就是核心原因:人类无法从多行数据中发现共享元素,但在可视化布局中能立刻识别。初学者常犯的错误是将图谱视为输出——即报告末尾绘制的一张图。实际上,它是案件的工作记忆,从第一个调查支点开始构建,报告则基于它生成。
Decide the schema before the second node
在添加第二个节点前确定 schema
Everything useful downstream — deduplication, centrality, querying, the report
table — depends on decisions made in the first ten minutes. Two rules:
One node per real-world thing. An alias is an attribute, not a node. If
"J. Okonkwo", "jokonkwo", and "Joseph Okonkwo" are three nodes, every metric
you compute is wrong: degree is split three ways, so the most important person
in the case looks peripheral, and the shared connection between two clusters
never appears because it is distributed across duplicates. Merge on evidence and
record the merge (which selectors, what confidence) — an unrecorded merge is an
unauditable assertion that two things are one thing.
The exception that trips people: a person and their account are different
things. Model , because the operator can change and
the account can be shared. Collapsing them makes both facts unrepresentable.
Person —operates→ AccountA closed set of edge types. Free-text edge labels produce ,
, , and in one graph, and no query ever finds
them all. Fix the vocabulary, keep it small, keep direction consistent, and
write it at the top of the case file. Starter schema with entity types, edge
types, required attributes, and the alias/merge convention:
reference/schema-starter.md.
ownsowned-byownershipis owner of下游所有有用的工作——去重、中心性计算、查询、报告表格——都取决于最初十分钟做出的决策。遵循两条规则:
每个现实事物对应一个节点。Alias(别名)是一种属性,而非节点。如果“J. Okonkwo”、“jokonkwo”和“Joseph Okonkwo”被设为三个节点,你计算的所有指标都会出错:节点度数被拆分三份,导致案件中最重要的人物看起来无关紧要,两个集群之间的共享连接也永远不会显现,因为它被分散在重复节点中。需基于证据合并节点并记录合并信息(涉及哪些选择器、置信度如何)——未记录的合并相当于无法审计的断言,声称两个事物是同一个。
容易让人混淆的例外情况:个人与其账户是不同的事物。应建模为 ,因为操作者可能变更,账户也可能被共享。若将二者合并,这两种事实都无法被呈现。
Person —operates→ Account固定的edge类型集合。自由文本的edge标签会导致同一张图中出现、、和等多种表述,任何查询都无法将它们全部检索到。固定词汇表,保持精简,方向一致,并将其写在案件文件的顶部。包含实体类型、edge类型、必填属性以及别名/合并规则的入门schema:reference/schema-starter.md。
ownsowned-byownershipis owner ofSource and confidence go on the edge
来源与置信度附加在edge上
This is the practice that separates a useful graph from a pretty one, and it is
the one most often skipped.
Node provenance is almost never the issue. The claim is in the relationship:
"this person controls this company", "this domain is operated by this actor".
Every edge therefore carries at minimum: source (URL, tool, or exhibit ID),
retrieval timestamp, source grade (see ), and confidence.
Without it, an edge asserted by a registry filing and an edge inferred from two
accounts posting similar text render identically — and once drawn, a weak link
is indistinguishable from a strong one and gets reasoned over as fact.
investigate-anythingRender confidence visually: solid for confirmed, dashed for probable, dotted for
unconfirmed. Then look at your graph and notice how much of the structure you
were relying on is dotted. Keep a view and check whether your
conclusion survives it — if it collapses, your finding is an artefact of your
weakest edges.
confirmed-onlyAdd temporal validity — / — to any edge that can end:
employment, domain registration, address, directorship, IP resolution. A graph
without time silently asserts that everything coexisted, which manufactures
relationships between people who never overlapped. Two directors of one company
five years apart are not connected; an untimed graph says they are.
valid_fromvalid_to这是区分实用图谱与美观图谱的关键实践,但也是最常被忽略的一点。
节点的来源几乎从来不是问题。争议点在于关系:“此人控制这家公司”、“该域名由该操作者运营”。因此,每个edge至少需包含:来源(URL、工具或证据ID)、检索时间戳、来源等级(参见)以及置信度。如果缺少这些信息,由注册文件声明的edge与从两个账户发布相似文本推断出的edge会被无差别呈现——一旦绘制完成,弱链接与强链接将无法区分,且会被当作事实进行推理。
investigate-anything将置信度可视化:实线表示已确认,虚线表示大概率,点线表示未确认。然后查看你的图谱,你会发现自己之前依赖的结构中有多少是点线。保留一个“仅显示已确认内容”的视图,检查你的结论是否依然成立——如果结论不成立,说明你的发现是由最弱的edge所导致的假象。
为任何可能终止的edge添加时间有效性—— / ——比如雇佣关系、域名注册、地址、董事职位、IP解析。没有时间维度的图谱会默认断言所有事物共存,这会在从未有交集的人之间制造出虚假关系。一家公司相隔五年的两位董事并无关联,但无时间维度的图谱会显示他们有关联。
valid_fromvalid_toWhat the graph actually gives you
图谱的实际价值
- Shared infrastructure. One registrant email, one analytics or ad
identifier, one TLS certificate, one reused avatar hash joining sites that
present as unrelated. Feed ,
who-owns-this-domain, andfind-hidden-subdomainsinto the graph and these appear as high-degree nodes without you looking for them.find-exposed-servers - Bridges. A node whose removal splits the graph into disconnected components. In practice this is the person or asset linking two personas or two networks, and it is usually the finding. Formally it is high betweenness centrality; visually it is the node in the gap between two blobs.
- Degree versus betweenness. The highest-degree node is often the most visible party — the public director, the frontman, or a shared service. The controlling party frequently sits at moderate degree and high betweenness: few connections, but the ones that matter. Compute both and compare; where they disagree, look hard at the difference.
- Communities. Modularity/community detection partitions the graph into clusters. Useful mainly to find the nodes that sit in the wrong cluster.
- Gaps. A node with one edge in a dense neighbourhood is a collection gap, not a fact about the world. Let the sparse regions drive the next pivot.
Treat centrality as a pointer to where to look, never as a conclusion. It
measures your collection as much as reality: whatever you enumerated most
thoroughly becomes the centre of the graph.
- 共享基础设施。同一个注册邮箱、同一个分析或广告标识符、同一个TLS证书、同一个复用的头像哈希值,将看似无关的站点关联起来。将、
who-owns-this-domain和find-hidden-subdomains的结果导入图谱,无需刻意寻找,这些共享元素就会以高度数节点的形式呈现。find-exposed-servers - 桥接节点。移除该节点会导致图谱分裂为不相连的组件。实际上,这是连接两个角色或两个网络的个人或资产,通常就是调查的关键发现。从形式上看,它具有高介数中心性;从视觉上看,它是两个集群之间的节点。
- 度数与介数的对比。度数最高的节点通常是最显眼的一方——公开董事、前台人物或共享服务。而实际控制方往往处于中等度数、高介数的位置:连接数量不多,但都是关键连接。计算并对比这两个指标;当二者结果不一致时,仔细探究其中差异。
- 社区。模块化/社区检测会将图谱划分为多个集群。主要用于找出不属于对应集群的节点。
- 信息缺口。在密集区域中只有一条edge的节点代表的是信息收集缺口,而非客观事实。让稀疏区域引导下一个调查支点。
将中心性视为指向调查方向的指针,而非结论。它既衡量现实情况,也反映你的收集工作:你枚举最彻底的内容会成为图谱的中心。
Tools
工具
| Situation | Reach for |
|---|---|
| Fewer than ~200 nodes, one analyst, needs to end up in a report | Node and edge tables in a spreadsheet or CSV, rendered with Graphviz or imported to Gephi |
| Query-driven work: paths, shared attributes, "who connects A and B" | Neo4j with Cypher |
| Layout, metrics, community detection, presentation | Gephi |
| Automated pivoting from a node, and you have the licensing | Maltego |
Honest default: for most investigations, two CSVs — nodes and edges — plus a
simple renderer beat every heavyweight tool. They are diffable, version
controllable, reviewable by someone who has never seen the tool, and they import
into all of the above. Adopt Maltego or Neo4j when you have a reason (transform
automation, or graphs too large to hold in your head), not by default.
Maltego's model is worth understanding even if you don't use it: entities carry
transforms, which are server-side lookups turning one entity into related ones
(domain to subdomains to IPs to certificates). Transforms are collection, so
each one is a network action attributable to you, and each result arrives with
whatever accuracy the underlying data source has. Maltego's own graph is the
authority on the transform's output, not on the world.
Cypher is worth learning for one reason: path queries. Asking "is there any
chain of at most four relationships between this person and that company, and
what is it" is a query in Neo4j and a manual slog anywhere else.
cypher
MATCH p = shortestPath((a:Person {id:'p-kestrel'})-[*..4]-(c:Company {id:'c-nordvale'}))
RETURN pFeature comparison, import formats, the Gephi CSV column names, and when each
tool is the wrong choice: reference/tool-comparison.md.
| 场景 | 推荐工具 |
|---|---|
| 节点数少于约200个、单人分析、最终需纳入报告 | 电子表格或CSV中的节点与edge表格,用Graphviz渲染或导入Gephi |
| 基于查询的工作:路径、共享属性、“谁连接了A和B” | 搭配Cypher的Neo4j |
| 布局、指标计算、社区检测、展示 | Gephi |
| 从节点自动进行调查支点跳转,且已获得授权 | Maltego |
务实的默认选择:对于大多数调查,两个CSV文件——节点和edge——加上一个简单的渲染工具,胜过所有重量级工具。它们可进行差异对比、版本控制、从未使用过该工具的人也能审核,并且可以导入上述所有工具。只有当你有明确需求(比如自动化转换,或图谱大到无法在脑中梳理)时,才采用Maltego或Neo4j,而非默认使用。
即使你不使用Maltego,也值得了解它的模型:实体带有transforms,即服务器端查询,可将一个实体转换为相关实体(域名→子域名→IP→证书)。transforms属于收集操作,因此每个transform都是可追溯到你的网络行为,每个结果的准确性取决于底层数据源。Maltego自身的图谱是transform输出的权威记录,而非客观世界的权威记录。
学习Cypher的一个重要原因:路径查询。在Neo4j中,查询“此人与该公司之间是否存在最多4层关系的链,具体是什么”只需一条语句,而在其他工具中则需要手动繁琐操作。
cypher
MATCH p = shortestPath((a:Person {id:'p-kestrel'})-[*..4]-(c:Company {id:'c-nordvale'}))
RETURN p工具功能对比、导入格式、Gephi的CSV列名以及各工具的不适用场景:reference/tool-comparison.md。
Where this goes wrong
常见误区
Over-connection. The classic failure. Enough edges and everything connects
to everything; the graph becomes a hairball and stops carrying information. It
happens through low-value edges: same country, same registrar, same hosting
provider, same webmail domain, same popular CDN IP. Two sites on Cloudflare are
not related. Two people with Gmail addresses are not related. Rule: an edge
earns its place only if it discriminates — if a large fraction of unrelated
entities would share it, it is context, not a relationship. Model those as node
attributes, or leave them out.
Shared-service edges misread as relationships. Shared hosting, a registrar
privacy service, a company formation agent's registered address, a payment
processor, a mail-forwarding suite: all produce genuine shared nodes and no
relationship between the parties. Always ask how many other entities touch that
node — a registered address with four hundred companies is an agent's address.
Entity resolution errors, both directions. Splitting one person into three
(hides the finding) and merging two people into one (invents it). Merging is the
more dangerous, because the graph then looks like strong corroboration: two
clusters joined by a merge you performed. Record every merge with its evidence
and be able to unmerge.
Confidence laundering by layout. A dotted inferred edge gets drawn, then
screenshotted, then described in prose, and three steps later it is a line in a
diagram in a report that nobody can trace. Generate report figures from the data
file, never from a hand-edited picture.
The graph as argument. A well-laid-out graph is persuasive out of all
proportion to its evidence. Layout algorithms are aesthetic; adjacency in a
force-directed picture is not a finding. Cite the edge, not the image.
Metrics on an incomplete graph. Centrality on a graph you built by
enumerating one actor exhaustively will crown that actor. Note collection
coverage next to any metric you report.
过度连接。典型的失败案例。edge过多会导致所有事物相互连接,图谱变成一团乱麻,不再承载有效信息。这通常由低价值edge导致:同一国家、同一注册商、同一托管提供商、同一邮箱域名、同一热门CDN IP。使用Cloudflare的两个站点并无关联。使用Gmail地址的两个人也并无关联。规则:只有当edge具有区分度时才值得添加——如果大量无关实体都可能共享该属性,那么它只是背景信息,而非关系。将这些属性建模为节点属性,或直接忽略。
将共享服务edge误判为关系。共享托管、注册商隐私服务、公司注册代理的注册地址、支付处理器、邮件转发套件:所有这些都会产生真实的共享节点,但各方之间并无关系。始终要询问有多少其他实体关联到该节点——一个有400家公司使用的注册地址是代理地址。
实体解析错误(两种方向)。将一个人拆分为三个节点(隐藏关键发现),或将两个人合并为一个节点(制造虚假关系)。合并的危害更大,因为图谱会看起来像有强有力的佐证:两个集群通过你执行的合并连接在一起。记录每一次合并的证据,并能够撤销合并操作。
通过布局洗白置信度。一条点线的推断edge被绘制出来,然后被截图,再被写入文字描述,经过三步后,它变成了报告中无人可追溯的图表线条。从数据文件生成报告图表,而非手动编辑的图片。
将图谱作为论据。布局良好的图谱说服力远超其实际证据。布局算法是美学层面的,力导向图中的相邻关系并非调查发现。引用edge的证据,而非图片。
基于不完整图谱计算指标。如果你通过详尽枚举某一个操作者构建图谱,中心性计算会将该操作者列为核心。在你报告的任何指标旁都需注明收集范围。
Confidence grading
置信度分级
Grade edges, not the graph.
- Confirmed — the relationship is stated by an authoritative primary record (a registry filing, a signed certificate, a self-declared cross-link on both endpoints), or by two independently collected sources that pass the circular-reporting check.
- Probable — one strong source, or a distinctive shared selector that is rare enough to discriminate (a self-hosted analytics ID, an unusual reused password hash, a personal domain), with no contradicting evidence.
- Unconfirmed — a shared attribute that many unrelated entities could share, or a stylistic or temporal correlation alone. Draw it dotted, or don't draw it.
- Rejected — traced to a shared service, a broker feed, or a coincidence. Keep rejected edges in the file, marked, with the reason; otherwise the next analyst re-adds them.
A path is only as strong as its weakest edge. State the minimum edge confidence
along any chain you report, not the average.
对edge进行分级,而非对图谱。
- 已确认——关系由权威原始记录声明(注册文件、签名证书、两端自我声明的交叉链接),或由两个通过循环报告检查的独立收集来源证实。
- 大概率——一个可靠来源,或具有足够区分度的独特共享选择器(自托管分析ID、罕见的复用密码哈希、个人域名),且无矛盾证据。
- 未确认——许多无关实体都可能共享的属性,或仅存在风格/时间相关性。用点线绘制,或不绘制。
- 已拒绝——追溯到共享服务、经纪商数据源或巧合。将已拒绝的edge标记原因后保留在文件中;否则下一位分析师会重新添加它们。
路径的强度取决于其最弱的edge。报告任何关系链时,需说明链中最低的edge置信度,而非平均值。
Worked example
实操案例
Case: three fraud domains, apparently unrelated. Nodes and edges kept in two
CSVs from the first pivot.
WHOIS is privacy-protected on all three, so registrant edges are unavailable —
the obvious approach is a dead end. Archived copies via
turn out to include pre-privacy registration snapshots for two of them, giving
two edges, sourced and dated, graded confirmed.
read-deleted-pagesPerson —registered→ DomainAdding IP resolutions creates an apparent hub joining all three plus forty
unrelated sites: a shared CDN address. Degree makes it the most central node in
the graph, which is meaningless. It is downgraded to a node attribute and
removed as an edge — the hairball disappears with it.
The real bridge is a self-hosted analytics identifier present in the archived
HTML of two domains and on a fourth site not previously in scope, a personal
portfolio carrying a real name. Betweenness on the confirmed-only view puts that
identifier, not the visible registrant, between the two clusters. Temporal edges
show the portfolio's use of the identifier ended before the third domain
existed, so that domain stays unconnected — and saying so keeps the report
honest.
案件:三个看似无关的欺诈域名。从第一个调查支点开始,节点和edge保存在两个CSV文件中。
三个域名的WHOIS信息均受隐私保护,因此无法获取注册者edge——常规方法行不通。通过获取的存档副本包含其中两个域名的隐私保护前注册快照,得到两条 edge,带有来源和日期,分级为已确认。
read-deleted-pagesPerson —registered→ Domain添加IP解析后,出现一个连接三个域名和40个无关站点的明显枢纽:一个共享CDN地址。度数使其成为图谱中最核心的节点,但这毫无意义。将其降级为节点属性并移除edge——乱麻状的图谱随之消失。
真正的桥接节点是一个自托管分析标识符,出现在两个域名的存档HTML中,以及一个此前未纳入调查范围的第四个站点——一个带有真实姓名的个人作品集。仅显示已确认内容的视图中,该标识符的介数而非可见注册者处于两个集群之间。时间edge显示,作品集使用该标识符的时间早于第三个域名的存在时间,因此第三个域名保持未连接状态——如实记录这一点能确保报告的真实性。
Pivots
调查支点
| New selector from the graph | Skill |
|---|---|
| Shared registrant email or personal domain | |
| Shared certificate or subdomain pattern | |
| Shared IP or hosting artefact | |
| Reused avatar or image across nodes | |
| Newly surfaced handle | |
| Newly surfaced person | |
| Newly surfaced company or address | |
| Wallet clusters and counterparties | |
| The finished entity map | |
| 从图谱中获取的新选择器 | 技能 |
|---|---|
| 共享注册邮箱或个人域名 | |
| 共享证书或子域名模式 | |
| 共享IP或托管痕迹 | |
| 节点间复用的头像或图片 | |
| 新出现的账号名 | |
| 新出现的个人 | |
| 新出现的公司或地址 | |
| 钱包集群与交易对手 | |
| 完成的实体图谱 | |
Legal and handling notes
法律与处理注意事项
A case graph is a purpose-built profile of identified people, and it is more
sensitive than any single item in it — aggregation is the point of the
technique, and aggregation is what data-protection regimes scrutinise.
Third-party nodes accumulate fast (relatives, colleagues, co-residents); prune
anyone not relevant to the objective before the graph goes anywhere, and redact
them from published figures. Store the graph file with the same encryption and
retention rules as the rest of the case per ../../ETHICS.md.
Hosted graph platforms mean uploading the case to a third party — check that is
permitted before you paste a subject's selectors into a cloud transform.
案件图谱是针对已识别人员的专用档案,比其中任何单个条目都更敏感——聚合是该技术的核心,而聚合正是数据保护监管制度重点审查的内容。第三方节点会快速积累(亲属、同事、共同居住者);在图谱对外传播前,删除所有与调查目标无关的人员,并在发布的图表中对其进行编辑。按照../../ETHICS.md中的规定,将图谱文件与案件其他内容采用相同的加密和保留规则存储。托管式图谱平台意味着将案件数据上传至第三方——在将调查对象的选择器粘贴到云transform之前,需确认这是被允许的。