两个审计问题听起来相似,需要的证据却属于不同种类。某个地址被哪个会话访问过,可以从连接记录和流记录中回答。某个页面被哪个人打开过,通常无法回答,至少无法从这些记录中回答。在选定问题之前先选定采集工具,正是网络团队最终把主机名当成浏览历史的常见方式。

先从审计必须确立的事件开始

把问题写成一句包含主语、动词和时间的话。仅这一条纪律就能揭示会话记录与页面浏览之间的差距。会话日志能确立的是:某个身份在一段时间内被接受,并获得了在已记录策略下分配的地址;它无法确立任何人读了哪个页面,因为它从未看到请求。

在设计采集方案之前先给这次观测命名。一个以访问过的站点命名、实际保存的却是解析后的名字的字段,不是便利,而是未来的一处错误。字段名的寿命比选定它的人更长,所以要选描述证据、而非描述结论的名字。

每种记录能支持什么、不能支持什么

几乎每一种审计设计里都会出现四类记录,每一类回答不同的问题。无论在报告里还是在管线里都要把它们分开,因为混为一谈正是一个站得住脚的结论变得尴尬的原因。

The question being askedRecord that can answer itWhat that record provesWhat still needs a join
Was this address contacted?Flow recordThe connection five-tuple and when it was seenWhich session held the address at that moment
Which account held that address?Session logWhich identity authenticated and the tunnel address it receivedWhich device or person used that account
Was this name looked up?Resolver queryThat this resolver was asked for this nameWhether a page was fetched, and by whom
Was this page viewed?Proxy or application transactionThe request and identity recorded inside that application's scopeTraffic outside that application's visibility
Who was the person?None of the four on its ownAn account in use, at bestA named human, whenever accounts are shared

读最后一列要像读中间那列一样仔细。流记录描述的是地址和端口,而对地址做反向查询并不能还原浏览器使用的名字,因为一个地址可以承载许多互不相关的站点。解析器查询证明的是问题被问过,而不是页面被展示过。TLS 协商期间可见的主机名同样不是加密的请求路径。

这些每一条都是真实的观测,却没有一条是人们以为的那种观测。坚持使用自家加密解析器的浏览器落在被监视范围之外,而分析无法恢复日志从未看见的东西。这个缺口应当作为明确写出的限制出现在报告里,而不是脚注。

提前解析与被缓存的结果

浏览器会提前解析名字,有时根本不加载任何内容。它们还会直接用缓存作答,不向你正在观察的解析器发送新查询,这意味着没有查询并不等于没有访问。这两种行为都打破了 DNS 日志与浏览历史之间那个天真的等号。

DNS over HTTPS 又添了一道边界:自带解析器的浏览器或访客应用,从不会向组织的日志器问任何问题。精确的事务只来自应用自身的事件,或来自你明确支持其日志的代理。普通的 HTTPS CONNECT 隧道不会让代理看到其中任何页面路径。拥有网络并不等于获准悄悄替换应用的信任模型。

地址属于会话,而不属于某个人

带有隧道网段地址的流记录是起点,而不是答案。要把那个地址和时间戳与当时生效的会话分配关联起来,因为同一个地址一小时后就可能分配给另一个会话。静态编址是保持这种关联的一种办法,而不是唯一的办法。

当某个转换环节在传感器上游把多台设备合并成一个源地址时,关联只能指向共享的网关会话。无论网络数据看起来多么完整,共享账号或多人共用的证书都会限制归因。这两点都应当作为限制写进报告,而不是留作事后的提醒。

要记录时区、时钟来源、观测点以及其间每一处转换边界。缺失值得和存在一样认真对待,因为记录缺失可能意味着流条目已经过期、传感器从未看到那个数据包,或者某个应用日志被关掉了。

按声明的目的设计,再证明整条管线

问题一旦确定,就界定需要哪些字段、谁可以读、保存多久。因为存储便宜就多收集,会制造出比调查本身活得更久的负担。RFC 6973中的隐私模型把关联、错误归因和过度收集当作设计问题,而不是事后的补充想法。

要把映射关系和记录当作一个对象来保护,因为单独任一部分的敏感程度都远低于两者合在一起。然后用你获准生成、并且已经理解的活动来验证设计,只使用报告将要依赖的最小查询。一条无法复现已知事件的管线,也无法复现未知事件。用证据允许的措辞报告证据所支持的事件,让读者自己去得出更大的结论。

把限制写在结论旁边:关联了什么、转换了什么、哪个日志始终沉默。一条说明自身边界的结论能经受住一份自信的摘要经受不住的审阅。这就是证据与关于证据的故事之间的区别。

相关文章