
Krawl — это настраиваемый, легковесный, облачный веб-сервер обмана и анти-краулер, который создает поддельные веб-приложения с простыми уязвимостями, используя реалистичные, случайно сгенерированные приманки и HTML-шаблоны, созданные ИИ.
<h1 align="center">Krawl</h1>
<h3 align="center">
<a name="readme-top"></a>
<img
src="https://raw.githubusercontent.com/blessedrebus/krawl/HEAD/img/krawl-svg.svg"
height="250"
>
</h3>
<div align="center">
<p align="center">
Современный настраиваемый веб-ханипот-сервер, предназначенный для обнаружения и отслеживания вредоносной активности атакующих и веб-краулеров с помощью обманных веб-страниц, поддельных учётных данных и canary-токенов.
</p>
<div align="center">
<a href="https://github.com/blessedrebus/krawl/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/blessedrebus/krawl" alt="License">
</a>
<a href="https://github.com/blessedrebus/krawl/releases">
<img src="https://img.shields.io/github/v/release/blessedrebus/krawl" alt="Release">
</a>
</div>
<div align="center">
<a href="https://ghcr.io/blessedrebus/krawl">
<img src="https://img.shields.io/badge/ghcr.io-krawl-blue" alt="GitHub Container Registry">
</a>
<a href="https://kubernetes.io/">
<img src="https://img.shields.io/badge/kubernetes-ready-326CE5?logo=kubernetes&logoColor=white" alt="Kubernetes">
</a>
<a href="https://github.com/BlessedRebuS/Krawl/pkgs/container/krawl-chart">
<img src="https://img.shields.io/badge/helm-chart-0F1689?logo=helm&logoColor=white" alt="Helm Chart">
</a>
</div>
</div>
## Содержание
- [Демо](#demo)
- [Что такое Krawl?](#what-is-krawl)
- [Панель управления Krawl](#krawl-dashboard)
- [Режимы развёртывания](#deployment-modes)
- [Банлист Krawl](#krawl-banlist)
- [Быстрый старт](#quickstart)
- [Docker Run](#docker-run)
- [Docker Compose](#docker-compose)
- [Kubernetes](#kubernetes)
- [Uvicorn (Python)](#uvicorn-python)
- [Конфигурация](#configuration)
- [config.yaml](#configuration-via-configyaml)
- [Переменные окружения](#configuration-via-environmental-variables)
- [Блокировка вредоносных IP](#use-krawl-to-ban-malicious-ips)
- [Репутация IP](#ip-reputation)
- [Работа за обратным прокси или CDN](#running-behind-a-reverse-proxy-or-cdn)
- [Метрики и мониторинг](#metrics--monitoring)
- [Дополнительная документация](#additional-documentation)
- [Обман с помощью ИИ](#ai-generated-deception-pages)
- [Участие в разработке](#contributing)
## Демо
Совет: обойдите пути из `robots.txt` для дополнительного интереса
### URL Krawl: [http://demo.krawlme.com](http://demo.krawlme.com)
### Посмотреть панель управления [http://demo.krawlme.com/das_dashboard](http://demo.krawlme.com/das_dashboard)
## Что такое Krawl?
**Krawl** — это cloud-native сервер обмана, предназначенный для обнаружения, задержки и анализа вредоносных атакующих, веб-краулеров и автоматизированных сканеров.
Он создаёт реалистичные поддельные веб-приложения, наполненные лёгкой добычей, такой как админ-панели, конфигурационные файлы и открытые поддельные учётные данные, чтобы привлекать и выявлять подозрительную активность.

Тратя ресурсы атакующих, Krawl помогает чётко отличать вредоносное поведение от легитимных краулеров.
Возможности:
- **[Страницы обмана, сгенерированные ИИ](https://github.com/blessedrebus/krawl/blob/main/docs/ai_generation.md)**: **Позвольте атакующим помочь сгенерировать вашу фальшивую уязвимую поверхность атаки**
- **Страницы-ловушки для пауков**: Бесконечные случайные ссылки для траты ресурсов краулеров на основе [проекта spidertrap](https://github.com/adhdproject/spidertrap)
- **Поддельные страницы входа**: WordPress, phpMyAdmin, админ-панели
- **Пути-ханипоты**: Рекламируются в robots.txt для отлова сканеров
- **Поддельные учётные данные**: Реалистично выглядящие имена пользователей, пароли, API-ключи
- **Интеграция [Canary Token](https://github.com/blessedrebus/krawl/blob/main/docs/canary-token.md)**: Запуск внешних оповещений
- **Случайные заголовки сервера**: Сбивают с толку атаки, основанные на заголовке и версии сервера
- **Панель управления в реальном времени**: Мониторинг подозрительной активности
- **Настраиваемые словари**: Простая конфигурация на основе JSON
- **Случайная инъекция ошибок**: Имитация поведения реального сервера
Вы можете легко разместить Krawl рядом с другими вашими сервисами, чтобы защитить их от веб-краулеров и вредоносных пользователей с помощью обратного прокси. Подробнее см. в [документации по обратному прокси](https://github.com/blessedrebus/krawl/blob/main/docs/reverse-proxy.md).

## Панель управления Krawl
Krawl предоставляет комплексную панель управления, доступную по **случайному секретному пути**, генерируемому при запуске, или по **пользовательскому пути**, настроенному через `KRAWL_DASHBOARD_SECRET_PATH`. Это позволяет держать панель скрытой от атакующих, сканирующих ваш ханипот.
Панель организована в шесть вкладок:
- **Обзор**: общий вид активности атак: интерактивная карта источников IP, недавние подозрительные запросы и топ IP, User-Agent и путей.

- **Атаки**: детальная разбивка захваченных учётных данных, срабатываний ханипотов и обнаруженных типов атак (SQLi, XSS, path traversal и т. д.) с графиками и таблицами.

- **Угрозы**: полезные нагрузки, сгруппированные в кампании по нечёткому хешу TLSH, так что веб-шелл и его изменённые варианты читаются как одна кампания, а не как несвязанные попадания, с индексом каждого захваченного файла.
- **Анализ IP**: углублённый форензический обзор выбранного IP: геолокация, информация об ISP/ASN, флаги репутации, временная шкала поведения, распределение типов атак, история referer, захваченные файлы и учётные данные, а также полная история доступа.

Кроме того, после аутентификации с паролем панели управления становятся доступны защищённые вкладки:
- **Отслеживаемые IP**: ведение списка наблюдения за IP-адресами, которые вы хотите мониторить со временем.
- **Банлист IP**: управление блокировками IP, просмотр обнаруженных атакующих и экспорт банлиста в формате raw или IPTables.
- **IP с истёкшим таймаутом**: просмотр IP, которые в данный момент удерживаются в тарпите, и исключение тех, которые не должны там находиться.
- **Обман**: управление страницами, сгенерированными ИИ, их экспорт или импорт новых.
- **Вебхуки**: пересылка блокировок в CloudFlare и другие фаерволы.
Иконки в заголовке открывают документацию API, экспорт банлиста и панель настроек, показывающую текущую конфигурацию, а также страницу обслуживания для запуска запланированных задач по требованию.
Подробнее см. в [документации по панели управления](https://github.com/blessedrebus/krawl/blob/main/docs/dashboard.md).
## Режимы развёртывания
Krawl поддерживает два режима развёртывания, управляемых настройкой `mode` в `config.yaml` или переменной окружения `KRAWL_MODE`.
| | Standalone | Scalable |
|---|---|---|
| **База данных** | SQLite (режим WAL) | PostgreSQL |
| **Кэш** | Встроенный словарь Python | Redis (многоуровневый TTL) |
| **Реплики** | 1 (один экземпляр) | 1+ (горизонтальное масштабирование) |
| **Внешние зависимости** | Нет | PostgreSQL + Redis |
| **Лучше всего для** | Разработка, домашние лаборатории, <500k запросов | Продакшн, HA, >500k запросов |
**Standalone**: идеален для сред разработки или домашних лабораторий с низким числом запросов. Дополнительная конфигурация не требуется, просто запустите Krawl, и он работает.
- Развёртывание в одном контейнере без внешних зависимостей
- Меньшее потребление RAM и ресурсов
**Scalable**: предназначен для продакшн-сред или высоконагруженных ханипотов. Helm-чарт по умолчанию использует этот режим.
- Более быстрая и отзывчивая панель управления благодаря многоуровневому кэшированию Redis
- Меньше дискового ввода-вывода, так как Redis выступает в роли кэша горячего пути перед PostgreSQL
- Горизонтальное масштабирование увеличивает число реплик Krawl за балансировщиком нагрузки
Подробную конфигурацию, примеры Docker Compose, настройку Kubernetes/Helm и пошаговые инструкции по миграции см. в [документации по режимам развёртывания](https://github.com/blessedrebus/krawl/blob/main/docs/deployment-modes.md).
## Банлист Krawl
Krawl ведёт регулярно обновляемый [`banlist.txt`](https://github.com/blessedrebus/krawl/blob/main/banlist.txt) с IP-адресами **атакующих, которые сработали на его ханипот-ловушки**. Банлист публикуется еженедельно и доступен для скачивания, помогая сообществу превентивно блокировать известных вредоносных субъектов даже без использования Krawl.
Банлист также можно получить напрямую по адресу:
[https://demo.krawlme.com/das_dashboard/api/export-ips?categories=attacker&fwtype=raw](https://demo.krawlme.com/das_dashboard/api/export-ips?categories=attacker&fwtype=raw).
### Обмен банлистами между экземплярами
Экземпляры Krawl могут федеративно обмениваться своими банлистами: каждый может публиковать свой список по
неаутентифицированному пути и подтягивать списки от других экземпляров (или любой обычный текстовый список IP).
Полученные IP объединяются с локальными решениями о блокировке и отображаются в панели управления.```yaml
banlist:
# Public, unauthenticated download path for this instance's banlist.
# Supports the same ?categories= and ?fwtype= parameters as the main API.
# Empty = disabled.
export_path: "/public_banlist.txt"
# Upstream banlists to fetch and merge. Plain ".txt" lists work too.
sources:
- "https://demo.krawlme.com/das_dashboard/api/export-ips?categories=attacker&fwtype=raw"
- "https://krawl.example.com/public_banlist.txt"
refresh_interval: 3600 # seconds between fetches
```
## Быстрый старт
### Запуск через Docker
Запустите 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/`](https://github.com/blessedrebus/krawl/blob/main/docker). Для **разработки** (сборка из исходного кода с горячей перезагрузкой) используйте compose-файлы в [`docker/dev/`](https://github.com/blessedrebus/krawl/blob/main/docker/dev).
Подробнее об обоих режимах см. [Режимы развёртывания](https://github.com/blessedrebus/krawl/blob/main/docs/deployment-modes.md).
### Kubernetes
**Krawl также доступен нативно в Kubernetes**. Установка может быть выполнена либо [через манифест](https://github.com/blessedrebus/krawl/blob/main/kubernetes/README.md), либо [с помощью Helm-чарта](https://github.com/blessedrebus/krawl/blob/main/helm/README.md).
Helm-чарт **по умолчанию использует масштабируемый режим** со встроенными PostgreSQL и Redis:```bash
helm install krawl oci://ghcr.io/blessedrebus/krawl-chart --version 2.4.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/main/helm/values-minimal.yaml) ---> Масштабируемый (по умолчанию)
- [`values-standalone.yaml`](https://github.com/blessedrebus/krawl/blob/main/helm/values-standalone.yaml) ---> Автономный
См. [Режимы развёртывания](https://github.com/blessedrebus/krawl/blob/main/docs/deployment-modes.md) и [Документацию чарта](https://github.com/blessedrebus/krawl/blob/main/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
Вы можете использовать файл [config.yaml](https://github.com/blessedrebus/krawl/blob/main/config.yaml) для расширенных конфигураций, например для развёртываний через Docker Compose или Helm chart.
### Конфигурация через переменные окружения
Все настройки могут быть заданы в виде переменных окружения, которые переопределяют `config.yaml`.
Имя переменной — это `KRAWL_` плюс путь настройки в верхнем регистре, поэтому `dashboard.password`
становится `KRAWL_DASHBOARD_PASSWORD`.
<details>
<summary><b>Сервер и генерация ссылок</b> (11 переменных)</summary>
Как Krawl представляет себя и формирует лабиринт генерируемых страниц.
| Переменная окружения | Описание | По умолчанию |
|----------------------|-------------|---------|
| `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_PROBABILITY_ERROR_CODES` | Вероятность ответа с ошибкой (0-100%) | `0` |
| `KRAWL_INFINITE_PAGES_FOR_MALICIOUS` | Отдавать бесконечные страницы вредоносным IP | `true` |
| `KRAWL_MAX_PAGES_LIMIT` | Максимальный лимит страниц для краулеров | `250` |
| `KRAWL_BAN_DURATION_SECONDS` | Длительность бана в секундах для IP с превышением лимита запросов | `600` |
</details>
<details>
<summary><b>Дашборд, метрики и логирование</b> (13 переменных)</summary>
Доступ к дашборду, прогрев кэша, Prometheus и уровень логирования.
| Переменная окружения | Описание | По умолчанию |
|----------------------|-------------|---------|
| `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` | Минимальное количество обращений для панелей top paths/user agents (установите 1, чтобы отключить) | `5` |
| `KRAWL_DASHBOARD_BRAND_NAME` | Имя в логотипе и заголовке дашборда | `Krawl` |
| `KRAWL_DASHBOARD_BRAND_URL` | Куда ведёт ссылка с логотипа (пустое значение отображает его как обычный текст) | Репозиторий Krawl |
| `KRAWL_DASHBOARD_BRAND_LOGO` | URL изображения, отображаемого вместо значка GitHub | Не задано |
| `KRAWL_DASHBOARD_BRAND_SHOW_VERSION` | Показывать версию рядом с именем | `true` |
| `KRAWL_DASHBOARD_BRAND_CONTACT` | Контакт, отображаемый под логотипом (адрес, URL или обычный текст) | Не задано |
| `KRAWL_METRICS_ENABLED` | Открывать метрики Prometheus по адресу `/<dashboard_path>/metrics` | `true` |
| `KRAWL_LOG_LEVEL` | Уровень логирования приложения (`DEBUG`, `INFO`, `WARNING`, `ERROR`) | `INFO` |
</details>
<details>
<summary><b>База данных, хранение и резервные копии</b> (12 переменных)</summary>
Расположение хранилища, как долго хранятся данные и задача дампа.
| Переменная окружения | Описание | По умолчанию |
|----------------------|-------------|---------|
| `KRAWL_DATABASE_PATH` | Расположение файла базы данных | `data/krawl.db` |
| `KRAWL_DATABASE_PERSIST_SUSPICIOUS_ONLY` | Сохранять в журнал доступа только подозрительные запросы | `false` |
| `KRAWL_MAP_TILE_URL` | Шаблон URL тайлов для карты дашборда (`{z}/{x}/{y}`, опционально `{s}`/`{r}`) | Esri dark canvas |
| `KRAWL_MAP_TILE_ATTRIBUTION` | Атрибуция, отображаемая на карте | Esri/OSM |
| `KRAWL_MAP_API_KEY` | Добавляется к каждому запросу тайла как параметр запроса — требуется CARTO | _(пусто)_ |
| `KRAWL_MAP_API_KEY_PARAM` | Имя этого параметра запроса (`api_key`, `apikey`, `key`) | `api_key` |
| `KRAWL_IPV6_IGNORE` | Полностью отбрасывать запросы IPv6: всё равно логируются в stdout, никогда не сохраняются, не проверяются на бан и не экспортируются | `false` |
| `KRAWL_IPV6_PURGE_EXISTING` | Также удалять существующие строки IPv6 при следующем запуске (необратимо; требует `KRAWL_IPV6_IGNORE`) | `false` |
| `KRAWL_DATABASE_RETENTION_DAYS` | Количество дней хранения данных в базе данных | `30` |
| `KRAWL_BACKUPS_PATH` | Путь, куда сохраняются дампы базы данных | `backups` |
| `KRAWL_BACKUPS_CRON` | cron-выражение для управления расписанием задачи резервного копирования | `*/30 * * * *` |
| `KRAWL_BACKUPS_ENABLED` | Логическое значение для включения задачи дампа базы данных | `true` |
</details>
<details>
<summary><b>Ловушки: tarpit, страницы-обманки и canary</b> (6 переменных)</summary>
Опциональные ловушки и страницы, отдаваемые атакующим.
| Переменная окружения | Описание | По умолчанию |
|----------------------|-------------|---------|
| `KRAWL_TARPIT_ENABLED` | Ловить AI-агентов медленными ответами и случайным текстом | `false` |
| `KRAWL_TARPIT_DELAY_SECONDS` | Дополнительная задержка в секундах, добавляемая к каждому ответу при активном tarpit | `5` |
| `KRAWL_DECEPTION_IMPORT_PAGES` | Автоматически импортировать страницы-обманки из `src/templates/deception/` при запуске | `true` |
| `KRAWL_CUSTOM_TEMPLATE_PATH` | Путь внутри контейнера к пользовательскому HTML-шаблону. Шаблон должен содержать плейсхолдеры `{counter}` и `{content}`. | `/templates/custom_page.html` |
| `KRAWL_CANARY_TOKEN_URL` | URL внешнего canary-токена | Нет |
| `KRAWL_CANARY_TOKEN_TRIES` | Количество запросов до показа canary-токена | `10` |
</details>
<details>
<summary><b>Анализатор репутации IP</b> (6 переменных)</summary>
Пороги, определяющие классификацию IP.
| Переменная окружения | Описание | По умолчанию |
|----------------------|-------------|---------|
| `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` |
</details>
<details>
<summary><b>Сбор threat-intel</b> (4 переменные)</summary>
Нечёткое хеширование захваченных полезных нагрузок (файлов и помеченных телом запросов) и группировка
почти идентичных вариантов в кластеры кампаний. Требуется `py-tlsh`.
Хеширование выполняется как запланированная фоновая задача `hash-payloads` (см.
`src/tasks/hash_payloads.py`), которая хеширует каждую захваченную атаку один раз — новые
попадания во время приёма и однократный обратный проход по существующей истории,
отслеживаемый высоководной отметкой `payload_hash_watermark` — затем кластеризует
дайджесты в кампании повторяющихся паттернов.
| Переменная окружения | Описание | По умолчанию |
|----------------------|-------------|---------|
| `KRAWL_TLSH_ENABLED` | Хешировать загруженные файлы и помеченные тела запросов с помощью TLSH для кластеризации почти идентичных | `true` |
| `KRAWL_TLSH_CLUSTER_THRESHOLD` | Расстояние TLSH, ниже которого полезная нагрузка присоединяется к существующей кампании (0 = идентичные байты; варианты веб-шелла обычно различаются < 100) | `150` |
| `KRAWL_TLSH_CAMPAIGN_MIN_EVENTS` | Сколько раз должна встретиться полезная нагрузка, прежде чем её кампания появится на вкладке Threats | `10` |
| `KRAWL_REFERER_ENABLED` | Записывать входящий HTTP Referer в журналах доступа для отслеживания цепочек приманок | `true` |
</details>
<details>
<summary><b>Банлист и игнорируемые IP</b> (4 переменные)</summary>
Обмен банлистами с другими экземплярами и трафик, который никогда не отслеживается.
```
---
[Read more](https://github.com/blessedrebus/krawl)