Dockle — проверка безопасности Docker-образов по стандартам CIS Benchmark

Dockle — инструмент аудита безопасности Docker-образов

Безопасность контейнеров — одна из ключевых задач при работе с 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
Результат сканирования образа NGINX с помощью Dockle — выявленные проблемы безопасности

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_NAME

Bash-скрипт

#!/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
Полная карта контрольных точек Dockle — CIS Benchmark, Docker и Linux проверки

Типичный вывод:

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 files

CIS-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-0005Docker Content TrustINFO
CIS-DI-0006HEALTHCHECKINFO
CIS-DI-0007update без установкиINFO
CIS-DI-0008setuid/setgid файлыINFO
CIS-DI-0009COPY вместо ADDFATAL
CIS-DI-0010Секреты в ENVFATAL
CIS-DI-0011Проверенные пакетыINFO

Docker Best Practices

КодОписаниеУровень
DKL-DI-0001sudoFATAL
DKL-DI-0002Чувствительные директорииFATAL
DKL-DI-0003apt-get dist-upgradeWARN
DKL-DI-0004apk add –no-cacheFATAL
DKL-DI-0005Очистка кеша apt-getFATAL
DKL-DI-0006Тег latestWARN

Linux Security

КодОписаниеУровень
DKL-LI-0001Пустые паролиFATAL
DKL-LI-0002Уникальность UID/GIDFATAL
DKL-LI-0003Ненужные файлыINFO
Схема атаки через контейнер, запущенный от root — эскалация привилегий на хост

Уровни серьёзности предупреждений

УровеньОписаниеДействие
FATALКритическая проблемаИсправить немедленно
WARNСущественное нарушениеИсправить или документировать
INFOИнформационное предупреждениеОценить
SKIPФайл не найденОбычно не требует действий
PASSПроверка пройденаНет проблем

Для CI/CD: используйте --exit-code 1 и --exit-level warn.

Главная проблема: запуск контейнера от root

В контейнере без инструкции USER (или с USER root) атакующий получает root-доступ. Опасности:

  • Эскалация привилегий на хост через монтирование Docker-сокета
  • Доступ к данным других контейнеров на хосте
  • Горизонтальное перемещение по сети
  • Кража секретов: ключи API, токены, сертификаты

Kubernetes поддерживает runAsNonRoot: true, но лучше устранять проблему на уровне самого образа.

💡 Для мониторинга целостности файловой системы серверов, на которых запускаются контейнеры, рекомендуем ознакомиться с инструментом AIDE — защита серверов от атак.

Интеграция Dockle в конвейер CI/CD — автоматическая проверка безопасности Docker-образов

Как исправить: непривилегированный пользователь в 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.

Сравнение Dockle и Trivy — аудит конфигурации vs. поиск уязвимостей в Docker-образах

Работа с приватными реестрами

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:tag

Amazon 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:tag

Google 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:tag

Dockle и Trivy: в чём разница

Dockle и Trivy решают разные задачи и отлично дополняют друг друга.

КритерийDockleTrivy
ЗадачаАудит конфигурации, 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:tag

SARIF особенно полезен для 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 — подберём решение под вашу инфраструктуру.

Читайте также:

Связаться с нами