有人转给我一篇连载,讲一家认证机构怎么被对手接手客户。情节我没记住。记住的是一份四十个域名的出站白名单,和一条只记录不拦截的采样规则。
先贴代码,别的都是铺垫。
static const char *egress_allow[] = {
"update.vendor.example",
"ntp.pool.example",
"smtp.mailrelay.example",
/* 一共四十个 */
NULL,
};
void egress_observe(const struct flow *f)
{
if (in_table(egress_allow, f->sni)) {
counter_inc(&seen[f->pool]);
return;
}
log_alert(f); /* 只写日志,不回包,不 reset */
}
就这么点东西。没有流量画像,没有行为基线,没有那套能自动画拓扑的图。一张四十行的表,一个 sink 挂在出口网关的镜像口上。
我见过太多出站监控,第一版就上异常检测,最后落地成每天两百条告警,运维第三天把它整个静音。四十行数组不会被静音。
为什么只记录不拦截。这一处,作者是真想清楚了。拦下来,你得到一次成功的防守——日志里一行 reset,干净利落,然后什么都没有了。不拦,你得到三十天的记录:终点、频率、每次多少字节、什么时候开始、什么时候停。防守是一次性的,记录可以存档、可以比对、可以拿到评审会上去放。
代价当然有。第三天和第四天出站归零,第五天冒出来 0.9 MB 的细流。
这 0.9 MB 比前面那三十天的 12 到 18 MB 更值钱。它说明对面知道自己被看了。观察窗口这东西,一旦被察觉就缩短,而且不会自己回来。
账要算清楚——早报一天,样本少三十天;晚报一天,多拿一天记录,也多给对方一天。我的判断:对方还没察觉的时候,先别报。你要先知道它潜伏多久了,再决定怎么开口。这不是隐瞒,是把取证窗口用尽。
再说那三十天。比对结果是全部命中,时间窗漂移小于 40 秒。
40 秒这个数字,比"连续三十天"说明的问题多得多。人做不到每天钻进一个 40 秒的窗口里发十几兆。这是 cron,不是手。
比的是什么,是 TLS 指纹——ClientHello 里扩展出现的顺序。
struct tls_fp {
u16 ja3; /* 扩展顺序 + 曲线 + 密码套件 */
u16 ext_order[16];
u8 ext_n;
};
库和库不一样,版本和版本不一样,顺序是有习惯的。这东西当证据不太行,当身份证很行。你把诱饵文件放出去,看谁捡。捡回来那台机器手上的扩展顺序,跟三十天前你在出口抓到的那个一模一样。到这一步你不需要知道对面是谁,你只需要知道是同一个。
这套手法没有一处是高级的。抓包、哈希、比对,一个下午能写完。它的门槛从来不在技术上,在你有没有在出口那根线上放一个东西。
报告呢。
那份年度认证表面整洁,挑不出可指摘之处,范围页写明只覆盖系统边界内的控制。
这句话是整个故事的机关。边界内的控制全部满分——因为边界这条线本身没人审。
范围是一个抽象。抽象的定义就是"把一部分东西排除掉,剩下的看起来就干净了"。写代码的人每天都在干这件事:把副作用隔离进一个模块,那个模块覆盖率 100%,整体照样漏。
认证范围不是技术判断,是合同措辞。所以后面那招我觉得漂亮:把出站数据验证塞进建议清单,采购把它改写成中性条款,发给双方。对手只能同意。不同意,就等于承认自己那点流量不可检查。
说句题外话——工程里最值钱的操作之一,是把一个技术判断翻译成一份对方没法拒绝的措辞。这比写代码难。代码写错编译器会骂你,措辞写错,半年后才知道。
还有日志。那批外发第三天停了,停它的动作在配置变更记录里留着:ACL 自己的服务账号发起,会话来自外部,不是现场工作站。
struct op_log {
u64 ts;
char principal[64];
char session_origin[64];
char action[128];
};
session_origin 是那种在"精简 schema"评审里第一个被砍的字段,理由永远是"网络层已经记了"。网络层记的是 IP,不是人。服务账号一旦共享,日志里全是同一个 principal,等于没记。系统答不出"这份日志被谁读过",别人打个电话就能问出来——那个不表明身份的挖角电话,问的正是谁接触过客户环境里的原始日志。
这不是 HR 问题,是访问控制问题。原始日志的读者集合应该是可枚举、有主、有审计的。多数公司里它不是,谁有 SSH 谁能看。
有个地方我读第一遍和读第二遍的结论不一样。
那位老董事投了弃权票,说认证不等于尽职调查,客户把合规责任外包出去,出事由认证机构扛。故事把他写成劝退的人,我第一遍也跟着读了。
读到合同那页我改口。他说得对。接手的不只是按年计费、首年毛利率六成的一门生意,还是一个有下线的责任方。跟写代码是一回事——你把一个函数抽出去复用的时候,它的错误处理也一起被你引进了,不管你打不打算管。
同一周另一家老客户的竞标,对手报了 112K,同范围正常价接近 170K。亏本报价不是市场竞争,是把对手当一个需要删掉的条目,不是一个需要超过的数字。
所以规则就一条:凡是看到"认证范围"这四个字,先问边界是谁
