容器痕迹识别
先判断当前环境是不是容器、以及容器归属哪台宿主,是容器取证的第一步:容器内看到的时间、进程与网络视图都被命名空间隔离,直接沿用物理机思路会得出错误结论。常见依据有 /.dockerenv、/proc/1/cgroup 中的容器 ID,以及宿主上的容器运行时目录。
基本信息
| 识别文件 | /.dockerenv(Docker)、/run/.containerenv(Podman) |
|---|---|
| cgroup | /proc/1/cgroup:v1 路径含容器 ID,v2 常只显示 0::/ |
| 运行时目录 | /var/lib/docker/containers/<ID>/<ID>-json.log |
| 常用命令 | docker ps --no-trunc、docker inspect、crictl ps |
| 时区特征 | 多数镜像默认 UTC |
| 注意 | /etc/os-release 反映的是基础镜像,不是宿主系统 |
典型使用场景
- 应急响应时确认采集范围应覆盖宿主还是容器
- 还原容器内事件的真实时刻,做时区换算
- 用容器 ID 把内部日志与宿主上的其它证据串联
- 判断日志是否会随容器删除而一起丢失
- 分析容器逃逸类事件时先厘清边界
最小示例
最小示例
cat /.dockerenv 2>/dev/null && echo in-docker # 存在则高度可能为 Docker 容器
cat /proc/1/cgroup | head -5 # cgroup v1 可看到容器 ID 片段
cat /etc/hostname # 容器内常为短 ID
docker ps --no-trunc | head # 在宿主上列出完整容器 ID
ls /var/lib/docker/containers/ 2>/dev/null | head # 逐容器的日志与配置目录
docker inspect <容器> | grep -i -E 'Pid|StartedAt' # 容器主进程号与启动时间证据项与解读
| 证据 | 说明 | 注意 |
|---|---|---|
| /.dockerenv | 容器标记文件 | 镜像内可被伪造,只作线索 |
| /proc/1/cgroup | 控制组归属 | 新版内核可能不含容器 ID |
| hostname | 常为短容器 ID | 被人工设置后即失真 |
| StartedAt | 容器启动时刻 | 结合内部日志确定时间窗 |
| 时区偏移 | 容器内多为 UTC | 与宿主时间比较前先换算 |
容器删除后其日志目录随之消失;需要长期留证的场景要在容器生命周期内把日志导出到宿主或远端存储。
cgroup v2 环境下 /proc/1/cgroup 往往只显示 0::/,此时优先用 /.dockerenv、/run/.containerenv 与宿主侧 docker inspect 判断归属。
在业务容器内执行 kill、重启或挂载会改变运行时状态,还可能触发编排系统重建容器;取证期间避免直接在容器内做写操作。