Изображение


Содержание

1. Введение: Docker контейнеры в цифровой криминалистике
2. Что такое Docker и контейнеризация
3. Архитектура Docker и компоненты для анализа
4. Файловая структура Docker: где хранятся данные
5. Извлечение образов контейнеров для анализа
6. Анализ Docker образов и слоев
7. Анализ логов Docker контейнеров
8. Извлечение и анализ артефактов контейнеров
9. Анализ конфигурационных файлов Docker
10. Анализ сетевой активности контейнеров
11. Анализ процессов и ресурсов контейнеров
12. Инструменты для форензического анализа Docker
13. Восстановление удаленных данных из контейнеров
14. Продвинутые техники анализа контейнеров
15. Автоматизация форензического анализа Docker
16. Практические кейсы расследований
17. Лучшие практики и рекомендации
18. Часто задаваемые вопросы
19. Заключение


Введение: Docker контейнеры в цифровой криминалистике


Docker контейнеры стали фундаментальной технологией современной IT-инфраструктуры. По данным CNCF (Cloud Native Computing Foundation), более 90% организаций используют контейнеры в продакшене, а Docker остается доминирующей платформой контейнеризации с долей рынка свыше 80%. Однако эта популярность привлекла внимание злоумышленников, которые все чаще используют контейнеры для проведения атак, сокрытия следов преступной деятельности и создания изолированных сред для вредоносных операций.

Проблема: Рост инцидентов безопасности в контейнерных средах


Современные злоумышленники активно эксплуатируют контейнерные технологии для различных преступных целей:

Использование уязвимостей контейнеров:
- Эксплуатация открытых Docker API для распространения криптомайнеров
- Использование уязвимых образов для компрометации систем
- Атаки на контейнерные оркестраторы (Kubernetes, Docker Swarm)
- Злоупотребление привилегированными контейнерами

Сокрытие следов преступной деятельности:
- Использование временных контейнеров для одноразовых операций
- Хранение конфиденциальных данных в изолированных контейнерах
- Удаление следов через автоматическое удаление контейнеров
- Использование анонимных реестров образов

Масштабирование атак:
- Быстрое развертывание множества инфицированных контейнеров
- Создание ботнетов на базе контейнерных инфраструктур
- Использование облачных провайдеров для размещения вредоносных контейнеров
- Автоматизация атак через контейнерные оркестраторы

По статистике Aqua Security, в 2024 году более 60% организаций столкнулись с инцидентами безопасности, связанными с контейнерами. При этом большинство специалистов по цифровой криминалистике не обладают достаточными знаниями о специфике анализа контейнерных сред.

Решение: Комплексный подход к форензическому анализу Docker контейнеров


Эффективный анализ Docker контейнеров требует понимания нескольких аспектов:

Технический уровень:
- Знание архитектуры Docker и компонентов системы
- Понимание структуры образов и слоев
- Умение извлекать и анализировать логи
- Работа со специализированными инструментами

Методологический уровень:
- Процедуры извлечения образов и метаданных
- Методы сохранения целостности данных
- Техники анализа логов и артефактов
- Корреляция данных из различных источников

Практический уровень:
- Использование инструментов криминалистики
- Автоматизация рутинных операций
- Документирование процесса анализа
- Подготовка отчетов для суда

Преимущества анализа Docker контейнеров


Для цифровой криминалистики:
- Изоляция данных: Контейнеры содержат изолированные файловые системы и процессы
- Воспроизводимость: Образы контейнеров можно анализировать многократно
- Метаданные: Docker сохраняет подробные метаданные о контейнерах
- Логирование: Централизованное логирование всех операций

Для расследований:
- Восстановление timeline: Анализ логов и метаданных для реконструкции событий
- Выявление артефактов: Поиск следов преступной деятельности в образах
- Корреляция данных: Связывание информации из разных источников
- Доказательная база: Судебно-значимая информация для процессов

Для информационной безопасности:
- Анализ инцидентов: Исследование компрометированных контейнеров
- Обратная разработка: Изучение поведения malware в контейнерах
- Тестирование защиты: Проверка эффективности мер безопасности
- Обучение: Практика на реальных кейсах

Статистика и значимость


По данным исследований в области безопасности контейнеров:

- 65% организаций используют Docker в продакшене
- 40% инцидентов безопасности связаны с контейнерами
- 30% образов в публичных реестрах содержат уязвимости
- 25% контейнеров запускаются с избыточными привилегиями

Крупнейшие платформы контейнеризации:
- Docker: Доля рынка ~80%, формат образов OCI
- Podman: Альтернатива Docker, совместимая с OCI
- containerd: Низкоуровневая среда выполнения контейнеров
- CRI-O: Среда выполнения для Kubernetes

Цели использования в расследованиях


Анализ Docker контейнеров используется для решения следующих задач:

Расследования киберпреступлений:
- Анализ компрометированных контейнеров
- Выявление вредоносного ПО в образах
- Отслеживание сетевой активности контейнеров
- Восстановление удаленных данных

Форензический анализ:
- Реконструкция действий пользователей
- Сбор цифровых доказательств
- Анализ временных меток
- Корреляция с другими источниками

Мониторинг и аудит:
- Проверка соответствия политикам безопасности
- Выявление нарушений
- Анализ использования ресурсов
- Контроль доступа к данным

В этом руководстве мы рассмотрим все аспекты форензического анализа Docker контейнеров - от базовых концепций до продвинутых техник анализа логов и артефактов. Вы научитесь эффективно работать с образами контейнеров, извлекать доказательства и использовать специализированные инструменты для расследований.



Что такое Docker и контейнеризация


Docker - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнеризация представляет собой метод виртуализации на уровне операционной системы, который позволяет изолировать приложения и их зависимости от основной системы.

Основные концепции Docker


Контейнер:
Контейнер - это легковесный, переносимый пакет, содержащий приложение и все его зависимости. Контейнер работает изолированно от других контейнеров и хостовой системы, но использует ядро операционной системы хоста.

Образ (Image):
Образ - это шаблон только для чтения, используемый для создания контейнеров. Образ состоит из слоев файловой системы и метаданных, описывающих, как запускать контейнер.

Dockerfile:
Dockerfile - это текстовый файл с инструкциями для создания образа. Он содержит команды для установки зависимостей, настройки окружения и определения поведения контейнера.

Реестр (Registry):
Реестр - это хранилище образов Docker. Наиболее известный публичный реестр - Docker Hub, но существуют также частные реестры и альтернативы.

Архитектура Docker


Docker Engine:
Docker Engine состоит из нескольких компонентов:
- Docker daemon (dockerd): Фоновый процесс, управляющий контейнерами
- Docker CLI: Командная строка для взаимодействия с daemon
- Docker API: REST API для управления Docker

Компоненты системы:
- containerd: Низкоуровневая среда выполнения контейнеров
- runc: Инструмент для запуска контейнеров согласно спецификации OCI
- containerd-shim: Промежуточный процесс между containerd и контейнером

Преимущества контейнеризации


Изоляция:
Контейнеры обеспечивают изоляцию на уровне процессов, файловой системы и сети. Это позволяет запускать множество контейнеров на одном хосте без конфликтов.

Переносимость:
Образы контейнеров можно запускать на любой системе, поддерживающей Docker, независимо от операционной системы хоста (Linux, Windows, macOS).

Масштабируемость:
Контейнеры можно быстро создавать, удалять и масштабировать, что делает их идеальными для облачных сред и микросервисной архитектуры.

Эффективность:
В отличие от виртуальных машин, контейнеры не требуют отдельной операционной системы, что делает их более легковесными и быстрыми в запуске.

Использование в преступной деятельности


Изоляция вредоносной активности:
Злоумышленники используют контейнеры для изоляции вредоносного ПО:
- Запуск malware в изолированных контейнерах
- Тестирование эксплойтов без риска обнаружения
- Создание ботнетов на базе контейнерных инфраструктур

Сокрытие следов:
Контейнеры могут использоваться для сокрытия следов:
- Использование временных контейнеров для одноразовых операций
- Автоматическое удаление контейнеров после завершения
- Хранение данных в изолированных образах

Масштабирование операций:
Контейнеризация позволяет быстро развертывать множество инфицированных систем:
- Создание множества контейнеров из одного образа
- Использование оркестраторов для управления
- Автоматизация развертывания через CI/CD

Значение для цифровой криминалистики


Изоляция данных:
Контейнеры содержат изолированные файловые системы, что упрощает анализ:
- Доступ ко всем файлам контейнера
- Анализ процессов и сетевой активности
- Изоляция от других контейнеров и хоста

Воспроизводимость:
Образы контейнеров можно анализировать многократно:
- Разные эксперты могут работать с копиями
- Результаты анализа можно проверить независимо
- Процесс анализа документируется и повторяется

Метаданные:
Docker сохраняет подробные метаданные:
- Временные метки создания и запуска
- Конфигурация контейнера
- История изменений образов
- Логи всех операций

Понимание основ Docker и контейнеризации критически важно для эффективного форензического анализа. В следующем разделе мы рассмотрим архитектуру Docker и компоненты, важные для анализа.



Архитектура Docker и компоненты для анализа


Понимание архитектуры Docker необходимо для эффективного форензического анализа. Docker состоит из нескольких компонентов, каждый из которых может содержать важную информацию для расследований.

Компоненты Docker Engine


Docker Daemon (dockerd):
Docker daemon - это фоновый процесс, который управляет контейнерами, образами, сетями и томами. Daemon обрабатывает все команды Docker и управляет жизненным циклом контейнеров.

Расположение данных daemon:
- Linux: `/var/lib/docker/`
- Windows: `C:\ProgramData\docker\`
- macOS: `~/Library/Containers/com.docker.docker/Data/`

Docker CLI:
Docker CLI - это командная строка для взаимодействия с Docker daemon. CLI отправляет команды через Docker API и отображает результаты.

Docker API:
Docker предоставляет REST API для программного управления. API доступен через сокет или TCP порт (по умолчанию 2376 для TLS).

Хранилище данных Docker


Расположение данных (Linux):
text
/var/lib/docker/
├── containers/ # Метаданные контейнеров
├── image/ # Метаданные образов
├── overlay2/ # Файловые системы контейнеров (overlay2 driver)
├── volumes/ # Именованные тома
├── networks/ # Сетевые конфигурации
├── swarm/ # Docker Swarm данные
└── buildkit/ # BuildKit кэш


Формат хранения образов:
Docker использует несколько форматов для хранения образов:
- overlay2: Современный драйвер по умолчанию (Linux)
- aufs: Альтернативный драйвер (устаревший)
- devicemapper: Драйвер для старых систем
- btrfs/zfs: Драйверы для соответствующих файловых систем

Структура контейнера


Метаданные контейнера:
Каждый контейнер имеет директорию в `/var/lib/docker/containers//`:
text
<container-id>/
├── config.v2.json # Конфигурация контейнера
├── hostconfig.json # Конфигурация хоста
├── hostname # Имя хоста
├── hosts # Файл /etc/hosts
├── resolv.conf # DNS конфигурация
└── <container-id>-json.log # Логи контейнера


config.v2.json:
Содержит полную конфигурацию контейнера:
- Имя и ID контейнера
- Образ, из которого создан
- Команда запуска
- Переменные окружения
- Порты и сетевые настройки
- Тома и точки монтирования
- Временные метки

hostconfig.json:
Содержит конфигурацию хоста:
- Привилегии контейнера
- Ограничения ресурсов
- Настройки сети
- Биндинги портов

Слои образов


Overlay файловая система:
Docker использует overlay файловую систему для хранения слоев образов:
- Lower layers: Слои образа (read-only)
- Upper layer: Слой контейнера (read-write)
- Merged: Объединенное представление

Структура слоев:
text
/var/lib/docker/overlay2/
├── <layer-id>/
│ ├── diff/ # Изменения слоя
│ ├── link # Ссылка на слой
│ ├── lower # Ссылки на нижние слои
│ └── work/ # Рабочая директория


Сети Docker


Типы сетей:
- bridge: Сеть по умолчанию (изоляция контейнеров)
- host: Использование сети хоста
- none: Отсутствие сети
- overlay: Сеть для Docker Swarm
- macvlan: Прямой доступ к физической сети

Конфигурация сетей:
Сети хранятся в `/var/lib/docker/networks/`:
text
<network-id>/
├── ipam.json # IP адресация
└── config.json # Конфигурация сети


Тома Docker


Именованные тома:
Именованные тома хранятся в `/var/lib/docker/volumes/`:
text
<volume-name>/
└── _data/ # Данные тома


Bind mounts:
Bind mounts монтируют директории хоста напрямую в контейнер. Данные хранятся на хосте в указанной директории.

Логи Docker


Логи контейнеров:
Логи контейнеров хранятся в JSON формате:
- Расположение: `/var/lib/docker/containers//-json.log`
- Формат: JSON Lines (каждая строка - JSON объект)
- Содержит: stdout и stderr контейнера

Логи daemon:
Логи Docker daemon обычно находятся в:
- Linux: `/var/log/daemon.log` или `journalctl -u docker`
- Windows: Event Viewer
- macOS: Console.app

API Docker


Docker Socket:
Docker API доступен через Unix socket:
- Расположение: `/var/run/docker.sock`
- Права доступа: root или группа docker

Эндпоинты API:
Важные эндпоинты для анализа:
- `/containers/json` - Список контейнеров
- `/containers/{id}/json` - Информация о контейнере
- `/containers/{id}/logs` - Логи контейнера
- `/images/json` - Список образов
- `/images/{id}/json` - Информация об образе

Понимание архитектуры Docker критически важно для эффективного форензического анализа. В следующем разделе мы рассмотрим файловую структуру Docker и расположение данных.



Файловая структура Docker: где хранятся данные


Знание расположения данных Docker необходимо для эффективного извлечения информации при форензическом анализе. Docker хранит различные типы данных в структурированных директориях.

Основные директории Docker


Linux системы:

/var/lib/docker/
Главная директория для хранения всех данных Docker:
- Образы и слои
- Контейнеры и их метаданные
- Тома
- Сети
- Build кэш

/var/run/docker.sock
Unix socket для взаимодействия с Docker daemon. Доступ к этому сокету эквивалентен root привилегиям.

/etc/docker/
Конфигурационные файлы Docker:
- `daemon.json` - Конфигурация daemon
- `key.json` - Ключи для TLS
- Сертификаты

Windows системы:

C:\ProgramData\docker\
Эквивалент `/var/lib/docker/` в Windows:
- `containers/` - Метаданные контейнеров
- `image/` - Метаданные образов
- `volumes/` - Тома
- `windowsfilter/` - Файловые системы контейнеров

macOS системы:

~/Library/Containers/com.docker.docker/Data/
Данные Docker в macOS (через Docker Desktop).

Структура директории containers


Метаданные контейнеров:
text
/var/lib/docker/containers/<container-id>/
├── config.v2.json # Полная конфигурация
├── hostconfig.json # Конфигурация хоста
├── hostname # Имя хоста контейнера
├── hosts # /etc/hosts контейнера
├── resolv.conf # DNS конфигурация
├── resolv.conf.hash # Хеш DNS конфигурации
└── <container-id>-json.log # Логи контейнера


config.v2.json:
Содержит полную конфигурацию контейнера в JSON формате:
json
{
"ID": "abc123...",
"Created": "2024-01-15T10:30:00Z",
"Path": "/bin/sh",
"Args": ["-c", "echo hello"],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 12345,
"ExitCode": 0,
"Error": "",
"StartedAt": "2024-01-15T10:30:05Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:def456...",
"Name": "/my-container",
"Config": {
"Hostname": "abc123",
"Env": ["PATH=/usr/local/sbin:/usr/local/bin"],
"Cmd": ["/bin/sh", "-c", "echo hello"],
"Image": "alpine:latest",
"Labels": {}
},
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "xyz789",
"EndpointID": "end123",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
},
"Mounts": [
{
"Type": "volume",
"Name": "my-volume",
"Source": "/var/lib/docker/volumes/my-volume/_data",
"Destination": "/data",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
]
}


hostconfig.json:
Содержит конфигурацию хоста:
json
{
"Binds": ["/host/path:/container/path"],
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {
"max-size": "10m",
"max-file": "3"
}
},
"NetworkMode": "default",
"PortBindings": {
"80/tcp": [{"HostIp": "", "HostPort": "8080"}]
},
"RestartPolicy": {"Name": "always"},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"Privileged": false,
"PublishAllPorts": false
}


Структура директории image


Метаданные образов:
text
/var/lib/docker/image/
├── overlay2/
│ ├── distribution/ # Метаданные распределения
│ ├── imagedb/ # База данных образов
│ ├── layerdb/ # База данных слоев
│ └── repositories.json # Репозитории


imagedb/content/sha256/
Содержит метаданные образов по их SHA256 хешам:
json
{
"architecture": "amd64",
"config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": ["PATH=/usr/local/sbin:/usr/local/bin"],
"Cmd": ["/bin/sh"],
"Image": "sha256:...",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"container": "abc123...",
"container_config": {...},
"created": "2024-01-10T12:00:00Z",
"docker_version": "24.0.0",
"history": [
{
"created": "2024-01-10T12:00:00Z",
"created_by": "/bin/sh -c #(nop) ADD file:...",
"empty_layer": false
}
],
"os": "linux",
"rootfs": {
"type": "layers",
"diff_ids": [
"sha256:layer1...",
"sha256:layer2...",
"sha256:layer3..."
]
}
}


Структура overlay2


Файловые системы контейнеров:
text
/var/lib/docker/overlay2/
├── <layer-id>/
│ ├── diff/ # Изменения слоя
│ ├── link # Ссылка на слой
│ ├── lower # Ссылки на нижние слои
│ ├── merged/ # Объединенное представление
│ └── work/ # Рабочая директория


diff/
Содержит файлы и директории, добавленные или измененные в этом слое.

lower
Файл со списком нижних слоев (родительских слоев).

merged/
Объединенное представление всех слоев (используется контейнером).

Структура volumes


Именованные тома:
text
/var/lib/docker/volumes/
├── <volume-name>/
│ ├── _data/ # Данные тома
│ └── _metadata/ # Метаданные (если используется)


_data/
Содержит фактические данные тома, доступные контейнерам.

Структура networks


Сетевые конфигурации:
text
/var/lib/docker/networks/
├── <network-id>/
│ ├── config.json # Конфигурация сети
│ └── ipam.json # IP адресация


config.json:
json
{
"Name": "bridge",
"Id": "abc123...",
"Created": "2024-01-15T10:00:00Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"container-id": {
"Name": "my-container",
"EndpointID": "end123",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}


Логи контейнеров


Формат логов:
Логи хранятся в JSON Lines формате:
json
{"log":"Hello World\n","stream":"stdout","time":"2024-01-15T10:30:05.123456789Z"}
{"log":"Error occurred\n","stream":"stderr","time":"2024-01-15T10:30:06.123456789Z"}


Расположение:
- `/var/lib/docker/containers//-json.log`
- Может быть ротирован через log driver

Ротация логов:
Docker поддерживает ротацию логов через log driver:
- `max-size`: Максимальный размер файла (например, "10m")
- `max-file`: Количество файлов для хранения

Извлечение данных для анализа


Команды для извлечения:
bash
# Копирование всей директории Docker
sudo cp -r /var/lib/docker /evidence/docker-data

# Извлечение метаданных контейнеров
sudo find /var/lib/docker/containers -name "config.v2.json" -exec cp {} /evidence/containers/ \;

# Извлечение логов
sudo find /var/lib/docker/containers -name "*-json.log" -exec cp {} /evidence/logs/ \;

# Извлечение метаданных образов
sudo cp -r /var/lib/docker/image /evidence/image-metadata

# Сохранение хешей для проверки целостности
find /var/lib/docker -type f -exec md5sum {} \; > /evidence/docker-hashes.md5


Понимание файловой структуры Docker критически важно для эффективного извлечения данных при форензическом анализе. В следующем разделе мы рассмотрим методы извлечения образов контейнеров.



Извлечение образов контейнеров для анализа


Извлечение образов Docker контейнеров является первым шагом в форензическом анализе. Правильное извлечение обеспечивает целостность данных и их допустимость в качестве доказательств.

Методы извлечения образов


Экспорт через Docker API:
bash
# Экспорт образа в tar архив
docker save -o image.tar image-name:tag

# Экспорт нескольких образов
docker save -o images.tar image1:tag1 image2:tag2

# Экспорт с сжатием
docker save image-name:tag | gzip > image.tar.gz


Экспорт контейнера:
bash
# Экспорт файловой системы контейнера
docker export container-id > container.tar

# Экспорт с метаданными
docker export container-id | gzip > container.tar.gz


Извлечение из файловой системы:
bash
# Копирование директории overlay2
sudo cp -r /var/lib/docker/overlay2 /evidence/overlay2

# Копирование метаданных образов
sudo cp -r /var/lib/docker/image /evidence/image-metadata

# Сохранение хешей для проверки целостности
find /var/lib/docker -type f -exec sha256sum {} \; > /evidence/docker-hashes.sha256


Сохранение метаданных


Извлечение конфигураций:
bash
# Извлечение всех config.v2.json
find /var/lib/docker/containers -name "config.v2.json" -exec cp {} /evidence/containers/ \;

# Извлечение hostconfig.json
find /var/lib/docker/containers -name "hostconfig.json" -exec cp {} /evidence/containers/ \;

# Сохранение информации об образах
docker images --format "{{.Repository}}:{{.Tag}} {{.ID}} {{.CreatedAt}}" > /evidence/images-list.txt


Извлечение логов:
bash
# Копирование всех логов контейнеров
find /var/lib/docker/containers -name "*-json.log*" -exec cp {} /evidence/logs/ \;

# Экспорт логов через Docker API
docker logs container-id > /evidence/container-logs.txt 2>&1

# Экспорт логов с временными метками
docker logs --timestamps container-id > /evidence/container-logs-timestamped.txt


Проверка целостности


Вычисление хешей:
bash
# MD5 хеши
find /var/lib/docker -type f -exec md5sum {} \; > /evidence/docker-md5.txt

# SHA256 хеши
find /var/lib/docker -type f -exec sha256sum {} \; > /evidence/docker-sha256.txt

# Хеш образа через Docker
docker inspect --format='{{.Id}}' image-name:tag


Документирование:
Важно документировать:
- Дата и время извлечения
- Использованные команды
- Хеши оригиналов и копий
- Временные метки файлов
- Обнаруженные образы и контейнеры



Анализ Docker образов и слоев


Docker образы состоят из слоев, каждый из которых представляет изменения в файловой системе. Анализ слоев позволяет понять историю создания образа и выявить потенциальные проблемы безопасности.

Структура образа


Слои образа:
Образ состоит из последовательности слоев:
- Базовый слой (обычно минимальная ОС)
- Слои с установленными пакетами
- Слои с конфигурационными файлами
- Слои с приложением

Анализ слоев:
bash
# Просмотр истории образа
docker history image-name:tag

# Детальная информация об образе
docker inspect image-name:tag

# Просмотр слоев образа
docker image inspect image-name:tag --format='{{.RootFS.Layers}}'


Анализ Dockerfile


Извлечение Dockerfile:
bash
# Dockerfile может быть извлечен из истории образа
docker history --no-trunc image-name:tag

# Использование dive для анализа слоев
dive image-name:tag


Анализ инструкций:
Dockerfile содержит инструкции для создания образа:
- `FROM` - базовый образ
- `RUN` - команды выполнения
- `COPY`/`ADD` - копирование файлов
- `ENV` - переменные окружения
- `EXPOSE` - открытые порты
- `CMD`/`ENTRYPOINT` - команда запуска

Извлечение файлов из слоев


Монтирование слоев:
bash
# Монтирование образа через containerd
ctr image mount image-name:tag /mnt/image

# Просмотр содержимого слоя
ls -la /var/lib/docker/overlay2/<layer-id>/diff/

# Извлечение конкретного файла
cp /var/lib/docker/overlay2/<layer-id>/diff/path/to/file /evidence/


Анализ изменений:
bash
# Сравнение слоев
diff -r /var/lib/docker/overlay2/<layer1-id>/diff /var/lib/docker/overlay2/<layer2-id>/diff

# Поиск измененных файлов
find /var/lib/docker/overlay2 -name "*.sh" -o -name "*.py" -o -name "*.exe"


Выявление проблем безопасности


Анализ уязвимостей:
bash
# Использование Trivy для сканирования
trivy image image-name:tag

# Использование Clair
clair-scanner --ip host-ip image-name:tag

# Использование Docker Bench Security
docker run --rm --net host --pid host --userns host --cap-add audit_control \
-e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
-v /var/lib:/var/lib:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--label docker_bench_security \
docker/docker-bench-security


Поиск секретов:
bash
# Поиск паролей и ключей в слоях
grep -r "password\|secret\|key\|token" /var/lib/docker/overlay2/<layer-id>/diff/

# Использование truffleHog
trufflehog filesystem /var/lib/docker/overlay2/<layer-id>/diff/




Анализ логов Docker контейнеров


Логи Docker контейнеров содержат ценную информацию о деятельности контейнера, включая выполняемые команды, ошибки и сетевую активность.

Формат логов


JSON Lines формат:
Логи хранятся в JSON Lines формате:
json
{"log":"2024-01-15 10:30:05 Starting application\n","stream":"stdout","time":"2024-01-15T10:30:05.123456789Z"}
{"log":"2024-01-15 10:30:06 Connected to database\n","stream":"stdout","time":"2024-01-15T10:30:06.123456789Z"}
{"log":"Error: connection failed\n","stream":"stderr","time":"2024-01-15T10:30:07.123456789Z"}


Поля логов:
- `log`: Содержимое лога
- `stream`: Поток (stdout/stderr)
- `time`: Временная метка в формате RFC3339Nano

Извлечение логов


Через Docker API:
bash
# Экспорт логов контейнера
docker logs container-id > /evidence/container-logs.txt

# Логи с временными метками
docker logs --timestamps container-id > /evidence/container-logs-timestamps.txt

# Логи за определенный период
docker logs --since "2024-01-15T10:00:00" --until "2024-01-15T11:00:00" container-id

# Последние N строк
docker logs --tail 1000 container-id


Из файловой системы:
bash
# Копирование логов
cp /var/lib/docker/containers/<container-id>/<container-id>-json.log /evidence/

# Если логи ротированы
cp /var/lib/docker/containers/<container-id>/<container-id>-json.log.* /evidence/


Анализ логов


Парсинг JSON логов:
bash
# Извлечение только stdout
cat container-json.log | jq -r 'select(.stream=="stdout") | .log'

# Извлечение только stderr
cat container-json.log | jq -r 'select(.stream=="stderr") | .log'

# Фильтрация по времени
cat container-json.log | jq -r 'select(.time > "2024-01-15T10:00:00Z") | .log'

# Поиск по содержимому
cat container-json.log | jq -r 'select(.log | contains("error")) | .log'


Создание timeline:
bash
# Сортировка по времени
cat container-json.log | jq -r '.time + " " + .log' | sort > timeline.txt

# Группировка по времени
cat container-json.log | jq -r '.time[0:13]' | sort | uniq -c


Поиск подозрительной активности


Поиск команд:
bash
# Поиск выполнения команд
grep -i "sh\|bash\|cmd\|exec" container-logs.txt

# Поиск сетевой активности
grep -i "connect\|socket\|http\|tcp" container-logs.txt

# Поиск файловых операций
grep -i "open\|read\|write\|delete" container-logs.txt


Анализ ошибок:
bash
# Извлечение ошибок
cat container-json.log | jq -r 'select(.stream=="stderr") | .log' > errors.txt

# Подсчет ошибок
cat container-json.log | jq -r 'select(.stream=="stderr")' | wc -l

# Группировка ошибок
cat container-json.log | jq -r 'select(.stream=="stderr") | .log' | sort | uniq -c | sort -rn




Извлечение и анализ артефактов контейнеров


Артефакты контейнеров включают файлы, процессы, сетевые соединения и другие данные, которые могут содержать важную информацию для расследований.

Извлечение файлов


Копирование файлов из контейнера:
bash
# Копирование файла из контейнера
docker cp container-id:/path/to/file /evidence/file

# Копирование директории
docker cp container-id:/path/to/dir /evidence/dir

# Экспорт всей файловой системы
docker export container-id | tar -xf - -C /evidence/container-fs/


Из overlay2:
bash
# Монтирование файловой системы контейнера
mount -t overlay overlay -o lowerdir=/var/lib/docker/overlay2/lower,upperdir=/var/lib/docker/overlay2/upper,workdir=/var/lib/docker/overlay2/work /mnt/container

# Копирование файлов
cp -r /mnt/container/* /evidence/container-fs/


Анализ процессов


Информация о процессах:
bash
# Список процессов контейнера
docker top container-id

# Детальная информация
docker inspect --format='{{.State.Pid}}' container-id
ps -p $(docker inspect --format='{{.State.Pid}}' container-id) -f

# Процессы через cgroup
cat /sys/fs/cgroup/memory/docker/<container-id>/cgroup.procs


Анализ процессов хоста:
bash
# Поиск процессов Docker
ps aux | grep docker

# Процессы containerd
ps aux | grep containerd

# Процессы контейнеров
ps aux | grep -E "docker|containerd"


Анализ сетевой активности


Сетевые соединения:
bash
# Сетевые соединения контейнера
docker exec container-id netstat -tulpn

# Через nsenter
nsenter -t $(docker inspect --format='{{.State.Pid}}' container-id) -n netstat -tulpn

# Анализ сетевых интерфейсов
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container-id


Анализ сетевых логов:
bash
# Логи Docker сети
journalctl -u docker | grep network

# Анализ iptables правил
iptables -t nat -L -n -v
iptables -t filter -L -n -v


Анализ переменных окружения


Извлечение переменных:
bash
# Переменные окружения контейнера
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' container-id

# Через config.v2.json
cat /var/lib/docker/containers/<container-id>/config.v2.json | jq '.Config.Env'

# Поиск секретов в переменных
docker inspect container-id | jq '.Config.Env' | grep -i "password\|secret\|key\|token"




Анализ конфигурационных файлов Docker


Конфигурационные файлы Docker содержат критически важную информацию о настройках контейнеров, сетей и безопасности.

Анализ config.v2.json


Извлечение конфигурации:
bash
# Просмотр полной конфигурации
cat /var/lib/docker/containers/<container-id>/config.v2.json | jq .

# Извлечение команды запуска
cat config.v2.json | jq '.Config.Cmd'

# Извлечение переменных окружения
cat config.v2.json | jq '.Config.Env'

# Извлечение точек монтирования
cat config.v2.json | jq '.Mounts'


Анализ привилегий:
bash
# Проверка привилегированного режима
cat config.v2.json | jq '.HostConfig.Privileged'

# Проверка capabilities
cat config.v2.json | jq '.HostConfig.CapAdd'
cat config.v2.json | jq '.HostConfig.CapDrop'

# Проверка user namespace
cat config.v2.json | jq '.HostConfig.UsernsMode'


Анализ hostconfig.json


Настройки безопасности:
bash
# Проверка ограничений ресурсов
cat hostconfig.json | jq '.Memory'
cat hostconfig.json | jq '.CpuShares'
cat hostconfig.json | jq '.CpuQuota'

# Проверка сетевого режима
cat hostconfig.json | jq '.NetworkMode'

# Проверка портов
cat hostconfig.json | jq '.PortBindings'


Анализ daemon.json


Конфигурация Docker daemon:
bash
# Просмотр конфигурации
cat /etc/docker/daemon.json

# Проверка настроек безопасности
cat /etc/docker/daemon.json | jq '.tls'
cat /etc/docker/daemon.json | jq '.log-driver'
cat /etc/docker/daemon.json | jq '.storage-driver'


Анализ docker-compose.yml


Конфигурация Compose:
bash
# Просмотр конфигурации
cat docker-compose.yml

# Извлечение секретов
grep -i "password\|secret\|key\|token" docker-compose.yml

# Анализ сетевых настроек
cat docker-compose.yml | grep -A 10 "networks:"




Анализ сетевой активности контейнеров


Анализ сетевой активности контейнеров помогает понять, как контейнеры взаимодействовали с сетью и какие соединения устанавливались.

Сетевые настройки контейнера


Извлечение сетевой информации:
bash
# Сетевая информация контейнера
docker inspect --format='{{json .NetworkSettings}}' container-id | jq .

# IP адрес контейнера
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container-id

# MAC адрес
docker inspect --format='{{range .NetworkSettings.Networks}}{{.MacAddress}}{{end}}' container-id

# Проброшенные порты
docker inspect --format='{{json .NetworkSettings.Ports}}' container-id | jq .


Анализ сетевых логов


Логи Docker сети:
bash
# Логи сетевых событий
journalctl -u docker | grep network

# Анализ сетевых драйверов
docker network inspect network-name

# Анализ iptables правил
iptables -t nat -L DOCKER -n -v
iptables -t filter -L DOCKER -n -v


Захват сетевого трафика


tcpdump в контейнере:
bash
# Захват трафика контейнера
docker exec container-id tcpdump -i any -w /tmp/capture.pcap

# Копирование capture файла
docker cp container-id:/tmp/capture.pcap /evidence/


Захват на хосте:
bash
# Захват трафика интерфейса Docker
tcpdump -i docker0 -w /evidence/docker-capture.pcap

# Захват трафика veth интерфейсов
tcpdump -i veth* -w /evidence/veth-capture.pcap




Анализ процессов и ресурсов контейнеров


Анализ процессов и использования ресурсов контейнеров помогает понять активность контейнера и выявить аномалии.

Анализ процессов


Информация о процессах:
bash
# Процессы контейнера
docker top container-id

# Детальная информация
docker stats container-id --no-stream

# Процессы через PID хоста
ps -p $(docker inspect --format='{{.State.Pid}}' container-id) -f


Анализ использования ресурсов


Статистика ресурсов:
bash
# Использование CPU и памяти
docker stats container-id

# История использования
docker stats --no-stream container-id

# Анализ через cgroup
cat /sys/fs/cgroup/memory/docker/<container-id>/memory.usage_in_bytes
cat /sys/fs/cgroup/cpu/docker/<container-id>/cpuacct.usage




Инструменты для форензического анализа Docker


Существует множество инструментов для форензического анализа Docker контейнеров, каждый из которых решает специфические задачи.

Docker CLI


Базовые команды:
bash
# Информация о контейнере
docker inspect container-id

# Логи контейнера
docker logs container-id

# Процессы контейнера
docker top container-id

# Статистика ресурсов
docker stats container-id


dive


Анализ слоев образа:
bash
# Установка
go get github.com/wagoodman/dive

# Анализ образа
dive image-name:tag

# Экспорт результатов
dive image-name:tag --json > analysis.json


Trivy


Сканирование уязвимостей:
bash
# Установка
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh

# Сканирование образа
trivy image image-name:tag

# Сканирование с экспортом
trivy image --format json -o report.json image-name:tag


Docker Bench Security


Проверка безопасности:
bash
# Запуск проверки
docker run --rm --net host --pid host --userns host --cap-add audit_control \
-v /var/lib:/var/lib:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
docker/docker-bench-security


Docker Explorer


Форензический анализ:
bash
# Установка
pip install docker-explorer

# Анализ образа
docker-explorer image image-name:tag

# Анализ контейнера
docker-explorer container container-id




Восстановление удаленных данных из контейнеров


Восстановление удаленных данных из контейнеров может быть сложным из-за особенностей overlay файловой системы, но возможно при правильном подходе.

Особенности overlay файловой системы


Слоистая структура:
Overlay файловая система использует слои:
- Удаление файла создает "whiteout" файл в upper слое
- Данные могут оставаться в lower слоях
- Восстановление возможно до перезаписи

Методы восстановления


Анализ слоев:
bash
# Просмотр всех слоев
ls -la /var/lib/docker/overlay2/

# Поиск whiteout файлов
find /var/lib/docker/overlay2 -name ".wh.*"

# Восстановление из lower слоев
find /var/lib/docker/overlay2 -type f -name "deleted-file"


Использование инструментов:
bash
# testdisk для восстановления
testdisk /var/lib/docker/overlay2/<layer-id>/diff

# photorec для восстановления файлов
photorec /var/lib/docker/overlay2/<layer-id>/diff




Продвинутые техники анализа контейнеров


Продвинутые техники анализа включают глубокий анализ метаданных, корреляцию данных и использование специализированных инструментов.

Анализ метаданных


Временные метки:
bash
# Временные метки создания
docker inspect --format='{{.Created}}' image-name:tag

# Временные метки контейнера
docker inspect --format='{{.State.StartedAt}}' container-id
docker inspect --format='{{.State.FinishedAt}}' container-id


Корреляция данных


Связывание различных источников:
- Конфигурационные файлы контейнеров
- Логи Docker daemon
- Сетевые логи
- Логи хостовой системы



Автоматизация форензического анализа Docker


Автоматизация анализа позволяет ускорить процесс расследования и обеспечить консистентность результатов.

Скрипты для извлечения данных


Bash скрипт:
bash
#!/bin/bash
# Извлечение данных Docker для анализа

OUTPUT_DIR="/evidence/docker-analysis-$(date +%Y%m%d-%H%M%S)"
mkdir -p $OUTPUT_DIR

# Метаданные контейнеров
find /var/lib/docker/containers -name "config.v2.json" -exec cp {} $OUTPUT_DIR/containers/ \;

# Логи
find /var/lib/docker/containers -name "*-json.log*" -exec cp {} $OUTPUT_DIR/logs/ \;

# Метаданные образов
cp -r /var/lib/docker/image $OUTPUT_DIR/image-metadata

# Хеши для проверки целостности
find /var/lib/docker -type f -exec sha256sum {} \; > $OUTPUT_DIR/hashes.sha256




Практические кейсы расследований


Кейс 1: Анализ компрометированного контейнера


Сценарий:
Обнаружен подозрительный контейнер на сервере. Требуется провести анализ для выявления вредоносной активности.

Процесс:
1. Извлечение метаданных контейнера
2. Анализ логов
3. Извлечение файловой системы
4. Поиск вредоносного ПО
5. Анализ сетевой активности

Результаты:
Обнаружено вредоносное ПО, сетевые соединения с подозрительными серверами, следы несанкционированного доступа.



Лучшие практики и рекомендации


Процедуры работы


Целостность данных:
- Всегда работайте с копиями оригиналов
- Вычисляйте хеши перед и после операций
- Документируйте все действия
- Сохраняйте метаданные

Документирование:
- Записывайте все команды и результаты
- Сохраняйте скриншоты важных этапов
- Ведите журнал всех действий
- Создавайте подробные отчеты



Часто задаваемые вопросы


Как извлечь образ контейнера для анализа?


Используйте команду `docker save` для экспорта образа в tar архив: `docker save -o image.tar image-name:tag`. Для полного анализа скопируйте директории `/var/lib/docker/image` и `/var/lib/docker/overlay2`. Также можно экспортировать файловую систему контейнера через `docker export container-id > container.tar`.

Где хранятся логи Docker контейнеров?


Логи хранятся в `/var/lib/docker/containers//-json.log` в формате JSON Lines. Логи могут быть ротированы, в этом случае будут дополнительные файлы с суффиксами `.1`, `.2` и т.д. Также можно получить логи через Docker API: `docker logs container-id`.

Можно ли восстановить удаленные файлы из контейнера?


Да, возможно восстановление из слоев overlay файловой системы, если данные еще не были перезаписаны. Overlay использует whiteout файлы для удаления, но данные могут оставаться в lower слоях. Используйте инструменты типа testdisk или photorec для восстановления. Также можно анализировать слои напрямую через `/var/lib/docker/overlay2/`.

Как проанализировать сетевую активность контейнера?


Анализируйте сетевые настройки через `docker inspect --format='{{json .NetworkSettings}}' container-id`. Проверяйте логи Docker daemon через `journalctl -u docker | grep network`. Используйте tcpdump для захвата трафика интерфейсов Docker (docker0, veth*). Анализируйте iptables правила: `iptables -t nat -L DOCKER -n -v`.

Какие инструменты лучше использовать для анализа?


Для базового анализа используйте Docker CLI (`docker inspect`, `docker logs`, `docker top`). Для анализа слоев образов - dive. Для сканирования уязвимостей - Trivy или Clair. Для форензического анализа - Docker Explorer или специализированные скрипты. Для анализа логов - jq для парсинга JSON формата.

Как обеспечить целостность данных при анализе?


Всегда работайте с копиями оригиналов, никогда не модифицируйте оригинальные данные. Вычисляйте хеши (MD5, SHA256) перед и после операций: `find /var/lib/docker -type f -exec sha256sum {} \;`. Используйте режим только чтения при монтировании файловых систем. Документируйте все действия, команды и результаты.

Как найти все контейнеры на системе?


Используйте `docker ps -a` для списка всех контейнеров (включая остановленные). Для поиска в файловой системе: `find /var/lib/docker/containers -name "config.v2.json"`. Также можно использовать Docker API: `curl --unix-socket /var/run/docker.sock http://localhost/containers/json`.

Можно ли анализировать остановленные контейнеры?


Да, остановленные контейнеры сохраняют свою файловую систему и метаданные. Метаданные находятся в `/var/lib/docker/containers//`. Файловая система может быть извлечена через `docker export container-id` или напрямую из overlay2 директории.

Как проанализировать Dockerfile образа?


Dockerfile может быть восстановлен из истории образа: `docker history --no-trunc image-name:tag`. Используйте инструмент dive для визуального анализа слоев и команд Dockerfile. Также можно анализировать метаданные образа в `/var/lib/docker/image/overlay2/imagedb/content/sha256/`.

Где хранятся тома Docker?


Именованные тома хранятся в `/var/lib/docker/volumes//_data/`. Bind mounts монтируют директории хоста напрямую, их расположение указано в конфигурации контейнера. Информацию о томах можно получить через `docker inspect container-id | jq '.Mounts'`.

Как найти секреты в контейнерах?


Ищите секреты в переменных окружения: `docker inspect container-id | jq '.Config.Env' | grep -i "password\|secret\|key\|token"`. Анализируйте файлы в слоях образа: `grep -r "password\|secret\|key" /var/lib/docker/overlay2//diff/`. Используйте инструменты типа truffleHog для автоматического поиска.

Можно ли анализировать контейнеры без Docker daemon?


Да, можно анализировать данные напрямую из файловой системы Docker. Метаданные контейнеров находятся в `/var/lib/docker/containers/`, образы в `/var/lib/docker/image/` и `/var/lib/docker/overlay2/`. Можно использовать инструменты типа Docker Explorer или написать собственные скрипты для парсинга JSON файлов.

Как определить, был ли контейнер скомпрометирован?


Проверяйте логи на подозрительную активность: выполнение неожиданных команд, сетевые соединения, ошибки. Анализируйте процессы контейнера через `docker top container-id`. Проверяйте изменения файлов в верхнем слое overlay. Сканируйте образ на уязвимости через Trivy или Clair. Анализируйте сетевую активность и установленные соединения.

Как экспортировать данные для судебного анализа?


Создайте полную копию директории Docker: `sudo cp -r /var/lib/docker /evidence/docker-data`. Вычислите хеши всех файлов для проверки целостности. Экспортируйте метаданные контейнеров и образов. Сохраните логи контейнеров и Docker daemon. Документируйте процесс извлечения с временными метками и используемыми командами.



Заключение


Форензический анализ Docker контейнеров является критически важным навыком для специалистов по цифровой криминалистике. В этом руководстве мы рассмотрели все основные аспекты анализа контейнеров - от извлечения данных до продвинутых техник анализа.

Ключевые моменты:
- Понимание архитектуры Docker необходимо для эффективного анализа
- Правильное извлечение образов и метаданных обеспечивает целостность данных
- Анализ логов и артефактов предоставляет важную информацию
- Использование специализированных инструментов ускоряет процесс анализа

---

**⚠️ Дисклеймер:** Статья носит информационно-образовательный характер и не содержит инструкций для совершения противоправных действий.