◆丁润石 曾世平
浅析Docker取证分析技术
◆丁润石 曾世平
(四川警察学院 四川 646000)
当前互联网应用越来越发达,而Docker容器技术也受到了应用提供商的关注,广泛地运用在互联网服务的各处。由于Docker有小巧、灵活、方便部署、资源占用少等特点,许多Web服务都采用了Docker技术,针对Docker的网络攻击行为也越来越多,此外,一些不法网站也开始使用Docker技术进行部署,因此,本文研究了针对Docker环境进行取证工作的相关技术,为Docker环境的取证分析提供智力支持。
Docker;虚拟容器;电子取证
Docker作为广泛使用的开源应用容器引擎,其是以应用引擎的方式,依托宿主Linux系统的内核而建立的,只需要将相关源码、环境配置和依赖库封装成一个虚拟机即可,因此体积相比传统虚拟机大大减小,一台服务器便可以轻松运行上百个Docker容器,极大减小了计算机硬件压力。得益于此,Docker大量应用在服务系统平台,而其中所涉及的用户数据等安全问题也愈发凸显。例如,当我们发现不法分子在攻击Docker容器中的服务器时,很有可能容器自身连同服务器都受到了威胁,而其中的大量数据、用户信息和相应的计算机资源往往也就处于危险的状态,对于企业和用户将造成巨大损失。由于Docker的特点,针对Docker的取证并不能使用传统的电子数据取证方式,这也就对取证方法提出了更高要求。
针对Docker容器的取证分析工作对保障互联网安全有重要意义,特别是对违法犯罪网站、数据库、嫌疑人的虚拟主机等Docker环境的电子取证,在我们掌握了Docker相关取证方法后,能够更好地发掘这类电子数据中的有效证据,打击网络犯罪。
Docker是Linux Containers(LXC)虚拟化技术的高级容器引擎,Docker运行的过程中将每个进程封装隔离,使其独立于宿主和其他进程,因此称之为容器。Docker自身在运行过程中性能开销极小,且具有非常高的可移植性,使用Docker可以为用户提供更高效、更轻量的容器方案。用户只需要对程序封装一次,即可在多个地方运行,极大减小用户的开发和使用成本,满足了用户不需要重新配置即可在多个环境中运行的需求。
在Docker中有三个重要概念,分别是镜像(Image)、容器(Container)和仓库(Repository)。
镜像(Image)是一种特殊的文件存储形式和冗余类型,一个镜像是一个磁盘的完整副本。在Docker中,镜像是创建Docker容器的基础,镜像中一般包含基础的容器运行必要的程序和配置,开发人员可以根据需要自定义所需的镜像,同时,用户也很容易通过互联网下载他人分享的镜像文件,通过简单的命令创建所需的容器。
容器(Container)类似于通常使用的虚拟机,但是它更加轻量,同时可以像沙箱一样最大限度隔离和运行应用,因此,对于镜像而言,容器是镜像的一个动态实例,容器可以在用户需要时,通过在镜像外创建一个可以读写的外套,从而达到对容器的创建并启动、停止、关闭、删除,而镜像是只读的,本身不会被更改。
仓库(Repository)是用来存放Docker的地方,它集中存储各类Docker容器,方便用户在需要时直接使用。根据仓库是否对他人公开,可以具体分为公有仓库和私有仓库,目前Docker Hub是互联网上用户使用最多的公有仓库,在用户明确要使用哪种类型的镜像时,便可以通过Docker命令在仓库中直接下载相应的镜像,方便用户使用,同时,用户也可以通过命令将自己的镜像上传到公有仓库中,给他人使用。
这三者的概念可以简单理解为:容器利用Docker构建出一个可供应用运行的虚拟环境,而Docker也能够利用镜像来还原构建的容器。
使用Docker容器,如同在终端中操作计算机一般,因此为了后面更好地说明Docker的使用,在这里列举一些在使用Docker过程中常见的命令:
安装命令:
[yum update]:更新yum;
[sudo yum install -y yum-utils device-mapper-persistent-data lvm2]:安装依赖;
[yum-config-manager --add-repo 源网址]:安装yum源,网址可以设置为“http://mirrors.aliyun.com/docker-ce/Linux/centos/docker-ce.repo”,即可安装阿里yum源;
[yum install docker-ce]:安装Docker-ce;
[systemctl start docker]:启动Docker服务 ;
[docker info]:用于查看当前Docker容器系统的所有信息,如服务版本信息、镜像数量、暂停和运行中的容器数等;
[docker version]:用于查看Docker详细版本信息、建立时间等;
进程命令:
[systemctl enable docker]:设置开机启动Docker服务;
[systemctl stop docker]:停止Docker服务;
[systemctl restart docker]:重启Docker服务;
[systemctl status docker]:查看Docker服务状态。
镜像命令:
[docker images]:查看本地镜像,名称、镜像ID、创建时间和大小等;
[docker search 镜像名称]:通过在线的方式在Docker的官方仓库中查找镜像;
[docker pull 镜像名称:版本号]:拉取在仓库之中查找到的镜像,另外,也可将镜像的名称更改为非官方的网址,例如拉取网易镜像中心提供的Nginx镜像即为:hub.c.163.com/library/nginx:latest;
[docker rmi 镜像ID]:删除拉取到本地的镜像。
容器命令:
[docker ps]:查看所有容器及其详细信息,如容器ID、容器名称、创建时间和端口映射情况等;
[docker run]:创建并启动容器,如通过命令[docker run hub.c.163.com/library/nginx]可以在前台运行Nginx镜像,另外添加参数-d可以在后台运行[docker run -d hub.c.163.com/library/ nginx];
[docker exec -it 容器名称(或容器ID)/bin/bash]:进入容器并打开一个伪终端;
[docker stop 容器名称(或容器ID)]:停止容器;
[docker start 容器名称(或容器ID)]:启动容器;
[docker rm 容器名称(或容器ID)]:删除容器;
[docker logs -f 容器ID]:查看容器运行日志。
Docker容器(Docker Container)是将相关服务交付给用户的最终体现形式,在用户端通过容器来获得相关的服务,Docker根据用户的命令来定制所需的容器。
用户在使用过程中,通过制定所需要的镜像,使容器可以拉取相应的镜像,自定义用户空间(Rootfs)等文件系统;用户通过指定资源的配额让容器可以使用宿主计算机的资源;用户通过配置网络及安全策略,让容器拥有独立的网络环境;用户通过命令使容器执行相应的工作。
Linux系统在启动时都会加载Bootfs文件系统,之后Bootfs文件系统将被卸载掉;用户空间的文件系统则是用户空间(Rootfs),其中包括/dev、/bin和/proc等。在Docker容器中,用户拉取的镜像实则便是用户空间(Rootfs),对于一个精简的系统来说,用户空间(Rootfs)便可以远小于一个完整的系统镜像,其中只需要有基本的命令、工具和程序库,而在运行时最底层则直接使用宿主主机的内核(Kernel)。
综上所述,容器中实则包含了用户空间(Rootfs),并通过容器管理(LibContainer)连接网络、计算资源等。
查看Docker容器内的文件目录,实则和在Linux环境下的文件目录是相似的,只不过要查看容器内部的文件则需要进入容器内以伪终端的方式查看,并且部分对文件的操作命令无法在容器内使用。这里以Tomcat容器为例:
通过命令[docker exec -it 36d bash]进入容器内部,打开伪终端,使用命令[pwd]查看当前目录的位置:
图1 当前路径命令
可以看到,当前位于/usr/local/tomcat,实则该目录是容器虚拟出来的一个虚拟目录,在Linux系统下并没有真实存在,但是可以通过当前的Tomcat伪客户端对该目录进行操作,通过命令进入该目录会看到与真实的Tomcat目录大致一致:
图2 查看当前路径下的文件及目录
退出容器伪终端,输入[docker inspect 36d]查看容器ID开头为36D的容器详细信息,找到MergedDir信息:
图3 查看容器详细信息
进入该目录,便可以详细查看到详细的文件目录,并根据需要展开详细分析。
使用Docker如同我们日常使用的其他系统,Docker也为用户提供了日志功能。通过日志,用户可以充分了解Docker日常运行时的细节。当用户执行命令[docker logs]之后,实际上是Docker客户机向Docker Daemon,即Docker的守护进程发送请求,Docker Daemon在运行容器时,会先创建一个Goroutine(协程),绑定整个容器内所有进程的标准输出文件描述符,因而在容器内只要有标准输出的日志,则都将被Goroutine所接收,这些日志则会被Docker Daemon按照容器的ID以及日志类型读取,最终以.json格式输出到Docker用户端上存放。
常见的关于容器日志使用的命令如下:
[docker logs [options] [container]]
部分options(参数)说明:
-f:跟踪某个容器的实时日志,--since string:显示某个Timestamp(时间戳)之后的日志,或者相对时间,如30m即30分钟;
--tail string:仅列出最新的N条容器日志,默认为全部;
-t:显示时间戳;
--until string:显示自某个Timestam(时间戳)之前的日志,或者相对时间,如30m即30分钟。
例如:
[docker logs -f 36d]:该命令将输出容器ID为36d的容器日志全部内容;
图4 输出容器日志
[docker logs -f --since 30m 36d]:将输出容器36d最近30分钟的日志。
本文通过分析Docker的发展及相关技术背景,介绍了其技术特点和相关概念,对Docker的运行原理做了说明,结合取证工作,对Docker使用及取证过程中可能涉及的部分命令进行了说明,分析研究了对Docker取证的相关思路,从运行原理、结构框架、内部的文件目录和容器日志开展分析,并结合工作中可能涉及的重要部分详细进行阐述,例如:容器中的关键路径、重要的文件目录及操作日志等。
[1]张涵.Docker环境下的网站取证分析研究[D]. 重庆:重庆邮电大学,2017.
[2]向杰. Docker环境下取证技术研究[D]. 重庆:重庆邮电大学,2018.
[3]王远征,肖波,齐凌飞. Docker取证方法研究[C]. 湖北:湖北省公安厅电子数据鉴定中心,2017.
[4]李鹏超,周凯. 基于Docker容器的电子数据取证方法[D]. 吉林大学学报,2019,(06):1485-1490.
[5]林逸风. 面向Docker环境的的调查取证研究[D]. 重庆邮电大学,2017.
[6]梁富伟. 基于Docker的Linux系统实验操作环境设计[J].电脑与信息技术,2020,(05):33-36.
[7]李鹏超,路斐,向勇. 基于云环境中Docker容器的取证技术研究[J].西安邮电大学学报,2018.
[8] Greg Gogolin.Digital Forensics Explained[B],2021.
大学生创新创业训练项目(S202012212094);四川警事科学研究院项目(CJKY202008)