
Сканер безопасности Docker на базе ИИ, который объясняет уязвимости простым языком. Лабораторный проект OWASP.

Сканер безопасности Docker на базе ИИ, который объясняет уязвимости простым языком
DockSec — это лабораторный проект OWASP, который устраняет разрыв между сложными результатами сканирования безопасности и практичными исправлениями для разработчиков. Он объединяет отраслевые сканеры (Trivy, Hadolint, Docker Scout) с ИИ для обеспечения контекстно-зависимого анализа безопасности.
Вместо того чтобы перегружать вас списком из 200+ CVE, DockSec:
Всё сканирование выполняется локально; единственное, что когда-либо покидает вашу машину, — это содержимое файлов (с удалёнными секретами), отправляемое выбранному вами ИИ-провайдеру — а при использовании локальной модели или режима только сканирования наружу не уходит вообще ничего. См. Поток данных и конфиденциальность.
Рабочий процесс DockSec: от сканирования до практических выводов
DockSec следует четырёхэтапному конвейеру:
DockSec управляет локальными сканерами, поэтому ему требуется:
| Требование | Для чего нужно | Установка |
|---|---|---|
| Python 3.12+ | Сам DockSec | python.org |
| Trivy | Все сканирования (обязательно) | brew install trivy или документация Trivy |
| Hadolint | Проверка Dockerfile | brew install hadolint или документация Hadolint |
| Docker | Сканирование образов (-i) | документация Docker |
Или позвольте DockSec установить Trivy и Hadolint за вас:```bash python -m docksec.setup_external_tools
### 2. Установка DockSec```bash
# Full install with AI analysis support (recommended)
pip install "docksec[ai]"
# Or the slim, scan-only core (no LLM dependencies, no API key needed)
pip install docksec
Для локального сканирования API-ключ не требуется:```bash docksec Dockerfile --scan-only
Каждый скан завершается сводкой результатов: таблицей серьёзности, оценкой безопасности от 0 до 100 с рейтингом, блоком действий «Quick take», сгенерированными отчётами (по умолчанию сохраняются в `~/.docksec/results/`) и предложенной следующей командой.
### 4. Включение AI-анализа
AI-анализ объясняет находки и предлагает исправления. Выберите провайдера, укажите его API-ключ и выполните:```bash
# OpenAI (default provider)
export OPENAI_API_KEY="sk-..."
docksec Dockerfile
# Anthropic Claude
export ANTHROPIC_API_KEY="sk-ant-..."
docksec Dockerfile --ai-only --provider anthropic --model claude-sonnet-5
# Google Gemini
export GOOGLE_API_KEY="..."
docksec Dockerfile --ai-only --provider google
# Ollama (fully local, no API key, data never leaves your machine)
docksec Dockerfile --ai-only --provider ollama --model llama3.1
У каждого провайдера есть разумная модель по умолчанию (OpenAI: gpt-4o, Anthropic:
claude-haiku-4-5, Google: gemini-1.5-pro, Ollama: llama3.1), поэтому --model —
необязательный параметр. Чтобы не повторять флаги, задайте переменные окружения (или поместите их в файл .env
в каталоге, из которого вы запускаете — DockSec загружает его автоматически):```bash
export LLM_PROVIDER=anthropic
export LLM_MODEL=claude-sonnet-5
docksec Dockerfile
Перед отправкой любого содержимого поставщику ИИ значения, похожие на секреты (пароли, токены,
ключи API, блоки закрытых ключей), автоматически маскируются. См.
[Поток данных и конфиденциальность](#data-flow-and-privacy).
### 5. Или используйте GitHub Action```yaml
- name: Run DockSec AI Scanner
uses: OWASP/[email protected]
with:
dockerfile: 'Dockerfile'
openai_api_key: ${{ secrets.OPENAI_API_KEY }}
docksec Dockerfile -i myapp:latest
docksec --compose docker-compose.yml
docksec --image-only -i myapp:latest
docksec Dockerfile --scan-only
docksec -i myapp:latest --image-only --severity CRITICAL,HIGH,MEDIUM
docksec -i myapp:latest --image-only --fail-on high
docksec Dockerfile --scan-only --format json,html --output-dir ./reports
docksec -i myapp:latest --image-only --json
docksec Dockerfile --scan-only --sarif
docksec --image-only -i myapp:latest --sbom
docksec --image-only -i myapp:latest --offline
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
docksec -i myapp:latest --image-only --ignore-file .docksec-ignore.yml
docksec -i myapp:latest --image-only --no-cache
docksec install-skill
docksec Dockerfile --scan-only --quiet # warnings, errors, summary only docksec Dockerfile --scan-only --verbose # INFO-level diagnostics on stderr docksec Dockerfile --scan-only --verbose --log-file logs/docksec.log docksec Dockerfile --no-color # also honors NO_COLOR
---
## Файл конфигурации
Зафиксируйте `.docksec.yml` в корне вашего репозитория, и вся команда — а также
каждый CI-джоб — будет сканировать по одной и той же политике, вместо того чтобы каждый разработчик передавал свои собственные флаги.```yaml
# yaml-language-server: $schema=https://owasp.org/DockSec/docksec-config-schema.json
severity: CRITICAL,HIGH
fail_on: HIGH
formats: [json, html]
output_dir: ./security-reports
rules:
disabled:
- compose-missing-healthcheck
Каждый параметр необязателен; всё, что вы пропустите, берётся из переменной
окружения, а затем из встроенного значения по умолчанию. Полный пример с комментариями приведён в
examples/.docksec.yml.
Сначала — наивысший приоритет:``` CLI flag > environment variable > .docksec.yml > built-in default
Так что зафиксированный `severity: LOW` всё равно переопределяется параметром `--severity CRITICAL` в командной строке и переменной окружения `DOCKSEC_DEFAULT_SEVERITY`.
### Обнаружение
DockSec ищет `.docksec.yml` (или `.docksec.yaml`) в рабочем каталоге, а затем поднимается вверх до корня репозитория, поэтому сервис в подкаталоге монорепозитория наследует политику, зафиксированную на верхнем уровне. Поиск останавливается в каталоге, содержащем `.git`, поэтому файл извне репозитория никогда не подхватывается.
- `--config FILE` использует конкретный файл вместо поиска.
- `--no-config` игнорирует любой файл конфигурации для воспроизводимых запусков CI.
Действующий файл конфигурации отображается в баннере сканирования, поэтому всегда понятно, какая политика была применена.
### Настройки
| Настройка | Эквивалентный флаг | Примечания |
| --- | --- | --- |
| `severity` | `--severity` | Уровни серьёзности для сканирования образа |
| `fail_on` | `--fail-on` | Порог шлюза CI |
| `formats` | `--format` | Формат списка: `[json, html]` |
| `output_dir` | `--output-dir` | Каталог для отчётов |
| `provider` | `--provider` | `openai`, `anthropic`, `google`, `ollama` |
| `model` | `--model` | Название модели для провайдера |
| `offline` | `--offline` | Без сети; пропускает AI и Docker Scout |
| `skip_ai_scoring` | `--skip-ai-scoring` | Только локальная оценка |
| `no_redact` | `--no-redact` | Не маскировать секреты перед вызовом AI |
| `no_cache` | `--no-cache` | Обход кэша сканирования |
| `ignore_file` | `--ignore-file` | Путь к файлу исключений |
| `baseline` | `--baseline` | Путь к файлу базовой линии |
| `rules.disabled` | - | Идентификаторы правил для полного отключения |
Недопустимый файл конфигурации — неизвестный ключ, неверный уровень серьёзности — является жёсткой ошибкой, которая завершает работу с кодом `2`, а не предупреждением, поэтому сломанный файл политики никогда не приведёт к запуску сканирования по правилам, которые команда не фиксировала.
### Автодополнение в редакторе
Комментарий `# yaml-language-server:` в первой строке обеспечивает автодополнение и встроенную проверку в VS Code и редакторах JetBrains. Схема опубликована в [`docs/docksec-config-schema.json`](https://github.com/owasp/docksec/blob/main/docs/docksec-config-schema.json) и может быть перегенерирована с помощью `docksec --print-config-schema`.
### Отключение правил
`rules.disabled` полностью отключает проверку везде — она удаляется до оценки, отчётов, `--json` и шлюза `--fail-on`. Используйте это для проверок, которые не применимы к вашему окружению. Для отдельных находок, которые ваша команда уже рассмотрела и приняла, предпочтительнее использовать [файл исключений](#ignoring-findings-waivers), записи которого содержат причину и срок действия и поэтому остаются проверяемыми.
---
## Интеграция с CI/CD
### Коды выхода
DockSec использует удобные для CI коды выхода, чтобы сборки и оболочки могли реагировать на результаты:
| Код | Значение |
|---|---|
| `0` | Успех, нет находок на уровне `--fail-on` или выше |
| `1` | Находки на уровне порога `--fail-on` или выше |
| `2` | Ошибка использования или аргументов |
| `3` | Ошибка инструмента или среды выполнения (сбой сканирования, образ не найден, отсутствуют инструменты) |
`--fail-on` ограничивает структурированные находки (уязвимости образа и ошибки конфигурации compose). Когда `--fail-on` ниже запрошенного `--severity`, уровень серьёзности сканирования автоматически расширяется, чтобы шлюз мог наблюдать эти находки.
### Машиночитаемый вывод
`--json` выводит один объект JSON в stdout (информация о сканировании, уязвимости, количество по уровням серьёзности и любые находки AI) вместо человекочитаемой сводки, поэтому его можно напрямую передавать в другие инструменты:```bash
docksec -i myapp:latest --image-only --json | jq '.severity_counts'
С --json отдельно файлы отчётов не записываются; комбинируйте его с --format, чтобы записывать
файлы и выводить JSON в одном запуске. Все человекочитаемые сообщения в режиме
--json перенаправляются в stderr, поэтому stdout содержит только JSON-нагрузку.
--sarif записывает отчёт SARIF 2.1.0 вместе с другими форматами отчётов. Загрузите его
с помощью стандартного действия github/codeql-action/upload-sarif, чтобы увидеть находки с аннотациями
непосредственно в pull request'ах и на вкладке Security:```yaml
name: Run DockSec uses: OWASP/[email protected] with: dockerfile: 'Dockerfile' sarif: 'true'
name: Upload SARIF to GitHub Code Scanning uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: ~/.docksec/results
> `if: always()` важен: без него шаг загрузки пропускается всякий раз, когда
> `--fail-on` заставляет DockSec завершиться с ненулевым кодом, и результаты теряются именно тогда,
> когда они нужнее всего.
### Режим базовой линии / «храповика»
`--baseline FILE` позволяет внедрить `--fail-on` в существующий проект без стены
уже имеющихся результатов, блокирующих каждую сборку. Запустите один раз с `--update-baseline`, чтобы зафиксировать
текущие результаты, затем закоммитьте файл базовой линии; после этого `--fail-on` будет срабатывать только на
результаты, которых ещё нет в базовой линии:```bash
# Snapshot current findings (does not gate)
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --update-baseline
# Later runs only fail on NEW findings above the threshold
docksec -i myapp:latest --image-only --baseline .docksec-baseline.json --fail-on high
Находки сопоставляются по идентификатору уязвимости, цели и имени пакета, поэтому базовая линия остаётся
действительной, когда появляются и исчезают несвязанные находки. Повторно запускайте с --update-baseline, когда хотите
принять текущее состояние как новую базовую линию.
--ignore-file FILE подавляет отдельные находки, которые команда проанализировала и приняла.
В отличие от базовой линии (мгновенного снимка состояния), файл игнорирования — это явный,
проверяемый список, где каждая запись содержит причину и необязательную дату истечения срока действия.
Если в текущем каталоге существует файл .docksec-ignore.yml, он подхватывается
автоматически.```yaml
ignores:
Подавленные находки удаляются до оценки, формирования отчётов, вывода `--json` и проверки `--fail-on`. Истёкшие записи перестают применяться автоматически (с предупреждением), а записи без причины помечаются, чтобы исключения оставались проверяемыми. Зафиксируйте файл в системе контроля версий, чтобы подавления проходили ревью, как и любые другие изменения.
---
## Отчёты
### Форматы отчётов
По умолчанию каждое сканирование создаёт четыре файла отчётов; используйте `--format`, чтобы выбрать подмножество:
- **html**: Интерактивный, визуально чистый веб-отчёт: карточки серьёзности, оценка рейтинга, полная таблица уязвимостей с исправленными версиями и полные выводы ИИ.
- **pdf**: Переносимый документ, готовый к презентации.
- **json**: Полные машиночитаемые данные сканирования (та же структура, что и вывод `--json` в stdout).
- **csv**: Готовая к использованию в электронных таблицах таблица отдельных уязвимостей.
> Примечание о поведении CSV: при нулевом количестве уязвимостей DockSec всё равно записывает CSV только с заголовками (имена столбцов, без строк), чтобы автоматизация ниже по конвейеру никогда не ломалась из-за отсутствующего или пустого файла. Это сделано намеренно.
### CycloneDX SBOM
`--sbom` записывает спецификацию программного обеспечения CycloneDX (`<image>.cdx.json`) сканируемого образа, перечисляя каждый компонент пакета, а также известные уязвимости. BOM создаётся нативным экспортёром Trivy (поэтому соответствует спецификации), а DockSec добавляет себя в метаданные инструмента. Передайте его в Dependency-Track, граф зависимостей GitHub или любой другой потребитель SBOM:```bash
docksec --image-only -i myapp:latest --sbom
--sbom требует одно изображение (-i), поэтому он пропускается для запусков compose. Как и --sarif,
он не зависит от --format.
DockSec спроектирован так, чтобы вы всегда знали, что покидает вашу машину:
--no-redact, чтобы отказаться от этого.--provider ollama, чтобы AI-анализ выполнялся на
вашем собственном оборудовании, или --scan-only / --offline, чтобы полностью пропустить AI.--offline выполняет сканирование без доступа к сети. Он использует базу данных уязвимостей Trivy,
уже находящуюся на диске (без обновления БД), и пропускает AI-анализ и расширенное
сканирование Docker Scout, оба из которых требуют сети. Это самый простой способ сканирования в изолированной или
строго ограниченной среде:```bash
docksec --image-only -i myapp:latest --offline
Убедитесь, что база данных Trivy была загружена хотя бы один раз (любое предыдущее онлайн-сканирование делает это), прежде чем полагаться на `--offline`.
### Кэш результатов сканирования
Результаты сканирования образов кэшируются (по умолчанию: 24 часа, переопределяется с помощью `DOCKSEC_CACHE_TTL_HOURS`) и привязываются к content digest образа, поэтому пересобранный тег, такой как повторно используемый `:latest`, всегда получает свежее сканирование. Используйте `--no-cache` (или `DOCKSEC_USE_CACHE=false`), чтобы обойти кэш для одного запуска.
---
## Навыки для ИИ-ассистентов (`install-skill`)
`docksec install-skill` записывает инструкции по использованию DockSec в общеизвестные файлы контекста для популярных ИИ-ассистентов по написанию кода, чтобы ассистент, работающий в вашем репозитории, знал, как вызывать DockSec:```bash
docksec install-skill
Это создаёт или обновляет:
.claude/commands/docksec.md (слэш-команда Claude Code /docksec).cursor/rules/docksec.mdc (Cursor)AGENTS.md (Codex CLI), GEMINI.md (Gemini CLI).github/copilot-instructions.md (GitHub Copilot)Файлы представляют собой обычный текст, который вы можете просмотреть и закоммитить; ничего не выполняется. Повторный запуск команды обновляет раздел DockSec на месте, а не дублирует его.
--fail-on, режим базовой линии/храповика, проверяемые отказы от ответственности, JSON в stdout и GitHub Action на Marketplace.--offline) с использованием локальной базы данных Trivy.docksec install-skill обучает Claude Code, Cursor, Copilot и других тому, как запускать DockSec в вашем репозитории.| Возможность | DockSec | Trivy (отдельно) | Snyk Container | Aikido |
|---|---|---|---|---|
| Лицензия и стоимость | Бесплатно, открытый исходный код (MIT) | Бесплатно, открытый исходный код (Apache 2.0) | Коммерческая (ограниченный бесплатный тариф) | Коммерческая (ограниченный бесплатный тариф) |
| Управление | Проект лаборатории OWASP, независимый от вендора | Открытый исходный код, поддерживается Aqua | Один вендор | Один вендор |
| Обнаружение CVE и ошибок конфигурации Dockerfile | Да | Да | Да | Да |
| Объяснение находок простым языком | Да (контекст и влияние, написанные ИИ) | Нет (сырые данные CVE) | Частично (серьёзность и подсказки по исправлению) | Частично (ИИ-сводки на платформе) |
| Контекстное исправление Dockerfile | Да (конкретные переписывания с объяснением) | Нет (только обнаружение) | Да (советы по обновлению базового образа, PR с исправлениями) | Да (PR с автоматическим исправлением через ИИ) |
| Сканирование Docker Compose (несколько сервисов) | Да (проверки оркестрации и сканирование каждого сервиса) | Частично (сканирование конфигурации, без развёртывания по сервисам) | Частично | Частично |
| Режим базовой линии / храповика (сбой только при новых находках) | Да | Нет | Частично (политики платформы) | Частично (политики платформы) |
| Проверяемые отказы от ответственности по каждой находке с причинами и сроком действия | Да | Частично (.trivyignore, причины не применяются) | Частично (политики платформы) | Частично (политики платформы) |
| Вывод, ориентированный на CI (SARIF для GitHub Code Scanning) | Да | Да | Да | Да |
| Экспорт SBOM (CycloneDX) | Да (--sbom) | Да | Да | Да |
| Установка навыков ИИ-ассистентов (Claude Code, Cursor, Copilot) | Да (install-skill) | Нет | Нет | Нет |
| Полностью офлайн / изолированная работа | Да (локальная LLM через Ollama, режим только сканирования, без API-ключа) | Только сканирование (без уровня исправлений) | Нет (облачная платформа) | Нет (размещённая платформа) |
| Данные вашего образа остаются в вашей сети |
DockSec — единственный из этих инструментов, который сочетает контекстное исправление Dockerfile с полностью открытым исходным кодом, управляемым OWASP и локально запускаемым дизайном. Snyk и Aikido предлагают capable ИИ-исправления, но только как коммерческие облачные платформы, которые отправляют ваши данные в их сервис. Trivy — открытый исходный код и локальный, но останавливается на обнаружении и не помогает вам ничего исправить. DockSec заполняет этот пробел для разработчиков и для регулируемых команд или команд в изолированных сетях, которым нужны как рекомендации по исправлению, так и полный контроль над своими данными, без затрат.
См. ROADMAP.md о том, куда движется DockSec: сканирование реестров без локального Docker-демона, файл конфигурации политик на уровне репозитория, шаблоны Jenkins/GitLab/Azure DevOps, официальный контейнерный образ, сканирование Kubernetes и Helm и многое другое. Отзывы и голоса по приоритетам приветствуются в issues и на OWASP Slack.
DockSec процветает благодаря вкладу сообщества. Будь вы разработчик, дизайнер или энтузиаст безопасности, есть много способов принять участие:
Чтобы начать, ознакомьтесь с нашими Рекомендациями по участию, Кодексом поведения и Руководством по спонсорству.
DockSec возглавляет преданная команда, стремящаяся сделать безопасность контейнеров доступной:
Найдите нас здесь:
| Да |
| Да |
| Нет |
| Нет |
| Своя LLM / выбор модели | Да (OpenAI, Anthropic, Gemini или локальная Ollama) | Не применимо | Нет (проприетарный ИИ) | Нет (проприетарный ИИ) |
| Самостоятельное размещение, без развёртывания платформы | Да | Да | Нет | Нет |
| Привязка к вендору | Отсутствует | Отсутствует | Да | Да |
| Оценка безопасности (0-100) и отчёты в нескольких форматах | Да | Частично (машинные форматы, без отчёта об исправлениях) | Частично (отчёты на панели управления) | Частично (отчёты на панели управления) |