Docker容器的取证

2024-09-25

以下内容参考于 天宇宁达 的一篇技术分项

  1. 如果忘记了docker的相关命令
    1. 在命令行里输入 history 查看以往的命令
    2. 就是有点费时间
  2. Docker的配置文件:
    1. 通常时在 docker-compose.yml 这个文件里面
    2. 在这个文件里面可以看到,存储映射地址的关系
  3. docker的容器管理命令:
    1. 列出运行中的容器:
      1. docker ps
    2. 查看所有的容器:
      1. docker ps -a
      2. 包括所有的容器(包括未运行的)
    3. 停止容器:
      1. docker stop <container_id_or_name>
    4. 强制停止容器:
      1. docker kill <container_id_or_name>
    5. 列出所有镜像:
      1. docker images
      2. 镜像详细信息:
        1. docker inspect <image_id>
    6. 检查docker环境:
      1. 显示系统范围的信息:docker info <image_id>
        1. 显示的信息包括内核版本、容器和映像的数量等
      2. 显示磁盘使用情况:docker system df (-v 显示详细使用情况)
    7. 启动已停止的容器
      docker start <container_id_or_name>
      启动一个已经停止的容器,例如:
      docker start my_container
      查看容器的详细信息
      docker inspect <container_id_or_name>
      查看容器的所有配置信息和状态,例如:
      ==docker inspect my_container==
  • 查看容器日志
    docker logs <container_id_or_name>
    显示容器的输出日志,例如:
    ==docker logs my_container==

  • 查看容器中的进程
    docker top <container_id_or_name>
    列出容器内部正在运行的进程,例如:
    ==docker top my_container==

  • 查看容器的基本信息
    docker container ls
    显示所有正在运行的容器的基本信息,包括容器 ID、镜像、状态和端口等。例如:
    docker container ls
    这个命令类似于 ==docker ps==,可以显示容器的 ID、镜像名称、创建时间、状态、端口映射等信息。

  • 进入容器的交互式终端
    docker exec -it <container_id_or_name> /bin/bash
    进入容器的 Bash 终端,进行交互式操作,例如:
    ==docker exec -it my_container /bin/bash==

  • 退出容器 当你在容器内操作完成后,可以使用 ==exit== 命令退出终端:
    ==exit==

  • 删除已停止的容器
    ==docker rm <container_id_or_name>==
  • 删除一个已停止的容器,例如:
    ==docker rm my_container==

  • 强制删除正在运行的容器
    docker rm -f <container_id_or_name>
    强制删除一个正在运行的容器,例如:
    ==docker rm -f my_container==

注意:

一定要先启动容器,才能进入容器

  1. 查看容器里的数据库密码:
    1. 一般是在 docker-compose.yml 这个配置文件里面会有
  2. 日志收集:
    1. 容器日志:
      1. 使用docker logs <container_id> 获取特定容器的日志。比如,Ubuntu下使用如下bash命令可以获取全部容器日志: export_date_time=$(date +”%Y%m%d_%H%M%S”) # 获取当前日期时间

containers=$(docker ps –format “ “) # 获取所有运行中的docker容器的 ID 和 名称

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.”==

  1. 守护进程日志:
    1. 通常位于 /var/log/docker.log
    2. windows端: C:\User\用户名\AppData\Local\Docker\log
    3. 系统日志:
      1. /var/log/syslog
      2. /var/log/messages
  2. 文件系统分析:
    1. 备份容器文件系统:
      1. 导出容器文件系统:
        1. Docker export <container_id> container_bak.tar
        2. 随后可对导出的container_bak.tar进行分析,可使用 x-ways、法证通等取证工具解析
    2. 分析文件系统:
      1. 先进入容器:
        1. Docker exec -it <container_id> /bin/bash 或 /bin/sh
      2. 查看文件和目录: 使用 ls、cat、less 等命令
  3. 查看文件系统更改:
    1. Docker diff:显示docker容器文件系统的变更
      1. A 表示新增的文件或目录
      2. D 表示删除的文件或目录
      3. C 表示修改过的文件或目录
      4. 例子:
        1. Docker diff mysql
  4. Docker 文件结构解析:
    1. Docker 使用一种称为联合文件系统(union file system,unionFS)的技术来高效地管理容器的文件系统。在当前版本中,docker大多使用overlay2存储驱动。下面将详细介绍docker容器文件结构及其各个组成部分,并以overlay2存储驱动为例进行说明
      1. 主目录结构
        1. docker的主目录通常位于 /var/lib/docker 。在这个目录下,你可以找到与docker相关的所有数据文件。
        2. /var/lib/docker:
          1. 这是docke守护进程的主要存储目录,其中包含了docker镜像、容器和其他组件的数据
      2. 镜像存储:
        1. /var/lib/docker/containers
          1. 这个目录包含了所有容器的数据。每个容器都有一个对应的子目录,其中包括容器的日志文件、配置文件以及其他与容器相关的数据
            1. 日志文件:通常位于 <container_id>/json.log 或其他日志驱动指定的位置
            2. 配置文件:每个容器都有一个配置文件,如<container_id>/config.v2.json ,其中包含了容器的配置信息
        2. /var/lib/docker/image:
          1. 这是docker镜像的存储目录。镜像以层的形式存储,每一层代表了镜像的一部分
            1. 镜像元数据:镜像的元数据存储在这个目录中。包括镜像的标签、创建时间等信息
        3. /var/lib/docker/overlay2:
          1. 假设容器的ID是 9086213335250608234049945854659426557966195238968291234567890,并且它基于一个包含三个镜像层的docker镜像构建而成

==/var/lib/docker/==

==└── overlay2/==

==├── 9086213335250608234049945854659426557966195238968291234567890 ==

==# 容器目录==

==├── 9086213335250608234049945854659426557966195238968291234567891 ==

==# 镜像层目录==

==├── 9086213335250608234049945854659426557966195238968291234567892 ==

==# 镜像层目录==

==└── 9086213335250608234049945854659426557966195238968291234567893 ==

==# 镜像层目录==

**

  1. 容器层:每个容器都有一个对应的目录,这些目录包含了容器的文件系统信息 ==/var/lib/docker/overlay2/9086213335250608234049945854659426557966195238968291234567890/==

==├── id # 容器的 ID 文件==

==├── init # 初始化文件==

==├── links # 链接信息==

==├── merged # 文件系统视图==

==├── upper # 可写层==

==└── work # 工作目录==

  1. id:容器的ID文件
  2. links:包含容器与其他容器的链接信息
  3. merged:这是容器的文件系统视图,包含了所有只读层和可写层的合并结果
  4. upper:这是容器的可写层,包含了所有只读层和可写层的合并结果
  5. work:这是一个工作目录,用于存储临时文件,如正在进行中的写操作
  6. 镜像层:每个镜像层都有一个对应的目录,这些目录包含该层的文件系统变更,例如: ==/var/lib/docker/overlay2/9086213335250608234049945854659426557966195238968291234567891/==

==├── diff # 镜像层的文件系统变更==

==└── link # 引用计数==

  1. diff:包含该镜像层的文件系统变更
  2. link:指向该层的引用计数

  3. 容器存储:
    1. /var/lib/docker/containers/<container_id>
      1. 每个容器都有一个唯一的ID,容器的所有数据都被存储在与之对应的子目录中
        1. 文件系统:容器的文件系统通常是通过 overlay2 存储的,位于/var/lib/docker/overlay2/<container_id>merged
        2. 日志文件:容器的日志文件通常位于<container_id>/json.log 或其他日志驱动(docker run 或 daemon.json 配置)指定的位置
        3. 配置文件:容器的配置文件,如<container_id>/config.v2.json这个文件包含了容器的配置信息,如容器的名称、镜像ID、命令行参数、环境变量等。
  4. 网络配置:
    1. /var/lib/docker/networks
      1. 这个目录包含了docker网络的信息,每个网络都有一个对应的子目录,其中包含了网络的配置信息
        1. 网络配置文件:每个网络都有一个配置文件,如<container_id>/config.json
        2. 网络插件信息:如果有使用网络插件,相关信息也会存储在这里
  5. 其他文件和目录:
    1. /var/lib/docker/swarm:
      1. 如果docker swarm模式被启动,这里会存储集群相关的数据,比如证书
    2. /var/lib/docker/bundles
      1. 这个目录用于存储docker swarm模式下的服务信息
    3. /var/lib/docker/buildkit:
      1. 如果启用了buildkit构建功能,那么这个目录将用于存储buildkit的数据
    4. /var/lib/docker/tmp:
      1. 临时文件存储目录,用于存放docker运行过程中产生的临时文件
  6. 网络分析:
    1. 网络连接信息:
      1. 查看容器网络连接: ==docker exec -it CONTAINER_ID netstat -tuln==

==docker exec -it CONTAINER_ID ss -tuln==

  1. 查看网络接口信息: docker inspect CONTAINER_ID | jq ‘.[0].NetworkSettings’

  2. 如果没有jq则在整个inspect输出中查找网络接口信息 docker inspect CONTAINER_ID

  3. 使用 docker stats查看容器的网络 I/O统计: docker stats CONTAINER_ID

  4. 使用ipconfig或ifconfig查看网络接口配置 docker exec -it CONTAINER_ID ifconfig

  5. 使用iptables查看容器的防火墙规则
  6. 捕获网络流量 :使用tcpdump或wireshark 等工具: docker exec -it CONTAINER_ID tcpdump -i any

  7. DNS查询记录: docker exec -it <container_id> cat /var/log/dmesg(对于某些容器)

  8. 进程分析:
    1. 查看容器内进程:
      1. Docker exec -it <container_id> ps aux
    2. 进程详细信息:
      1. docker exec -it <container_id> ps -ef

**

  • *

**

**

**