【技术分享】浅谈Docker技术及取证原理
Docker是一种容器技术,诞生于2013年初,是基于Google公司的Go语言开发实现的。在容器技术流行之前常用的是虚拟机技术,虚拟机最大的缺点是笨重、启动比较耗时。Docker技术采用隔离的思想,旨在通过隔离来达到极致高效利用资源的目的。本期小拓和读者一起了解Docker核心技术并对Docker下的取证原理进行简单分析。
01 Docker技术简介
Docker镜像采用分层结构,它的底层称为启动文件系统(bootfs)层,这一层对用户来说是透明的。bootfs 的上层为根镜像(rootfs)层,rootfs层通常是精简后的操作系统文件,如 CentOS、Debian和 Ubuntu等。当需要修改镜像内的某个文件时,只对处于最上方的读写层进行修改,而不覆写下层已有文件系统的内容,已有文件在只读层中的原始版本仍然存在,但是会被读写层中的新版文件所隐藏。当将这个修改过的容器文件系统保存为一个新的镜像时,保存的内容仅为最上层的读写层中更新过的文件,这也是Docker 如此轻巧的重要原因之一。这种增量式的修改使Docker镜像易于存储和传输,当用户向Docker Registry推送或者从 Docker Registry拉取一份新的镜像时,不需要下载或推送镜像中所有的文件层,而只需要下载或者推送有变化的文件层即可。
Docker镜像通过联合挂载技术将各层文件系统叠加在一起,最终形成包含所有底层文件与目录的文件系统,镜像按照一定的层次结构叠加而成,一个新的镜像可以基于另一个镜像构建。如无特别说明,下文中的镜像都指的是Docker镜像。
Docker将标准集装箱的概念运用到了自身的设计哲学中,就像货轮只需要运输集装箱而无需关心箱内的货物一样。容器可以用来“运输”一个或一组应用,它里面封装了应用所需要的全部运行环境。基于这个特性,Docker容器可以非常方便地分发复用,拥有强大的可移植性。如无特别说明,下文中的容器都指的是Docker容器。
用户通过docker push命令将镜像推送到Docker Hub后,可以在网站页面中对自己的镜像进行添加描述信息等管理操作,若某一镜像被设定为“公开”状态,则其他用户可以使用docker search和docker pull命令搜索并拉取该镜像。
02 Docker文件存储与配置信息分析
支撑Docker环境的镜像、容器和数据卷等要素及其配置信息都以一定规则存储在宿主机文件系统中,在了解它们的存储机制后,取证人员可以有的放矢地进行调查取证,按需求对特定容器的相关数据信息进行固定和保全。
Docker的默认工作目录位于/var/lib/docker,其中包含于用来构建Docker容器所需的文件系统环境的重要目录和文件,如图1所示。
图1 Docker相关目录及文件
1 Docker镜像存储机制
Docker中各容器的配置信息存放在/var/lib/docker/containers/路径下,这些配置信息包含了一个容器的所有元数据,各配置文件及其内容如表1所示。
表1 配置文件及其内容
Docker工作根目录中/var/lib/docker/linkgraph. db是记录GraphDB的文件,GraphDB是一个构建在SQLite之上的图形数据库,Docker deamon使用GraphDB记录它所维护的所有容器以及它们之间的link关系。GraphDB能够为调用者提供节点增加、删除、遍历、连接和查询等操作,这里的节点就是一个容器,而节点间的边就是一个Docker link关系。每启动一个容器,GraphDB中将会添加一个节点,当某个容器被设置了link操作时,在 GraphDB中就会为其创建一个父子关系(即一条边)。
3 Docker数据卷存储机制
03 Docker的网络配置信息分析
图2 Docker内部的虚拟网络
针对Docker网络的以上特性,取证人员可重点关注 docker inspect[container-ID]命令输出中的“PortBindings”字段和“Networks”字段。在掌握了IP地址和端口等关键信息后,取证人员可以根据这些参数,运用抓包工具对网络上的数据报文进行截获和分析,并将分析结果呈交法庭,达到认定犯罪行为、确定犯罪嫌疑人的目的。
04 Docker环境的进程关系信息分析
图3 Docker相关进程关系
本期小拓对Docker技术及基于Docker环境的取证原理进行了阐述。在了解相关技术原理后,取证人员便能按需求对Docker关键数据进行固定,根据IP地址和端口等信息截获和分析数据,然后依照各进程之间的隶属关系和PID获取方式来精确对容器中的进程进行分析取证。