Безопасность контейнеров — одна из ключевых задач при работе с Docker в промышленной эксплуатации. Неправильно сконфигурированный образ может стать точкой входа для атакующего. Инструмент Dockle помогает выявить проблемы безопасности в Docker-образах, проверяя их на соответствие CIS Docker Benchmark и лучшим практикам Dockerfile.
В этом руководстве мы подробно разберём установку Dockle, сканирование образов, анализ результатов, исправление типичных проблем и интеграцию проверок в конвейеры CI/CD.
Что такое Dockle и зачем он нужен
Dockle — инструмент с открытым исходным кодом для статического анализа и аудита безопасности Docker-образов. Написан на Go, Apache 2.0, более 3 000 звёзд на GitHub. Версия — 0.4.15.
В отличие от Hadolint, Dockle работает с готовыми собранными образами: проверяет файловые разрешения, setuid/setgid-биты, учётные данные в переменных окружения.
Основные возможности:
- Проверка на соответствие CIS Docker Benchmark
- Анализ конфигурации образа на соответствие лучшим практикам Docker
- Обнаружение файлов с setuid/setgid
- Поиск учётных данных в переменных окружения и файлах
- Вывод в JSON и SARIF
- Работа без установки Docker

CIS Docker Benchmark — основа проверок
CIS Benchmarks — набор рекомендаций по безопасной конфигурации систем. CIS Docker Benchmark содержит конкретные рекомендации по безопасной сборке Docker-контейнеров.
Dockle реализует проверки Image Configuration: непривилегированный пользователь, Docker Content Trust, HEALTHCHECK, COPY вместо ADD, запрет хранения секретов в ENV.
Установка Dockle
Dockle можно установить несколькими способами.
Установка на Debian/Ubuntu
VERSION=$(curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/') && \
curl -L -o dockle.deb \
https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.deb
sudo dpkg -i dockle.deb && rm dockle.debУстановка на RHEL/CentOS/Fedora
VERSION=$(curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/') && \
rpm -ivh https://github.com/goodwithtech/dockle/releases/download/v${VERSION}/dockle_${VERSION}_Linux-64bit.rpmУстановка через Homebrew
brew install goodwithtech/r/dockleЗапуск через Docker
VERSION=$(curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/') && \
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
goodwithtech/dockle:v${VERSION} YOUR_IMAGE_NAMEBash-скрипт
#!/bin/bash
VERSION=$(curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | \
grep '"tag_name":' | \
sed -E 's/.*"v([^"]+)".*/\1/') && \
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
goodwithtech/dockle:v${VERSION} "$1"
chmod +x dockle_scan.sh
./dockle_scan.sh nginx:1.27Первое сканирование: анализ образа NGINX
docker pull nginx:latest
dockle nginx:latest
Типичный вывод:
WARN - CIS-DI-0001: Create a user for the container
* Last user should not be root
WARN - DKL-DI-0006: Avoid latest tag
INFO - CIS-DI-0005: Enable Content trust for Docker
INFO - CIS-DI-0006: Add HEALTHCHECK instruction
INFO - CIS-DI-0008: Confirm safety of setuid/setgid filesCIS-DI-0001 — контейнер запускается от root. DKL-DI-0006 — тег latest не обеспечивает воспроизводимость. CIS-DI-0006 — отсутствует HEALTHCHECK. CIS-DI-0008 — setuid/setgid-файлы выполняются с правами владельца.
Контрольные точки Dockle
CIS Docker Benchmark
| Код | Описание | Уровень |
|---|---|---|
| CIS-DI-0001 | Непривилегированный пользователь | WARN |
| CIS-DI-0005 | Docker Content Trust | INFO |
| CIS-DI-0006 | HEALTHCHECK | INFO |
| CIS-DI-0007 | update без установки | INFO |
| CIS-DI-0008 | setuid/setgid файлы | INFO |
| CIS-DI-0009 | COPY вместо ADD | FATAL |
| CIS-DI-0010 | Секреты в ENV | FATAL |
| CIS-DI-0011 | Проверенные пакеты | INFO |
Docker Best Practices
| Код | Описание | Уровень |
|---|---|---|
| DKL-DI-0001 | sudo | FATAL |
| DKL-DI-0002 | Чувствительные директории | FATAL |
| DKL-DI-0003 | apt-get dist-upgrade | WARN |
| DKL-DI-0004 | apk add –no-cache | FATAL |
| DKL-DI-0005 | Очистка кеша apt-get | FATAL |
| DKL-DI-0006 | Тег latest | WARN |
Linux Security
| Код | Описание | Уровень |
|---|---|---|
| DKL-LI-0001 | Пустые пароли | FATAL |
| DKL-LI-0002 | Уникальность UID/GID | FATAL |
| DKL-LI-0003 | Ненужные файлы | INFO |

Уровни серьёзности предупреждений
| Уровень | Описание | Действие |
|---|---|---|
| FATAL | Критическая проблема | Исправить немедленно |
| WARN | Существенное нарушение | Исправить или документировать |
| INFO | Информационное предупреждение | Оценить |
| SKIP | Файл не найден | Обычно не требует действий |
| PASS | Проверка пройдена | Нет проблем |
Для CI/CD: используйте --exit-code 1 и --exit-level warn.
Главная проблема: запуск контейнера от root
В контейнере без инструкции USER (или с USER root) атакующий получает root-доступ. Опасности:
- Эскалация привилегий на хост через монтирование Docker-сокета
- Доступ к данным других контейнеров на хосте
- Горизонтальное перемещение по сети
- Кража секретов: ключи API, токены, сертификаты
Kubernetes поддерживает runAsNonRoot: true, но лучше устранять проблему на уровне самого образа.
💡 Для мониторинга целостности файловой системы серверов, на которых запускаются контейнеры, рекомендуем ознакомиться с инструментом AIDE — защита серверов от атак.

Как исправить: непривилегированный пользователь в Dockerfile
FROM debian:bookworm-slim
ARG USER=appuser
ARG UID=1001
ARG GID=${UID}
RUN apt-get update && \
apt-get install -y --no-install-recommends curl ca-certificates && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN groupadd --gid ${GID} ${USER} && \
useradd --uid ${UID} --gid ${GID} -m ${USER}
WORKDIR /app
RUN chown -R ${USER}:${USER} /app
USER ${USER}Все операции с root выполняются до переключения. USER — последняя инструкция. UID — из диапазона выше 1000.
HEALTHCHECK
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
CMD curl -f http://localhost/ || exit 1Интеграция Dockle в CI/CD
GitHub Actions
name: Docker Security Scan
on: push
jobs:
dockle:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t my-app:scan .
- uses: goodwithtech/dockle-action@main
with:
image: 'my-app:scan'
exit-code: '1'
exit-level: 'warn'GitLab CI
dockle_scan:
stage: test
image: docker:latest
services:
- docker:dind
before_script:
- docker build -t my-app:${CI_COMMIT_SHORT_SHA} .
- export VERSION=$(wget -qO - "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
- tar zxvf dockle_${VERSION}_Linux-64bit.tar.gz
script:
- ./dockle --exit-code 1 --exit-level warn my-app:${CI_COMMIT_SHORT_SHA}Travis CI
services:
- docker
before_install:
- docker build -t my-app:${TRAVIS_COMMIT::8} .
- export VERSION=$(curl --silent "https://api.github.com/repos/goodwithtech/dockle/releases/latest" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/')
- tar zxvf dockle_${VERSION}_Linux-64bit.tar.gz
script:
- ./dockle --exit-code 1 my-app:${TRAVIS_COMMIT::8}💡 Если вам нужно выстроить полноценный DevSecOps-пайплайн с автоматическим аудитом Docker-образов — специалисты IT For Prof помогут настроить инфраструктуру и обеспечат администрирование серверов 24/7.

Работа с приватными реестрами
Docker Hub
export DOCKLE_AUTH_URL=https://registry.hub.docker.com
export DOCKLE_USERNAME={DOCKERHUB_USERNAME}
export DOCKLE_PASSWORD={DOCKERHUB_PASSWORD}
dockle your-private-image:tagAmazon ECR
export AWS_ACCESS_KEY_ID={AWS_ACCESS_KEY}
export AWS_SECRET_ACCESS_KEY={SECRET_KEY}
export AWS_DEFAULT_REGION={AWS_REGION}
dockle {ACCOUNT_ID}.dkr.ecr.{REGION}.amazonaws.com/your-image:tagGoogle Container Registry
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/credential.json
dockle gcr.io/{PROJECT_ID}/your-image:tagСамостоятельный реестр
export DOCKLE_USERNAME={USERNAME}
export DOCKLE_PASSWORD={PASSWORD}
dockle registry.example.com/your-image:tag
# Если без SSL:
export DOCKLE_NON_SSL=trueВажно: в CI/CD используйте механизмы секретов (GitHub Secrets, GitLab CI Variables, Vault).
Управление исключениями: файл .dockleignore
# Запуск от root необходим (NGINX на порту 80)
CIS-DI-0001
# Тег latest для внутренних проверок
DKL-DI-0006Исключения через CLI:
dockle -i CIS-DI-0001 -i DKL-DI-0006 your-image:tag
# Или через ENV:
export DOCKLE_IGNORES=CIS-DI-0001,DKL-DI-0006Дополнительные флаги:
dockle --accept-key GPG_KEY --accept-key JAVA_VERSION your-image:tag
dockle --accept-file authorized_keys your-image:tag
dockle --accept-file-extension pem --accept-file-extension log your-image:tagDockle и Trivy: в чём разница
Dockle и Trivy решают разные задачи и отлично дополняют друг друга.
| Критерий | Dockle | Trivy |
|---|---|---|
| Задача | Аудит конфигурации, CIS Benchmark | Поиск CVE в пакетах |
| Что проверяет | Dockerfile, права файлов, секреты | Версии пакетов, зависимости |
| Стандарт | CIS Docker Benchmark | Базы CVE (NVD, дистрибутивы) |
| Пример | «Последний пользователь не root» | «curl 7.88.1: CVE-2023-XXXXX» |
Рекомендация: используйте оба инструмента в связке для комплексной проверки безопасности на уровне CI/CD.
Форматы вывода результатов
# JSON
dockle -f json -o results.json your-image:tag
# SARIF (для GitHub Code Scanning)
dockle -f sarif -o results.sarif your-image:tag
# Список (по умолчанию)
dockle -f list your-image:tagSARIF особенно полезен для GitHub Code Scanning — результаты отображаются во вкладке Security репозитория.
Заключение
Dockle — простой, но эффективный инструмент для аудита Docker-образов. Практические рекомендации:
- Добавьте Dockle + Trivy в CI/CD для комплексной проверки
- Создавайте непривилегированного пользователя в Dockerfile, USER — последняя инструкция
- Конкретные теги версий вместо
latest HEALTHCHECKво всех образах с сервисамиCOPYвместоADD- Очищайте кеш пакетных менеджеров в том же слое
- Не храните секреты в ENV или файлах образа
⚠️ Хотите автоматизировать аудит Docker-образов в своей компании?
Мы поможем внедрить Dockle в ваш CI/CD-пайплайн, проверить существующие образы по CIS Benchmark и выстроить DevSecOps-процесс.
Свяжитесь с IT For Prof — подберём решение под вашу инфраструктуру.
Читайте также:

