
Krawl — это настраиваемый, легковесный, облачный веб-сервер обмана и анти-краулер, который создает поддельные веб-приложения с простыми уязвимостями, используя реалистичные, случайно сгенерированные приманки и HTML-шаблоны, созданные ИИ.
Современный, настраиваемый сервер-приманка (honeypot) для веб-приложений, предназначенный для обнаружения и отслеживания вредоносной активности атакующих и веб-сканеров с помощью обманных веб-страниц, поддельных учётных данных и канареечных токенов.
Совет: просканируйте пути из robots.txt для дополнительного удовольствия
Krawl — это облачно-нативный сервер-обманщик, предназначенный для обнаружения, задержки и анализа вредоносных атакующих, веб-сканеров и автоматических сканеров.
Он создаёт реалистичные поддельные веб-приложения, полные «низко висящих плодов»: панелей администратора, конфигурационных файлов и открытых фальшивых учётных данных, чтобы привлекать и выявлять подозрительную активность.

Заставляя атакующих тратить ресурсы, Krawl помогает чётко отличать вредоносное поведение от легитимных сканеров.
Он включает:
Вы можете легко выставить Krawl рядом с другими сервисами, чтобы защитить их от веб-сканеров и вредоносных пользователей с помощью обратного прокси. Подробнее см. в документации по обратному прокси.

Krawl предоставляет комплексную панель управления, доступную по случайному секретному пути, который генерируется при запуске, или по настраиваемому пути, задаваемому через KRAWL_DASHBOARD_SECRET_PATH. Это скрывает панель от атакующих, сканирующих вашу приманку.
Панель управления организована в шесть вкладок:



Кроме того, после аутентификации с паролем панели становятся доступны две защищённые вкладки:
Подробнее см. в документации по панели управления.
Krawl поддерживает два режима развёртывания, управляемых настройкой mode в файле config.yaml или переменной окружения KRAWL_MODE.
Автономный (Standalone): идеален для сред разработки или домашних лабораторий с небольшим количеством запросов. Не требуется дополнительная настройка — просто запустите Krawl, и он заработает.
Масштабируемый (Scalable): предназначен для продакшн-сред или приманок с высоким трафиком. В Helm-чарте по умолчанию используется этот режим.
Подробные сведения о конфигурации, примеры Docker Compose, настройку Kubernetes/Helm и пошаговую инструкцию по миграции см. в документации по режимам развёртывания.
Krawl поддерживает регулярно обновляемый banlist.txt с IP-адресами атакующих, которые активировали его ловушки-приманки. Бан-лист публикуется еженедельно и доступен для скачивания, что помогает сообществу превентивно блокировать известных злоумышленников даже без использования Krawl.
Бан-лист также можно получить напрямую по адресу: https://demo.krawlme.com/das_dashboard/api/export-ips?categories=attacker&fwtype=raw.
Запустите Krawl в автономном режиме с последним образом:```bash
docker run -d
-p 5000:5000
-e KRAWL_DASHBOARD_SECRET_PATH="/my-secret-dashboard"
-e KRAWL_DASHBOARD_PASSWORD="my-secret-password"
-v krawl-data:/app/data
--name krawl
ghcr.io/blessedrebus/krawl:latest
Доступ к серверу: `http://localhost:5000`
### Docker Compose
Создайте `docker-compose.yaml` с одним из двух режимов развертывания.
**Standalone**: сервер Krawl с хранилищем Sqlite:```yaml
services:
krawl:
image: ghcr.io/blessedrebus/krawl:latest
container_name: krawl-server
ports:
- "5000:5000"
environment:
- CONFIG_LOCATION=config.yaml
# - KRAWL_DASHBOARD_PASSWORD=my-secret-password
volumes:
- ./config.yaml:/app/config.yaml:ro
- krawl-data:/app/data
restart: unless-stopped
volumes:
krawl-data:
Масштабируемый: с PostgreSQL и Redis:
[!CAUTION] В примере ниже используются пароли по умолчанию (
krawl/krawl). Измените их перед развертыванием в production.```yaml services: postgres: image: postgres:16-alpine environment: POSTGRES_DB: krawl POSTGRES_USER: krawl POSTGRES_PASSWORD: krawl volumes: - postgres_data:/var/lib/postgresql/data restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U krawl -d krawl"] interval: 10s timeout: 5s retries: 5
redis: image: redis:7-alpine volumes: - redis_data:/data restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5
krawl: image: ghcr.io/blessedrebus/krawl:latest container_name: krawl-server ports: - "5000:5000" environment: - CONFIG_LOCATION=config.yaml - KRAWL_MODE=scalable - KRAWL_POSTGRES_HOST=postgres - KRAWL_POSTGRES_PORT=5432 - KRAWL_POSTGRES_USER=krawl - KRAWL_POSTGRES_PASSWORD=krawl - KRAWL_POSTGRES_DATABASE=krawl - KRAWL_REDIS_HOST=redis - KRAWL_REDIS_PORT=6379 # - KRAWL_DASHBOARD_PASSWORD=my-secret-password volumes: - ./config.yaml:/app/config.yaml:ro restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy
volumes: postgres_data: redis_data:
Для развертывания просто выполните```bash
docker compose up -d
Готовые к использованию в production файлы compose также доступны в каталоге docker/. Для разработки (сборка из исходного кода с горячей перезагрузкой) используйте файлы compose в корне проекта.
Более подробную информацию о обоих режимах см. в Режимах развертывания.
Krawl также доступен нативно в Kubernetes. Установку можно выполнить либо через манифест, либо с помощью Helm-чарта.
Helm-чарт по умолчанию использует масштабируемый режим со встроенными PostgreSQL и Redis:```bash
helm install krawl oci://ghcr.io/blessedrebus/krawl-chart --version 2.2.0
-n krawl-system --create-namespace
--set postgres.password=your-password
--set redis.password=your-redis-password
--set dashboardPassword=your-dashboard-password
--set config.dashboard.secret_path=/my-secret-dashboard
Минимальные примеры файлов значений предоставлены для обоих режимов:
- [`values-minimal.yaml`](https://github.com/blessedrebus/krawl/blob/HEAD/helm/values-minimal.yaml) ---> Масштабируемый (по умолчанию)
- [`values-standalone.yaml`](https://github.com/blessedrebus/krawl/blob/HEAD/helm/values-standalone.yaml) ---> Автономный
Смотрите [Режимы развертывания](https://github.com/blessedrebus/krawl/blob/HEAD/docs/deployment-modes.md) и [Документацию диаграммы](https://github.com/blessedrebus/krawl/blob/HEAD/helm/README.md) для полной конфигурации и инструкций по миграции.
### Uvicorn (Python)
Запустите Krawl напрямую с Python 3.13+ и uvicorn для локальной разработки или тестирования:```bash
pip install -r requirements.txt
uvicorn app:app --host 0.0.0.0 --port 5000 --app-dir src --no-server-header
Доступ к серверу: http://localhost:5000
Krawl использует иерархию конфигурации, в которой переменные окружения имеют приоритет над файлом конфигурации. Этот подход рекомендуется для развертывания в Docker и быстрой настройки «из коробки».
Вы можете использовать файл config.yaml для расширенных настроек, например, при развертывании с Docker Compose или Helm чартами.
Например```bash
export CONFIG_LOCATION="config.yaml" export KRAWL_CANARY_TOKEN_URL="http://your-canary-token-url"
export KRAWL_LINKS_PER_PAGE_RANGE="5,25"
export KRAWL_HTTP_RISKY_METHODS_THRESHOLD="0.2" export KRAWL_VIOLATED_ROBOTS_THRESHOLD="0.15"
export KRAWL_DASHBOARD_SECRET_PATH="/my-secret-dashboard" export KRAWL_DASHBOARD_PASSWORD="my-secret-password"
Пример запуска Docker с переменными окружения (автономный режим):```bash
docker run -d \
-p 5000:5000 \
-e KRAWL_MODE=standalone \
-e KRAWL_PORT=5000 \
-e KRAWL_DELAY=100 \
-e KRAWL_DASHBOARD_PASSWORD="my-secret-password" \
-e KRAWL_CUSTOM_TEMPLATE_PATH="/templates/custom_page.html" \
-e KRAWL_CANARY_TOKEN_URL="http://your-canary-token-url" \
--name krawl \
ghcr.io/blessedrebus/krawl:latest
Krawl использует систему на основе репутации для классификации IP-адресов атакующих и предоставляет два способа экспорта списков IP для интеграции с межсетевым экраном.
Конечная точка /api/export-ips выполняет прямой запрос к базе данных и поддерживает фильтрацию по категории IP (attacker, bad_crawler, regular_user, good_crawler) и формату вывода (raw, iptables, nftables):```bash
curl "https://your-krawl-instance//api/export-ips?categories=attacker&fwtype=raw"
Это позволяет автоматически блокировать вредоносный трафик на различных платформах:
* [OPNsense и pfSense](https://ipv64.net/v64_blocklist_integration_guide)
* [RouterOS](https://rentry.co/krawl-routeros)
* [IPtables](https://github.com/blessedrebus/krawl/blob/HEAD/plugins/iptables/README.md) и [Nftables](https://github.com/blessedrebus/krawl/blob/HEAD/plugins/nftables/README.md)
* [Fail2Ban](https://github.com/blessedrebus/krawl/blob/HEAD/plugins/fail2ban/README.md)
Полные параметры API, примеры и добавление пользовательских форматов брандмауэра см. в [документации Firewall Exporters](https://github.com/blessedrebus/krawl/blob/HEAD/docs/firewall-exporters.md).
## IP Reputation
Krawl [использует задачи, которые анализируют недавний трафик для построения и непрерывного обновления](https://github.com/blessedrebus/krawl/blob/HEAD/src/tasks/analyze_ips.py) оценки репутации IP. Он запускается периодически и оценивает каждый активный IP-адрес на основе нескольких поведенческих индикаторов, классифицируя его как атакующего, краулера или обычного пользователя. Пороги полностью настраиваемы.

Анализ включает:
- **Использование рискованных HTTP-методов** (например, соотношение POST, PUT, DELETE)
- **Нарушения Robots.txt**
- **Аномалии времени запросов** (всплески или нерегулярные паттерны)
- **Согласованность User-Agent**
- **Обнаружение атакующих URL** (например, SQL-инъекции, XSS-паттерны)
Каждый сигнал вносит вклад в взвешенную модель оценки, которая присваивает категорию репутации:
- `attacker`
- `bad_crawler`
- `good_crawler`
- `regular_user`
- `unknown` (для недостаточных данных)
Полученные оценки и метрики сохраняются в базе данных и используются Krawl для управления панелями мониторинга, отслеживания репутации и автоматических действий по смягчению угроз, таких как блокировка IP или интеграция с брандмауэром.
## Сгенерированные с помощью ИИ страницы обмана
Krawl может автоматически генерировать реалистичные страницы обмана, используя ИИ-модели из API **OpenRouter** или **OpenAI**. Эта функция создает уникальные, правдоподобные страницы-ловушки на лету, чтобы обмануть атакующих без необходимости ручного создания страниц.
**Ключевые особенности:**
- **Динамическая генерация**: Создает уникальные HTML-страницы для любого пути запроса
- **Умное кэширование**: Кэширует сгенерированные страницы, чтобы избежать избыточных вызовов API
- **Ежедневное ограничение скорости**: Контролируйте затраты на API с помощью настраиваемых лимитов запросов
- **Несколько провайдеров**: Поддержка OpenRouter (бесплатные варианты) и OpenAI
- **Безотказный возврат**: Возвращается к стандартной ловушке, когда отключено или достигнут лимит
- **Обслуживание из кэша**: Ранее сгенерированные страницы обслуживаются, даже если ИИ отключен
**Быстрая настройка:**```yaml
ai:
enabled: true
provider: "openrouter"
openai_base_url: "your-custom-base-url"
api_key: "your-api-key"
model: "nvidia/nemotron-3-super-120b-a12b:free"
timeout: 60
max_daily_requests: 10
Подробную информацию о конфигурации и использовании см. в документации по AI Generation.
Вы также можете внести свой вклад в шаблоны обмана, открыв PR, см. Вклад в шаблоны обмана.
Если Krawl развернут за прокси-сервером, таким как NGINX, заголовок сервера должен быть перенаправлен с помощью следующей конфигурации в вашем прокси:```bash location / { proxy_pass https://your-krawl-instance; proxy_pass_header Server; }
## Метрики и мониторинг
Krawl предоставляет метрики [Prometheus](https://prometheus.io/) по пути `/<dashboard_secret_path>/metrics` (включено по умолчанию) и поставляется с готовой к импорту панелью [Grafana](https://grafana.com/) в файле [`grafana-dashboard.json`](https://github.com/blessedrebus/krawl/blob/HEAD/grafana-dashboard.json).
Полный список метрик, шаги импорта Grafana и настройка сборов Prometheus / Kubernetes (`ServiceMonitor`) описаны в [документации по мониторингу](https://github.com/blessedrebus/krawl/blob/HEAD/docs/monitoring.md).
## Дополнительная документация
| Тема | Описание |
|-------|-------------|
| [Генерация с помощью ИИ](https://github.com/blessedrebus/krawl/blob/HEAD/docs/ai_generation.md) | Настройка создания страниц обмана с помощью ИИ через OpenRouter или OpenAI |
| [Страницы обмана](https://github.com/blessedrebus/krawl/blob/HEAD/docs/deception_pages.md) | Управление, импорт и экспорт страниц обмана; массовые операции и фильтрация по дате |
| [Режимы развёртывания](https://github.com/blessedrebus/krawl/blob/HEAD/docs/deployment-modes.md) | Автономный (SQLite) vs масштабируемый (PostgreSQL + Redis) режим, настройка и миграция данных |
| [Honeypot](https://github.com/blessedrebus/krawl/blob/HEAD/docs/honeypot.md) | Полный обзор страниц-приманок: поддельные логины, списки каталогов, файлы с учётными данными, ловушки SQLi/XSS/XXE/Command Injection и другое |
| [Панель управления](https://github.com/blessedrebus/krawl/blob/HEAD/docs/dashboard.md) | Доступ и изучение панели мониторинга в реальном времени |
| [API](https://github.com/blessedrebus/krawl/blob/HEAD/docs/api.md) | Внешние API, используемые Krawl для данных об IP, репутации и геолокации |
| [Обратный прокси](https://github.com/blessedrebus/krawl/blob/HEAD/docs/reverse-proxy.md) | Как развернуть Krawl за NGINX или использовать подставные поддомены |
| [Резервное копирование БД](https://github.com/blessedrebus/krawl/blob/HEAD/docs/backups.md) | Включение и настройка автоматического дампа базы данных |
| [Канареечные токены](https://github.com/blessedrebus/krawl/blob/HEAD/docs/canary-token.md) | Настройка внешних триггеров оповещений через canarytokens.org |
| [Словник](https://github.com/blessedrebus/krawl/blob/HEAD/docs/wordlist.md) | Настройка поддельных имён пользователей, паролей и списков каталогов |
| [Архитектура](https://github.com/blessedrebus/krawl/blob/HEAD/docs/architecture.md) | Технический обзор кодовой базы, конвейера запросов, схемы БД и фоновых задач |
| [Экспортёры межсетевых экранов](https://github.com/blessedrebus/krawl/blob/HEAD/docs/firewall-exporters.md) | Экспорт списков заблокированных IP в форматах raw, iptables или nftables через REST API |
| [Метрики и мониторинг](https://github.com/blessedrebus/krawl/blob/HEAD/docs/monitoring.md) | Эндпоинт метрик Prometheus, справочник по экспортируемым метрикам, панель Grafana и сбор данных через ServiceMonitor |
## Участие в разработке
Вклад приветствуется! Пожалуйста:
1. Сделайте форк репозитория
2. Создайте ветку для новой функции
3. Внесите свои изменения
4. Отправьте pull request (с пояснением изменений!)
## Отказ от ответственности
> [!CAUTION]
> Это система обмана/приманок. Развёртывайте в изолированных средах и внимательно отслеживайте события безопасности. Используйте ответственно и в соответствии с действующим законодательством.
## История звёзд
<img src="https://assets.kitploit.com/production/public/readmes/placeholders/f0fc86cfe65f76d40e15aaec61704ec8220a56dc89d4be03c46f67cb31b9fa8c.svg" width="600" alt="График истории звёзд" />
| Автономный (Standalone) | Масштабируемый (Scalable) |
|---|
| База данных | SQLite (режим WAL) | PostgreSQL |
| Кеш | Словарь Python в памяти | Redis (многоуровневый TTL) |
| Количество реплик | 1 (один экземпляр) | 1+ (горизонтальное масштабирование) |
| Внешние зависимости | Нет | PostgreSQL + Redis |
| Лучше всего подходит для | Разработка, домашние лаборатории, <500k запросов | Продакшн, высокая доступность, >500k запросов |
| Переменная окружения | Описание | По умолчанию |
|---|
CONFIG_LOCATION | Путь к файлу конфигурации yaml | config.yaml |
KRAWL_PORT | Порт прослушивания сервера | 5000 |
KRAWL_DELAY | Задержка ответа в миллисекундах | 100 |
KRAWL_SERVER_HEADER | HTTP-заголовок Server для обмана | "" |
KRAWL_LINKS_LENGTH_RANGE | Диапазон длины ссылок как min,max | 5,15 |
KRAWL_LINKS_PER_PAGE_RANGE | Количество ссылок на странице как min,max | 10,15 |
KRAWL_CHAR_SPACE | Символы, используемые для генерации ссылок | abcdefgh... |
KRAWL_MAX_COUNTER | Начальное значение счетчика | 10 |
KRAWL_CANARY_TOKEN_URL | Внешний URL canary-токена | None |
KRAWL_CANARY_TOKEN_TRIES | Количество запросов до показа canary-токена | 10 |
KRAWL_DASHBOARD_SECRET_PATH | Пользовательский путь к панели управления | Авто-сгенерирован |
KRAWL_DASHBOARD_PASSWORD | Пароль для защищенных панелей дашборда | Авто-сгенерирован |
KRAWL_DASHBOARD_CACHE_WARMUP | Предварительное вычисление данных дашборда каждые 5 минут для мгновенной загрузки страниц | true |
KRAWL_DASHBOARD_WARMUP_PAGES | Количество страниц для предварительного прогрева на панель таблицы | 10 |
KRAWL_DASHBOARD_WARMUP_AGGREGATION | Предварительное вычисление полных агрегаций top_paths/top_ua для нулевого времени запроса | false |
KRAWL_DASHBOARD_TOP_N_MIN_COUNT | Минимальное количество обращений для панелей топ путей/агентов пользователя (установите 1 для отключения) | 5 |
KRAWL_PROBABILITY_ERROR_CODES | Вероятность ответа с ошибкой (0-100%) | 0 |
KRAWL_DATABASE_PATH | Расположение файла базы данных | data/krawl.db |
KRAWL_DATABASE_PERSIST_SUSPICIOUS_ONLY | Сохранять в журнал доступа только подозрительные запросы | false |
KRAWL_BACKUPS_PATH | Путь, куда сохраняются дампы базы данных | backups |
KRAWL_BACKUPS_CRON | cron-выражение для управления расписанием резервного копирования | */30 * * * * |
KRAWL_BACKUPS_ENABLED | Логическое значение для включения задания дампа БД | true |
KRAWL_DATABASE_RETENTION_DAYS | Количество дней хранения данных в базе | 30 |
KRAWL_TARPIT_ENABLED | Заманивать AI-агентов медленными ответами и случайным текстом | false |
KRAWL_TARPIT_DELAY_SECONDS | Дополнительная задержка в секундах, добавляемая к каждому ответу при активной ловушке | 5 |
KRAWL_HTTP_RISKY_METHODS_THRESHOLD | Порог обнаружения опасных HTTP-методов | 0.1 |
KRAWL_VIOLATED_ROBOTS_THRESHOLD | Порог нарушений robots.txt | 0.1 |
KRAWL_UNEVEN_REQUEST_TIMING_THRESHOLD | Порог коэффициента вариации для времени запросов | 0.5 |
KRAWL_UNEVEN_REQUEST_TIMING_TIME_WINDOW_SECONDS | Временное окно анализа времени запросов в секундах | 300 |
KRAWL_USER_AGENTS_USED_THRESHOLD | Порог обнаружения множественных user-agent | 2 |
KRAWL_ATTACK_URLS_THRESHOLD | Порог обнаружения атакующих URL | 1 |
KRAWL_INFINITE_PAGES_FOR_MALICIOUS | Показывать бесконечные страницы вредоносным IP | true |
KRAWL_MAX_PAGES_LIMIT | Максимальный лимит страниц для краулеров | 250 |
KRAWL_BAN_DURATION_SECONDS | Продолжительность бана в секундах для IP с ограничением скорости | 600 |
KRAWL_AI_ENABLED | Включить AI-генерацию страниц обмана | false |
KRAWL_AI_PROVIDER | AI-провайдер ("openrouter" или "openai") | "openrouter" |
KRAWL_AI_OPENAI_BASE_URL | Опциональный базовый URL OpenAI для кастомных API-эндпоинтов | "https://api.openai.com/v1" |
KRAWL_AI_API_KEY | API-ключ для AI-провайдера | None |
KRAWL_AI_MODEL | AI-модель для генерации страниц | "nvidia/nemotron-3-super-120b-a12b:free" |
KRAWL_AI_TIMEOUT | Таймаут запроса AI-API в секундах | 60 |
KRAWL_AI_MAX_DAILY_REQUESTS | Максимальное количество AI-сгенерированных страниц в день (0 = без лимита) | 0 |
KRAWL_AI_PROMPT | Пользовательский шаблон промпта для AI-генерации страниц | Промпт по умолчанию |
KRAWL_CUSTOM_TEMPLATE_PATH | Путь внутри контейнера к кастомному HTML-шаблону. Шаблон должен содержать заполнители {counter} и {content}. | /templates/custom_page.html |
| Масштабируемый режим | ||
KRAWL_MODE | Режим развертывания (standalone или scalable) | standalone |
KRAWL_POSTGRES_HOST | Хост PostgreSQL | localhost |
KRAWL_POSTGRES_PORT | Порт PostgreSQL | 5432 |
KRAWL_POSTGRES_USER | Имя пользователя PostgreSQL | krawl |
KRAWL_POSTGRES_PASSWORD | Пароль PostgreSQL | krawl |
KRAWL_POSTGRES_DATABASE | Название базы данных PostgreSQL | krawl |
KRAWL_REDIS_HOST | Хост Redis | localhost |
KRAWL_REDIS_PORT | Порт Redis | 6379 |
KRAWL_REDIS_DB | Номер базы данных Redis | 0 |
KRAWL_REDIS_PASSWORD | Пароль Redis | None |
KRAWL_REDIS_CACHE_TTL | TTL в секундах для данных прогрева дашборда | 600 |
KRAWL_REDIS_HOT_TTL | TTL в секундах для горячих данных (информация о бане, категории IP) | 30 |
KRAWL_REDIS_TABLE_TTL | TTL в секундах для пагинированных таблиц дашборда | 120 |