运维部署
调查受感染 Docker 容器或主机时,通过保全容器状态…
适用于容器化事件响应中,对 Docker 容器、镜像、主机制品、运行时变更、漏洞与密钥进行取证分析。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
调查受感染 Docker 容器或主机时,特定
解决思路
- 使用 `docker ps -a --no-trunc > /cases/case-2024-001/docker/container_list.txt` 列出所有容器(包括已停止容器)。
- 设置 `CONTAINER_ID="abc123def456"`,运行 `docker inspect $CONTAINER_ID > /cases/case-2024-001/docker/container_inspect.json` 检查受损容器。
- 运行 `docker export $CONTAINER_ID > /cases/case-2024-001/docker/container_export.tar` 导出容器文件系统 tarball,以保存当前状态。
- 运行 `docker commit $CONTAINER_ID forensic-evidence:case-2024-001` 从容器当前状态创建镜像。
- 运行 `docker save forensic-evidence:case-2024-001 > /cases/case-2024-001/docker/container_image.tar` 保存该镜像。
- 运行 `docker logs $CONTAINER_ID --timestamps > /cases/case-2024-001/docker/container_logs.txt 2>&1` 捕获容器日志。
- 运行 `docker top $CONTAINER_ID > /cases/case-2024-001/docker/container_processes.txt` 捕获运行进程(若容器仍在运行)。
- 运行 `docker exec $CONTAINER_ID netstat -tlnp 2>/dev/null > /cases/case-2024-001/docker/container_network.txt` 捕获网络连接。
- 运行 `docker cp $CONTAINER_ID:/var/log/ /cases/case-2024-001/docker/container_var_log/` 复制 /var/log/。
- 运行 `docker cp $CONTAINER_ID:/tmp/ /cases/case-2024-001/docker/container_tmp/` 复制 /tmp/。
- 运行 `docker cp $CONTAINER_ID:/etc/passwd /cases/case-2024-001/docker/container_passwd` 复制 /etc/passwd。
- 运行 `sha256sum /cases/case-2024-001/docker/*.tar > /cases/case-2024-001/docker/evidence_hashes.txt` 对导出的证据哈希。
- 下载 dive:`wget https://github.com/wagoodman/dive/releases/latest/download/dive_linux_amd64.deb`。
- 安装 dive:`sudo dpkg -i dive_linux_amd64.deb`。
- 运行 `dive forensic-evidence:case-2024-001` 交互分析镜像层。
- 运行 `dive forensic-evidence:case-2024-001 --ci --json /cases/case-2024-001/docker/dive_analysis.json` 进行非交互层分析。
- 运行 `mkdir -p /cases/case-2024-001/docker/layers/` 创建层目录。
- 运行 `tar -xf /cases/case-2024-001/docker/container_image.tar -C /cases/case-2024-001/docker/layers/` 提取并检查各层。
- 运行 `cat /cases/case-2024-001/docker/layers/manifest.json | python3 -m json.tool` 列出镜像 manifest 和层顺序。
- 运行 `for layer in /cases/case-2024-001/docker/layers/*/layer.tar; do echo "=== Layer: $(dirname $layer | xargs basename) ==="; tar -tf "$layer" | head -20; echo "..."; done` 检查每层变化。
- 下载 container-diff:`curl -LO https://storage.googleapis.com/container-diff/latest/container-diff-linux-amd64`。
- 赋予 container-diff 执行权限:`chmod +x container-diff-linux-amd64`。
- 运行 `./container-diff-linux-amd64 diff daemon://nginx:latest daemon://forensic-evidence:case-2024-001 --type=file --type=apt --type=history --json > /cases/case-2024-001/docker/container_diff.json` 与原始基础镜像比较。
- 设置 `DOCKER_ROOT="/mnt/evidence/var/lib/docker"`。
- 运行 `ls -la $DOCKER_ROOT/overlay2/` 检查 overlay2 文件系统层。
- 运行 `docker inspect $CONTAINER_ID --format '{{.GraphDriver.Data.MergedDir}}'` 查找容器的合并文件系统;离线时从 `/var/lib/docker/containers/<container_id>/config.v2.json` 手动查找。
- 运行 `cat $DOCKER_ROOT/containers/$CONTAINER_ID/config.v2.json | python3 -m json.tool > /cases/case-2024-001/docker/container_config.json` 分析容器配置文件。
- 运行 `cat /mnt/evidence/etc/docker/daemon.json 2>/dev/null > /cases/case-2024-001/docker/daemon_config.json` 检查 Docker daemon 配置。
- 运行 `cat $DOCKER_ROOT/containers/$CONTAINER_ID/*.log > /cases/case-2024-001/docker/container_json_logs.txt` 检查 Docker events/容器日志。
- 解析 `/cases/case-2024-001/docker/container_inspect.json` 并检查 `Mounts`,对 `/`、`/etc`、`/var`、`/root` 以读写方式挂载到容器的情况告警。
- 检查 `HostConfig.Privileged` 是否为真,为真时告警容器曾以 privileged 模式运行。
- 检查 `HostConfig.CapAdd`,对 `SYS_ADMIN`、`SYS_PTRACE`、`NET_ADMIN`、`SYS_MODULE` 等危险能力告警。
- 检查 `HostConfig.PidMode` 是否为 `host`,是则告警共享主机 PID namespace。
- 检查 `HostConfig.NetworkMode` 是否为 `host`,是则告警共享主机网络 namespace。
- 检查 `Config.User`,记录容器运行用户(默认 root)。
- 检查 `Config.Env` 中键名包含 `PASSWORD`、`SECRET`、`KEY`、`TOKEN`、`CREDENTIAL` 的环境变量,并以 `***REDACTED***` 标记敏感值。
- 运行 `docker diff $CONTAINER_ID > /cases/case-2024-001/docker/filesystem_changes.txt` 比较容器文件系统与原始镜像。
- 解析 `filesystem_changes.txt`,统计 `A`(Added)、`C`(Changed)、`D`(Deleted)文件数量。
- 标记可疑新增文件:路径或名称包含 `/tmp/`、`/dev/shm/`、`/root/`、`.sh`、`.py`、`.elf`、`reverse`、`shell`、`backdoor` 的新增项。
- 标记可疑变更文件:涉及 `/etc/passwd`、`/etc/shadow`、`/etc/crontab`、`/etc/ssh`、`.bashrc` 的变更项。
- 运行 `mkdir -p /cases/case-2024-001/docker/container_fs/` 创建目录。
- 运行 `tar -xf /cases/case-2024-001/docker/container_export.tar -C /cases/case-2024-001/docker/container_fs/` 解压并检查容器导出。
- 运行 `find /cases/case-2024-001/docker/container_fs/tmp/ -type f -exec file {} \;` 扫描 tmp 下文件类型。
- 运行 `find /cases/case-2024-001/docker/container_fs/ -name "*.php" -newer /cases/case-2024-001/docker/container_fs/etc/hostname` 查找 webshell 和较新恶意文件。
- 运行 `trivy image forensic-evidence:case-2024-001 --format json --output /cases/case-2024-001/docker/vulnerability_scan.json` 扫描镜像已知漏洞。
- 运行 `trivy fs /cases/case-2024-001/docker/container_fs/ --format table --output /cases/case-2024-001/docker/fs_vulnerabilities.txt` 扫描导出文件系统漏洞。
- 运行 `trivy image forensic-evidence:case-2024-001 --scanners secret --format json --output /cases/case-2024-001/docker/secrets_scan.json` 检查镜像中的 secrets。
适用边界 · 注意事项
- 非 Docker/容器化环境,或无法获取 Docker CLI、Docker 主机文件系统、容器导出/离线镜像时,不适用。
- 需要实时遏制、清除恶意进程或恢复业务时,应先隔离/阻断,不能只做取证分析。
- 容器仍在运行且无法接受证据污染风险时,不应直接执行 `docker exec`、`docker cp` 等操作,需先按易失性顺序保全或改用内存/运行时取证。