
Локально размещаемая VAPT-платформа, изолированная от внешних сетей, которая запускает 8 параллельных модулей сканирования, детерминированно оценивает находки по CVSS v3.1 и формирует PDF-отчёты с необязательными рекомендациями по устранению, генерируемыми ИИ через локальную LLM.
Создано maverickaayush.
Локально размещаемый автономный (air-gapped) VAPT-инструмент: укажите авторизованный целевой домен — и он запустит 8 модулей сканирования параллельно, детерминированно оценит каждую находку (CVSS v3.1), при желании добавит сгенерированные локальной LLM описания на простом английском языке и сформирует PDF-отчёт плюс живой веб-дашборд. Никаких внешних API-вызовов — всё работает в вашей собственной сети.
Два способа запуска ONUS:
- Самостоятельный хостинг (этот репозиторий):
docker compose up→ введите домен → отметьте галочкой окно авторизации → сканирование. Никакого аккаунта, входа или проверки email — по замыслу он рассчитан на одного оператора, и всё описанное ниже относится именно к этому пути.- Хостинг: управляемый экземпляр доступен на tryonus.tech. Он добавляет функции только для продакшена (аккаунты / вход через OAuth, очередь сканирования, история для каждого пользователя), которые по умолчанию выключены в этом репозитории, поэтому самостоятельный хостинг остаётся простым. См. Самостоятельный хостинг vs хостинг.
Путь самостоятельного хостинга по умолчанию намеренно прост: без регистрации, без
проверки email, без OAuth. Функции только для хостинга (аутентификация, очередь
сканирования) находятся за конфигурационными флагами, которые по умолчанию
выключены (REQUIRE_AUTH=false, HOSTED_QUEUE_ENABLED=false; см.
Конфигурация) и не заданы в docker-compose.yml — поэтому локальный
запуск ONUS никогда не прячет вас за логином. Предпочитаете нулевую настройку?
Используйте хостинг на tryonus.tech.
| Новое сканирование | Статус живого сканирования |
|---|---|
![]() | ![]() |
| Дашборд отчёта | Обнаружение сканирований |
|---|---|
![]() | ![]() |
domain → [recon | webscan | ssl_tls | headers | owasp | tech_fingerprint | nuclei | enumeration] (parallel, Celery)
→ any module failed/timed out? → pause for operator retry/continue/cancel
→ aggregator (dedup + OWASP-map + sort)
→ confidence verification (passive re-observation)
→ deterministic CVSS scoring
→ Ollama (Qwen 2.5 7B) AI analysis
→ WeasyPrint PDF + PostgreSQL
→ dashboard / PDF download
Шесть уровней: фронтенд Next.js → FastAPI → Celery/Redis → 8 параллельных
модулей сканирования → Ollama (Qwen 2.5 7B) → WeasyPrint PDF + дашборд.
Подробности — в ARCHITECTURE.md (схемы, контракты,
ограничения) и docs/QUICK_REF.md (быстрый поиск для частых изменений).
mem_limit: 4g), а рядом с ним работают Postgres, Redis, API, worker и фронтенд.См. «Предварительные требования» выше: ~8 ГБ на диске и ~6 ГБ ОЗУ; рассчитывайте на 10–15 минут для первой сборки.
cp .env.example .env
cp backend/subfinder-config/provider-config.yaml.example backend/subfinder-config/provider-config.yaml
docker compose up -d
docker compose ps # wait for zap to report healthy (~2 min)
Откройте http://localhost:3000, введите домен, отметьте галочкой окно авторизации и запустите сканирование.
Без входа, регистрации или проверки email. Самостоятельно размещённый ONUS по умолчанию рассчитан на одного оператора — между открытием дашборда и сканированием нет ни одного шага с аккаунтом.
Работает и без установки Ollama. Оценка CVSS/серьёзности/приоритета всегда
детерминированная (analysis/cvss_scorer.py) — если Ollama не запущен, находки
получают шаблонное описание на основе правил вместо сгенерированного ИИ текста.
Чтобы включить эту функцию, см. раздел «Опционально: включение ИИ-генерируемых
описаний» ниже.
Для работы инструмента не требуется ни одного API-ключа. Все обёрнутые в него
инструменты сканирования (nmap, ZAP, Nikto, testssl.sh, Nuclei, Amass, Naabu,
httpx, WhatWeb, WAFW00F, FFUF) и сам Ollama работают вообще без ключей. Шаг
копирования конфига subfinder выше — единственное необязательное исключение:
оставить его как пустой шаблон — нормально, subfinder просто будет работать только
с бесплатными/публичными источниками. Чтобы углубить перебор поддоменов, вы можете
добавить в этот файл до двух ключей бесплатного тарифа перед запуском: GitHub
personal access token и API-ключ ProjectDiscovery Chaos —
см. комментарии внутри provider-config.yaml.example.
Ollama запускается нативно на хосте (не в Docker), чтобы напрямую использовать
GPU хоста; контейнеры обращаются к нему через host.docker.internal.
ollama pull qwen2.5:7b127.0.0.1, недоступный для bridge-сети Docker):
sudo systemctl edit ollama
[Service]:
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload && sudo systemctl restart ollama
curl http://localhost:11434/api/tagsdocker compose restart backend workerВ compose-файле также определены 12 намеренно уязвимых тренировочных приложений (Juice Shop, DVWA, bWAPP, Mutillidae, NodeGoat, DVWP/WordPress за WAF ModSecurity, Metasploitable2, WebGoat) — чтобы опробовать сканер на чём-то, не имея собственной авторизованной цели. Они находятся за профилем Compose, поэтому по умолчанию никогда не собираются и не запускаются:
docker compose --profile targets up -d
Предупреждение: это намеренно уязвимые сервисы, некоторые с настоящими бэкдорами
(Metasploitable2 поставляется с живым бэкдором vsftpd). Запускайте профиль
targets только на машине, недоступной из интернета или общей сети, — никогда
на публичном облачном инстансе или открытом хосте.
Большинство из них запускаются из готовых образов и не требуют ничего
дополнительного. Два приложения — nodegoat и dvwp-wordpress — собираются
из исходников, которые не включены в этот репозиторий, и их сначала нужно
клонировать:
git clone https://github.com/OWASP/NodeGoat nodegoat-src
git clone https://github.com/vavkamil/dvwp dvwp-src
Публикуемые порты после запуска: Juice Shop :3001, DVWA :8081, bWAPP
:8083, Mutillidae :8084, NodeGoat :8085, DVWP (через WAF, TLS) :8444,
WebGoat :8082. Metasploitable2 не публикует порты на хосте (доступен только
из backend/worker через внутреннюю сеть Docker), поскольку он открывает
реальные бэкдорные/неаутентифицированные сетевые сервисы.
Переменные окружения задаются через .env (копируется из .env.example):
Указанные выше значения POSTGRES_PASSWORD/SECRET_KEY по умолчанию предназначены
только для демо — они подходят для локального/личного инстанса, но перед
развёртыванием в любом месте, доступном другим людям, измените оба. Теперь это
принудительно, а не просто рекомендация: установите ONUS_ENV=production
(или включите hosted-аутентификацию) — и backend откажется запускаться, пока
хотя бы одно из значений остаётся значением по умолчанию/заглушкой. Сгенерируйте
надёжный ключ командой python -c "import secrets; print(secrets.token_urlsafe(48))".
Функции только для хостинга по умолчанию выключены. REQUIRE_AUTH (аккаунты /
вход через OAuth) и HOSTED_QUEUE_ENABLED (очередь сканирования) по умолчанию
равны false и не заданы в docker-compose.yml, поэтому self-hosted ONUS никогда
не ставит вас за логин или очередь. Оставьте их выключенными, если вы намеренно
не строите многопользовательское hosted-развёртывание — управляемый инстанс
tryonus.tech — это тот самый случай, когда их включают.
ONUS по умолчанию не содержит аналитики — ничего не загружается, и никакие данные не покидают браузер. Чтобы собирать анонимные метрики использования продукта в вашем развёртывании, задайте один Measurement ID Google Analytics 4:
NEXT_PUBLIC_GA_ID=G-XXXXXXXXXX
Это переменная времени сборки фронтенда, поэтому задайте её в окружении сборки
фронтенда (переменная окружения Vercel/хостинга или frontend/.env.local для
локальной npm run build). Когда она задана, GA загружается только
в production-сборках и отслеживает просмотры страниц плюс несколько продуктовых
событий (например, scan_started, scan_completed, report_downloaded).
Пользовательские события проходят через типизированный хелпер в
frontend/lib/analytics.ts — trackEvent('scan_started').
Конфиденциальность: отправляются только анонимные события использования
с низкой кардинальностью — никогда домены сканирования, результаты сканирования,
находки, содержимое отчётов, состояние авторизации или любые персональные данные.
Оставьте NEXT_PUBLIC_GA_ID незаданным, и ONUS будет вести себя ровно как раньше;
аналитика полностью опциональна.
FastAPI бесплатно генерирует интерактивную документацию Swagger — когда backend запущен, откройте http://localhost:8000/docs.
docker compose down
docker compose logs -f backend worker
pip install -r backend/requirements-dev.txt
pytest backend/tests
На момент написания — 655 автоматизированных тестов backend. Помимо набора
модульных/интеграционных тестов, инструмент в ходе разработки проверялся
end-to-end: выполнено 79 реальных сканирований и сформировано 124 PDF-отчёта
по девяти намеренно уязвимым тренировочным приложениям (DVWA, Juice Shop,
Mutillidae, NodeGoat, bWAPP, WebGoat, Metasploitable2, DVWP/WordPress за WAF)
плюс одна авторизованная публичная цель (testphp.vulnweb.com) — это не
гипотетические цифры. Сканируйте только те цели, на тестирование которых у вас
есть явное разрешение, — см. docs/test_findings.md
о тренировочных целях, использовавшихся при разработке.
ARCHITECTURE.md — полная архитектура, схемы и контракты,
которые изменение не должно нарушать. Прочтите это перед внесением существенных изменений.docs/QUICK_REF.md — команды запуска, назначение папок,
«где мне внести это изменение».docs/scanners.md — обоснование таймингов/флагов каждого
модуля сканирования.docs/ai.md — настройка таймаутов/контекста Ollama, почему оценка
полностью ушла из LLM.docs/docker.md — заметки об отклонениях Docker и грабли при сборке.docs/troubleshooting.md — как вручную протестировать
любой модуль/этап изолированно.docs/roadmap.md — историческая последовательность сборки
(сборка завершена).CONTRIBUTING.md — настройка разработки, тесты, ожидания по PR.MIT — см. LICENSE.
Сканирование целей без явного письменного разрешения незаконно в соответствии с IT Act 2000 (Индия) и аналогичными международными законами. Этот инструмент требует подтверждения авторизации при каждом сканировании и записывает оператора
| Самостоятельный хостинг (этот репозиторий) | Хостинг (tryonus.tech) |
|---|
| Установка | docker compose up | не требуется — просто откройте сайт |
| Вход | нет — один оператор | аккаунт / Google / GitHub OAuth |
| Процесс сканирования | домен → окно авторизации → сканирование | то же самое, после входа |
| Дополнительно | - | очередь сканирования, история пользователя, почта на хостинге |
| Где запускается | ваша собственная сеть, air-gapped | управляемое облако |
| Переменная | По умолчанию | Назначение |
|---|
POSTGRES_PASSWORD | vapt_secure_2025 | Пароль базы данных |
SECRET_KEY | change_me_to_a_long_random_string | Секретный ключ backend |
ALLOWED_HOSTS | localhost,127.0.0.1 | Разрешённые хосты FastAPI |
OLLAMA_URL | http://host.docker.internal:11434 | Адрес, по которому backend/worker обращаются к Ollama |
SCAN_TIMEOUT_MULTIPLIER | 1.5 | Масштабирует таймауты инструментов/Celery для каждого модуля — реальные цели медленнее лабораторных; уменьшите до 1.0 для лабораторных таймингов |
MAX_CONCURRENT_SCANS | 3 | Ограничение одновременных сканирований (защита от исчерпания ресурсов / вежливость к цели, также задаёт размер пула подключений к БД) |
ONUS_ENV | development | development (self-hosted localhost — слабые секреты лишь вызывают предупреждение) или production (слабые SECRET_KEY/пароль Postgres приводят к жёсткому отказу при запуске) |