graph-the-network

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Graph 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.
由三十个 selector 组成的列表与包含三十个 selector 的图谱所承载的信息完全相同, 但只有图谱能让你看出两个集群共享了一个节点。 这就是这种做法存在的全部理由:人类无法发现各行之间共享的元素,却能在布局中瞬间发现它们。新手常犯的错误是把图谱当作输出——最后为报告绘制的一张图片。它其实是案件的 工作记忆,从第一次 Pivot 开始构建,报告则由它生成。

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
Person —operates→ Account
, because the operator can change and the account can be shared. Collapsing them makes both facts unrepresentable.
A closed set of edge types. Free-text edge labels produce
owns
,
owned-by
,
ownership
, and
is owner of
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.
所有后续都有用的能力——去重、中心性分析、查询、报告表格——都取决于最初十分钟做出的决定。有两条规则:
**每个现实事物只对应一个节点。**别名是属性,而不是节点。如果 “J. Okonkwo”、“jokonkwo”和“Joseph Okonkwo”是三个节点,你计算出的每个指标都会出错:degree(度数)被拆成三份,案件中最重要的人看起来无关紧要,两个集群之间的共享连接也永远不会出现,因为它分散在重复节点中。依据证据进行合并,并记录每次合并(合并了哪些 selector、置信度是多少)——未记录的合并,就是一项无法审计的断言,声称两个事物其实是同一个。
容易让人栽跟头的例外是:人与他的账户属于不同事物。应建模为
Person —operates→ Account
,因为操作者可能变化,而账户可能由多人共享。将二者合并,会导致这两项事实都无法表达。
**边类型必须构成封闭集合。**如果用自由文本作为边标签,同一图谱中就会同时出现
owns
、
owned-by
、
ownership
和
is owner of
,任何查询都无法将它们全部找出。固定词汇表,保持精简,确保方向一致,并把词汇表写在案件文件顶部。包含实体类型、边类型、必填属性以及别名/合并约定的入门 schema: reference/schema-starter.md。

Source and confidence go on the 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
investigate-anything
), 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.
Render 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
confirmed-only
view and check whether your conclusion survives it — if it collapses, your finding is an artefact of your weakest edges.
Add temporal validity —
valid_from
/
valid_to
— 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.
这项实践将有用的图谱与漂亮的图谱区分开来,却也是最常被忽略的一项。
节点的来源几乎从来不是问题。真正的主张存在于关系之中: “这个人控制这家公司”、“这个域名由这个行为方运营”。 因此,每条边至少都要携带:来源(URL、工具或证物 ID)、获取时间戳、来源等级(参见
investigate-anything
)和置信度。 缺少这些信息时,一条来自注册备案记录的边,与一条根据两个账户发布相似文本推断出的边会呈现得完全相同;一旦画出来,就无法区分强弱,并会被当作事实进行推理。
以视觉方式呈现置信度:已确认用实线,可能用虚线,未确认用点线。然后观察图谱,注意到自己原本依赖的结构有多少是点线。保留一个
confirmed-only
视图,并检查结论是否仍然成立——如果结论随之瓦解,说明你的发现只是由最弱边造成的伪象。
为任何可能终止的边添加时间有效性——
valid_from
/
valid_to
——例如雇佣关系、域名注册、地址、董事任职、IP 解析。没有时间维度的图谱会无声地断言所有事物都曾同时存在,从而凭空制造出时间上没有重叠的人之间的关系。同一家公司中相隔五年担任董事的两个人之间,并不存在由任职产生的联系;无时间维度的图谱却说他们存在联系。

What 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
    ,
    find-hidden-subdomains
    , and
    find-exposed-servers
    into the graph and these appear as high-degree nodes without you looking for them.
  • 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
    的结果导入图谱后,无需主动寻找,它们就会作为高 degree 节点出现。
  • **桥接点。**移除某个节点后,会将图谱拆成互不连通组件的节点。实践中,它通常是连接两个身份或两个网络的人员或资产,也往往正是调查的关键发现。形式上,它具有很高的介数中心性(betweenness centrality);在视觉上,它就是两个团块之间空隙处的节点。
  • **Degree 与 betweenness 的区别。**degree 最高的节点通常是最显眼的一方——公开露面的董事、名义负责人或共享服务。实际控制方则经常处于 degree 中等、betweenness 很高的位置:连接数量不多,但每一条都很重要。两种指标都应计算并进行比较;当结果不一致时,应重点研究其中的差异。
  • **社区。**模块度(modularity)/社区发现会将图谱划分为多个集群。它们的主要用途,是找出处在错误集群中的节点。
  • **缺口。**在密集邻域中只有一个连接的节点 represents 的是收集缺口,而不是关于现实世界的事实。应让稀疏区域引导下一次 Pivot。
应将中心性视为查找方向的指针,而永远不能将其视为结论。它衡量的既是现实,也是你的收集过程:你枚举得最彻底的对象,自然会成为图谱中心。

Tools

工具

SituationReach for
Fewer than ~200 nodes, one analyst, needs to end up in a reportNode 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, presentationGephi
Automated pivoting from a node, and you have the licensingMaltego
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 p
Feature comparison, import formats, the Gephi CSV column names, and when each tool is the wrong choice: reference/tool-comparison.md.
情形首选工具
少于约 200 个节点,单名分析师,且最终需要形成报告在电子表格或 CSV 中维护节点表和边表,再用 Graphviz 渲染或导入 Gephi
查询驱动的工作:路径、共享属性、“谁连接了 A 和 B”带 Cypher 的 Neo4j
布局、指标、社区发现和演示Gephi
需要从节点自动执行 Pivot,且拥有相应许可Maltego
务实的默认方案是:对大多数调查,两个 CSV——节点和边——再加一个简单渲染器,就胜过所有重型工具。它们可比较差异、可做版本控制,也能由从未使用过该工具的人审查,而且能够导入上述所有工具。只有在有明确理由时才采用 Maltego 或 Neo4j(Transform 自动化,或图谱大到无法在脑中掌握),不要默认采用。
即使不使用 Maltego,也值得理解它的模型:实体带有 Transform,即把一个实体转换为相关实体的服务端查询(从域名到子域,再到 IP 和证书)。Transform 属于收集行为,因此每一次 Transform 都是一项可归责于你的网络操作,而每个结果的准确度都取决于底层数据源。Maltego 自身的图谱是 Transform 输出的权威依据,但不是现实世界的权威依据。
Cypher 值得学习只为一个原因:路径查询。询问“这个人与那家公司之间是否存在最多包含四段关系的链条,以及该链条是什么”,在 Neo4j 中是一条查询,在其他地方则只能进行艰苦的手工排查。
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.
**连接过度。**典型的失败模式。边足够多之后,所有东西最终都会连在一起;图谱变成一个毛球,不再承载信息。其原因通常是低价值边:同一国家、同一注册商、同一托管服务提供商、同一 Webmail 域名、同一热门 CDN IP。部署在 Cloudflare 上的两个网站并无关系,使用 Gmail 地址的两个人也并无关系。规则是:一条边只有具备区分能力时才值得保留——如果大量无关实体都会共享它,它就是上下文,而不是关系。应将这类特征建模为节点属性,或者直接忽略。
**将共享服务边误读为关系。**共享托管、注册商的隐私服务、公司注册代理机构的注册地址、支付处理商、邮件转发套件:这些都会产生真实存在的共享节点,却不会产生各方之间的关系。始终询问还有多少其他实体连接到这个节点——有四百家公司使用的注册地址,就是代理机构的地址。
**实体解析在两个方向上出错。**把一个人拆成三个人会掩盖调查发现;把两个人合并成一个人则会凭空制造发现。合并更加危险,因为图谱随后会看起来像得到了有力佐证:两个集群只是被你执行的一次合并连接在了一起。必须记录每次合并及其证据,并且能够撤销合并。
**通过布局洗白置信度。**一条点线推断边先被画出,然后截图,再被文字描述;经过三个步骤之后,它就成为报告示意图中一条无法追溯的线。始终从数据文件生成报告图表,绝不要从手工编辑过的图片生成。
**把图谱当作论证。**布局精美的图谱,其说服力远超其证据强度。布局算法只关乎美观;力导向布局图中的相邻关系并不是调查发现。应当引用边,而不是图像。
**对不完整图谱计算指标。**如果你通过穷尽枚举某一方来构建图谱,中心性只会让该方登顶。报告任何指标时,都应在其旁边注明收集覆盖率。

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.
对边评级,而不是对整个图谱评级。
  • 已确认(Confirmed)——关系由权威的第一手记录明确说明(注册备案文件、已签名证书,或两个端点上自我声明的交叉链接),或者由两个独立收集且通过循环报道检查的来源证实。
  • 可能(Probable)——来自一个强来源,或来自独特且足够稀有、能够起到区分作用的共享 selector(自托管分析 ID、不寻常的复用密码哈希、个人域名),并且没有相反证据。
  • 未确认(Unconfirmed)——仅共享许多无关实体也可能共享的属性,或仅存在风格或时间相关性。应将其画成点线,或者干脆不画。
  • 已排除(Rejected)——追踪后发现源于共享服务、中介信息源或巧合。应在文件中保留这些已排除的边,并标记排除原因;否则下一位分析师会重新添加它们。
一条路径的强度只取决于其中最弱的边。报告任何链条时,应说明该链条上最低的边置信度,而不是平均值。

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
read-deleted-pages
turn out to include pre-privacy registration snapshots for two of them, giving two
Person —registered→ Domain
edges, sourced and dated, graded confirmed.
Adding 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.
案例:三个欺诈域名,表面上看互不相关。从第一次 Pivot 开始,节点和边就保存在两个 CSV 中。
三个域名的 WHOIS 都启用了隐私保护,因此无法获得注册人边—— obvious approach 走进了一条死胡同。通过
read-deleted-pages
获得的归档副本,结果显示其中两个域名的隐私保护前注册快照,从而得到两条
Person —registered→ Domain
边;这些边具有来源和日期,评级为 confirmed。
添加 IP 解析关系后,一个表面上的枢纽将三个域名与四十个无关网站连接起来:它是一个共享 CDN 地址。Degree 使它成为图谱中最中心的节点,但这毫无意义。它被降级为节点属性,并作为边移除——毛球也随之消失。
真正的桥接点是一个自托管分析标识符。它出现在两个域名的归档 HTML 中,也出现在此前不在调查范围内的一个网站上——那是一个带真实姓名的个人作品集。在 confirmed-only 视图中,介数中心性将该标识符而非可见的注册人置于两个集群之间。时间边表明,作品集对该标识符的使用在第三个域名出现之前就已结束,因此第三个域名仍保持未连接状态——明确说明这一点,报告才是诚实的。

Pivots

Pivots

New selector from the graphSkill
Shared registrant email or personal domain
who-owns-this-domain
,
what-an-email-reveals
Shared certificate or subdomain pattern
find-hidden-subdomains
Shared IP or hosting artefact
find-exposed-servers
Reused avatar or image across nodes
find-the-original-image
Newly surfaced handle
hunt-a-handle
Newly surfaced person
find-anyone
Newly surfaced company or address
x-ray-a-company
,
who-really-owns-it
Wallet clusters and counterparties
follow-the-crypto
The finished entity map
write-the-intel-brief
从图谱发现的新 selectorSkill
共享注册人邮箱或个人域名
who-owns-this-domain
、
what-an-email-reveals
共享证书或子域名模式
find-hidden-subdomains
共享 IP 或托管工件
find-exposed-servers
跨节点复用的头像或图像
find-the-original-image
新浮现的 handle
hunt-a-handle
新浮现的人员
find-anyone
新浮现的公司或地址
x-ray-a-company
、
who-really-owns-it
钱包集群与交易对手
follow-the-crypto
完成的实体图谱
write-the-intel-brief

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。使用托管式图谱平台意味着将案件上传给第三方——在把调查对象的 selector 粘贴到云端 Transform 之前,先确认是否允许这样做。