1. 基本信息收集
1.1 获取容器列表
-
运行中的容器:docker ps
-
所有容器(包括停止的):docker ps -a
-
根据条件筛选:docker ps –filter <筛选条件>
1.2查看容器详细信息
-
容器详情:docker inspect <container_id>
-
容器日志:docker logs <container_id>
-
容器实时状态:docker stats <container_id>
-
实时显示容器资源使用情况
1.3 镜像信息
-
列出所有镜像:docker images
-
镜像详细信息:docker inspect <image_id>
1.4 检查docker环境
-
显示系统范围的信息:docker info <image_id>
-
显示的信息包括内核版本、容器和映像的数量等
-
显示磁盘使用情况:docker system df (-v显示详细使用情况)
1.5 日志收集
-
容器日志:使用docker logs <container_id>获取特定容器的日志。比如,Ubuntu下可使用如下bash脚本获取全部容器日志:
#!/bin/bash
# 获取当前日期时间
export_date_time=$(date +“%Y%m%d_%H%M%S”)
# 获取所有运行中的 Docker 容器的 ID 和名称
containers=$(docker ps –format “{{.ID}} {{.Names}}”)
# 创建一个目录来保存日志文件
mkdir -p docker_logs
# 遍历每个容器
while read -r container_id container_name; do
# 导出容器日志,并保存为文件
log_filename=“${container_name}_${export_date_time}.log”
log_path=“docker_logs/${log_filename}”
docker logs $container_id > “$log_path”
echo “Exported logs for container ${container_name} to $log_path”
done <<< “$containers”
echo “All logs have been exported.”
-
守护进程日志:通常位于/var/log/docker.log。(docker desktop for windows默认:C:Users用户名AppDataLocalDockerlog )
-
系统日志:如/var/log/syslog、/var/log/messages等。
2. 文件系统分析
2.1 备份容器文件系统
-
导出容器文件系统:docker export <container_id> > container_bak.tar
随后可对导出的container_bak.tar进行分析,可使用x-ways、法证通等取证工具解析。
2.2 分析文件系统
-
进入容器:docker exec -it <container_id> /bin/bash 或 sh
-
查看文件和目录:ls -la, cat <file_path>, grep <pattern> <file_path>
2.3 查看文件系统更改
-
Docker diff:显示docker容器文件系统的变更。A: 表示新增的文件或目录。D: 表示删除的文件或目录。C: 表示修改过的文件或目录。
2.4 Docker 文件结构解析
Docker 使用一种称为联合文件系统(Union File System, UnionFS)的技术来高效地管理容器的文件系统。在当前版本中,Docker 大多使用 overlay2 存储驱动。下面将详细介绍 Docker 容器文件结构及其各个组成部分,并以 overlay2 存储驱动为例进行说明。
2.4.1 主目录结构
Docker 的主目录通常位于 /var/lib/docker。在这个目录下,你可以找到与 Docker 相关的所有数据文件。
1)/var/lib/docker
这是 Docker 守护进程的主要存储目录,其中包含了 Docker 镜像、容器和其他组件的数据。
2.4.2 镜像存储
1)/var/lib/docker/containers
这个目录包含了所有容器的数据。每个容器都有一个对应的子目录,其中包括容器的日志文件、配置文件以及其他与容器相关的数据。
-
日志文件:通常位于 <container_id>/json.log 或其他日志驱动指定的位置。
-
配置文件:每个容器都有一个配置文件,如 <container_id>/config.v2.json,其中包含了容器的配置信息。
2)/var/lib/docker/image
这是 Docker 镜像的存储目录。镜像以层的形式存储,每一层代表了镜像的一部分。
-
镜像元数据:镜像的元数据存储在这个目录中,包括镜像的标签、创建时间等信息。
3)/var/lib/docker/overlay2
假设容器
的 ID 是 9086213335250608234049945854659426557966195238968291234567890
,并且它基于一个包含三个镜像层的 Docker 镜像构建而成。
/var/lib/docker/
└── overlay2/
├── 9086213335250608234049945854659426557966195238968291234567890
# 容器目录
├── 9086213335250608234049945854659426557966195238968291234567891
# 镜像层目录
├── 9086213335250608234049945854659426557966195238968291234567892
# 镜像层目录
└── 9086213335250608234049945854659426557966195238968291234567893
# 镜像层目录
-
容器层:每个容器都有一个对应的目录,这些目录包含了容器的文件系统信息。例如:
/var/lib/docker/overlay2/9086213335250608234049945854659426557966195238968291234567890/
├── id # 容器的 ID 文件
├── init # 初始化文件
├── links # 链接信息
├── merged # 文件系统视图
├── upper # 可写层
└── work # 工作目录
² id:容器的 ID 文件。
#cat id
#9086213335250608234049945854659426557966195238968291234567890
² init:初始化文件,包含有关容器初始化的信息。
² links:包含容器与其他容器的链接信息。
² merged:这是容器的文件系统视图,包含了所有只读层和可写层的合并结果。
#ls merged
#bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
² upper:这是容器的可写层,包含了容器运行时所做的所有更改。
#ls upper
#etc home root tmp var
² work:这是一个工作目录,用于存储临时文件,如正在进行中的写操作。
ls work
bin dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var
-
镜像层:每个镜像层都有一个对应的目录,这些目录包含该层的文件系统变更。例如:
/var/lib/docker/overlay2/9086213335250608234049945854659426557966195238968291234567891/
├── diff # 镜像层的文件系统变更
└── link # 引用计数
²diff:包含该镜像层的文件系统变更。
²link:指向该层的引用计数。
2.4.3 容器存储
1)/var/lib/docker/containers/<container_id>
每个容器都有一个唯一的 ID,容器的所有数据都被存储在与之对应的子目录中。
-
文件系统:容器的文件系统通常是通过 overlay2 存储的,位于 /var/lib/docker/overlay2/<container_id>/merged。
-
日志文件:容器的日志文件通常位于 <container_id>/json.log 或其他日志驱动(docker run 或daemon.json配置)指定的位置。
-
配置文件:容器的配置文件,如 <container_id>/config.v2.json。这个文件包含了容器的配置信息,如容器的名称、镜像ID、命令行参数、环境变量等。
2.4.4 网络配置
1)/var/lib/docker/networks
这个目录包含了 Docker 网络的信息,每个网络都有一个对应的子目录,其中包含了网络的配置信息。
-
网络配置文件:每个网络都有一个配置文件,如 <network_id>/config.json。
-
网络插件信息:如果有使用网络插件,相关信息也会存储在这里。
2.4.5 其他文件和目录
1)/var/lib/docker/swarm
如果 Docker Swarm 模式被启用,这里会存储集群相关的数据,比如证书。
2)/var/lib/docker/bundles
这个目录用于存储 Docker Swarm 模式下的服务信息。
3)/var/lib/docker/buildkit
如果启用了 BuildKit 构建功能,那么这个目录将用于存储 BuildKit 的数据。
4)/var/lib/docker/tmp
临时文件存储目录,用于存放 Docker 运行过程中产生的临时文件。
3. 网络分析
3.1 网络连接信息
-
查看容器网络连接:
docker exec -it CONTAINER_ID netstat -tuln
docker exec -it CONTAINER_ID ss -tuln
-
查看网络接口信息
docker inspect CONTAINER_ID | jq ‘.[0].NetworkSettings’
如果没有jq 则在整个inspect输出中查找网络接口信息
docker inspect CONTAINER_ID
-
使用 docker stats 查看容器的网络 I/O 统计
docker stats CONTAINER_ID
-
使用 ipconfig 或 ifconfig 查看网络接口配置
docker exec -it CONTAINER_ID ifconfig
-
使用 iptables 查看容器的防火墙规则
-
捕获网络流量:使用tcpdump或wireshark等工具。
docker exec -it CONTAINER_ID tcpdump -i any
3.2 DNS查询记录
-
DNS查询记录:docker exec -it <container_id> cat /var/log/dmesg (对于某些容器)
4. 进程分析
4.1 查看容器内进程
-
列出容器内的进程:docker exec -it <container_id> ps aux
4.2 进程详细信息
-
查看进程详细信息:docker exec -it <container_id> ps -ef
通过对 Docker 容器的基本信息收集、日志收集、文件系统分析以及网络配置分析等方面的详细介绍,我们希望能够帮助读者更好地进行docker容器取证分析工作。我们将继续关注容器技术的发展动态,如果您在进行docker容器取证时有任何疑问或需要进一步的帮助,欢迎随时联系我们。
产品咨询
技术工程师
贺 佳:13908073212
王高阳:18513400125
微信助手
关于我们
北京天宇宁达科技有限公司创建于 2016 年,前身为 2009 年的北京天宇宁科技有限公司。历经十余年的发展与积累,天宇宁达已成为国内电子数据取证行业卓越领先的产品与解决方案供应商,同时也是国内知名的电子数据专业取证服务与培训机构。
原文始发于微信公众号(CFlab):技术分享|Docker取证分析的一些方法