先收集会消失的东西
一句话总结
证据要按消失速度从快到慢来收集。收集的顺序和决定不收集的界线,必须固化在代码里而不是文档里,下一个人才能重复同样的做法。
为什么需要它
进入故障现场后,手会先伸向日志文件。日志看得见,一打开就能读,也容易复制。然而在下载日志的这 10 分钟里,进程列表会变,已打开的连接会关闭,内核统计会刷新,临时文件会被删除。日志明天还在原地,而那些东西只存在于此刻。
这 10 分钟的差别,之后会左右结论。如果回答不了“当时那个进程在运行吗”这个问题,就无法排除一个假设,而没有排除的假设会让调查范围一直保持在扩大的状态。
工作原理
这个问题早就有了定论。RFC 3227 "Guidelines for Evidence Collection and Archiving" 的第 2.1 节写道“从易失性高的向易失性低的推进”,并给出了典型系统的七组示例顺序。
1 레지스터, 캐시
2 라우팅 테이블, ARP 캐시, 프로세스 표, 커널 통계, 메모리
3 임시 파일 시스템
4 디스크
5 그 시스템과 관련된 원격 로깅·모니터링 자료
6 물리 구성, 네트워크 토폴로지
7 보관 매체
该代码块中的韩文依次为:1 寄存器、缓存;2 路由表、ARP 缓存、进程表、内核统计、内存;3 临时文件系统;4 磁盘;5 与该系统相关的远程日志和监控数据;6 物理配置、网络拓扑;7 存档介质。
这个顺序给出的不只是优先级,还给出了判断的依据。被问到为什么先取进程列表时,可以回答的不是“凭感觉”,而是“它属于第 2 组,而磁盘是第 4 组”。所以收集计划要做成逐项写明等级的文件,收集器则不做排序、原样遵循该文件的顺序。一旦排序,判断就藏进了代码里。
同一份 RFC 的第 2.2 节也写了应当避免的事:不要重启或关闭系统,不要信任将作为证据的程序,不要使用会改变数据的工具,等等。
如何证明已经收集过
光有收集还不够。几周之后,会有人问“这个文件确实是那天从那台服务器上取出来的吗”。所以每份收集到的文件都要同时记录三件事。
- 何时:收集时间。逐项分别记录。只用整个证据包的一个时间,无法证明顺序。
- 谁:收集者。之后要有可以询问的人。
- 用什么:实际执行的命令。不是“下载了日志”,而是那条命令本身。
在此之上再加一层内容指纹。为每个文件计算 sha256 并写进清单(manifest),之后再做一次同样的计算,就能知道是否有哪怕一个字符发生了变化。这里有必要再往前走一步:只把文件哈希写进清单的话,只要把清单改掉就万事大吉了。所以要把清单本身的哈希另存为一个文件,这就是封存。
封存无法防止伪造。能够同时修改清单和封存文件的人多得是。封存防止的是在不知不觉中发生的变化:有人用编辑器打开后保存了,复制过程中被截断了,或者压缩包损坏了。实际上,这类事故比恶意伪造要常见得多。
在现场相遇的样子
第一,想全部收集的话,就会把客户数据整个带走。支付服务器的生产数据库里有姓名、邮箱和电话号码。一旦把它转储下来放进笔记本电脑,我们就不再是调查者,而成了新的风险。所以收集计划里还要在同一个文件中写明决定不收集的项目及其原因。
重要的不是悄悄去掉,而是把“已去掉”这件事留在记录里。如果清单里写着“该项已排除,原因是这个”,之后需要那份数据时,就能立刻知道应该申请什么。悄悄去掉的话,没有人知道它曾经存在。
第二,有些收集命令会改变数据。比如打开日志文件时编辑器创建了锁文件,或者连接数据库导致统计信息被更新。如果有只读打开的办法就用它,没有的话就记下改动了什么。
第三,时间用标准格式书写。如果服务器时区和我们笔记本电脑的时区不同,之后对齐时间线时会整整错开一小时。用 RFC 3339 格式写 UTC,并把服务器的时区设置也单独作为收集项目。
第四,一并留下验证工具。只留封存值的话,下一个人要手工计算哈希再比较。有了验证工具,一行命令就能完成,而且最重要的是它能指出具体是什么被破坏了。只输出“封存已被破坏”的验证工具,会让人一直守在那里。
实际工作中真正重要的事
- 按消失的顺序收集。把顺序写进计划文件,收集器原样遵循这个顺序。
- 逐项记录何时、谁、用什么。不是给整个证据包只记一次。
- 清单也要封存。只有文件哈希的话,改掉清单就结束了。
- 把决定去掉的项目记录下来。悄悄去掉的话,没有人知道它曾经存在。
下一项实验要做什么
拿到(虚构的)Seojin 化学的一台支付服务器。易失性高的内容,从实验 Pod 的 /proc 中真实读取;留在磁盘上的内容,则从准备好的位置读取。按 RFC 3227 的等级为每个项目定级来制定收集计划,编写按该顺序收集的收集器,把收集时间、收集者、命令和 sha256 写进清单并封存清单。然后编写检查封存是否被破坏的验证工具:评分器会悄悄修改你的证据包中的一个文件,再看你的验证工具能否指出它的名字。最后,在含有客户个人信息的项目上划出界线,并确认“已去掉”这件事留在了记录里。