
Автономный SSH-хоніпот для перехоплення взаємодій атакуючих і перетворення їх на структуровану розвідку з кібербезпеки.
SSHintel — это легковесный SSH-ханипот, созданный на Python с использованием Paramiko. Он имитирует фальшивую оболочку Linux для регистрации несанкционированных попыток доступа, перехвата учётных данных и анализа поведения злоумышленников в контролируемой среде.
ls, cd, pwd, cat, echo, grep, find, tree, head, tail, wc, stat, ps, df, free, env, id, whoami и др.)--tarpit для замедления злоумышленников с помощью задержки выводаSSHintel — это не полноценная оболочка Bash/Linux. Он имитирует правдоподобное подмножество распространённых команд для сбора телеметрии о злоумышленнике. Команды обрабатываются через легковесный реестр; добавление команды означает добавление небольшой функции-обработчика.
pip install -r requirements.txt
Примечание: Ключ хоста SSH генерируется автоматически при первом запуске. Ручная генерация ключа не требуется.
Запустите ханипот с указанием конкретного порта, имени пользователя и пароля:
python3 run.py serve --port 2222 --username user1 --password pass123
Порт по умолчанию —
2222, хост —0.0.0.0.
При первом запуске honeypot автоматически генерирует ключ хоста SSH в static/server.key, если он не существует. Ручная генерация ключа не требуется.
Чтобы включить режим tarpit:
python3 run.py serve --port 2222 --username user1 --password pass123 --tarpit
Чтобы отключить телеметрию SQLite (только JSONL):
python3 run.py serve --port 2222 --username user1 --password pass123 --no-db
Настройки датчика используют порядок CLI > окружение > файл конфигурации > значения по умолчанию.
Только явно переданные флаги CLI переопределяют другие источники. Это относится к
serve; команды панели управления/запросов сохраняют свои собственные настройки CLI.
В Python 3.11+:
cp sshintel.toml.example sshintel.toml
chmod 600 sshintel.toml
python3 run.py serve
В Python 3.8/3.10 используйте эквивалент JSON без зависимостей:
cp sshintel.json.example sshintel.json
chmod 600 sshintel.json
python3 run.py serve
Отредактируйте скопированный файл перед развёртыванием. TOML требует Python 3.11+; в более старых
версиях возникает ошибка с чётким указанием использовать JSON. Если файл явно не задан,
SSHintel ищет sshintel.toml, затем sshintel.json в текущем каталоге.
Используйте serve --config /path/to/settings.json или HONEYPOT_CONFIG, чтобы выбрать другой
файл (приоритет у --config). Явно указанные отсутствующие файлы, файлы с ошибками формата, неизвестные ключи
и недопустимые значения приводят к ошибке до запуска сервера или базы данных. Пути к файлам внутри
конфигурации задаются относительно рабочего каталога процесса, а не файла конфигурации.
| Ключ файла | Переменная окружения | Значение по умолчанию |
|---|---|---|
host | HONEYPOT_HOST | 0.0.0.0 |
port | HONEYPOT_PORT (устаревший псевдоним: PORT) | 2222 |
username | HONEYPOT_USERNAME | user1 |
password | HONEYPOT_PASSWORD | pass123 |
tarpit | HONEYPOT_TARPIT | false |
tarpit_max_seconds | HONEYPOT_TARPIT_MAX_SECONDS | 120 |
max_connections | HONEYPOT_MAX_CONNECTIONS | 50 |
auth_timeout | HONEYPOT_AUTH_TIMEOUT | 60 |
session_idle_timeout | HONEYPOT_SESSION_IDLE_TIMEOUT | 300 |
sensor_id | HONEYPOT_SENSOR_ID | не задано |
db_path | HONEYPOT_DB_PATH | data/sshintel.db |
no_db | HONEYPOT_NO_DB | false |
fetch_payloads | HONEYPOT_FETCH_PAYLOADS | false (зарезервировано) |
Булевы значения в переменных окружения принимают true/false, 1/0, yes/no и on/off.
HONEYPOT_PORT имеет приоритет над PORT. Порты должны быть в диапазоне 1–65535, а лимиты
и тайм-ауты должны быть положительными целыми числами. Используйте --no-tarpit, --db-enabled или
--no-fetch-payloads, чтобы переопределить значение true из настройки с более низким приоритетом. Пути к базе данных
задаются существующим флагом CLI --db. Загрузка полезной нагрузки не реализована: включение
fetch_payloads отклоняется, а не игнорируется молча.
Локальные файлы sshintel.toml/sshintel.json игнорируются Git и исключаются из сборок Docker,
поскольку могут содержать учётные данные. Вместо этого смонтируйте файл конфигурации в контейнер
только для чтения. Docker использует переменные окружения напрямую (без
подстановки учётных данных через оболочку); его существующие значения по умолчанию ENV имеют приоритет над
смонтированным файлом. Переопределяйте эти переменные по мере необходимости или используйте явные флаги CLI.
SSHintel защищает от исчерпания ресурсов из-за множества одновременных подключений или подключений, удерживаемых бесконечно. Их можно настроить через CLI:
| Флаг | По умолчанию | Назначение |
|---|---|---|
--max-connections | 50 | Максимальное число одновременных активных подключений; лишние подключения отклоняются и регистрируются как событие connection_rejected |
--auth-timeout | 60 (с) | Время, отведённое на завершение SSH-рукопожатия/аутентификации; зависшие клиенты отключаются |
--session-idle-timeout | 300 (с) | Тайм-аут неактивности для аутентифицированной оболочки; неактивная сессия завершается, но активно печатающий атакующий никогда не отключается |
Пример:
python3 run.py serve --port 2222 --username user1 --password pass123 \
--max-connections 25 --auth-timeout 30 --session-idle-timeout 300
Когда открыто слишком много соединений, лишнее соединение немедленно закрывается, а в журнал JSONL записывается событие безопасности connection_rejected (с reason: connection_limit). Зависшая аутентификация фиксируется как отключение с reason: auth_timeout; простаивающая оболочка завершается с reason: idle_timeout.
Режим tarpit намеренно отправляет вывод медленно, чтобы удерживать атакующего, поэтому цикл баннера tarpit не подпадает под тайм-аут неактивности — но сессии tarpit учитываются в лимите соединений.
SSHintel включает локальную веб-панель, которая визуализирует телеметрию безопасности, хранящуюся в SQLite.
python3 run.py dashboard
Затем откройте http://localhost:5000 в браузере.
По умолчанию панель управления читает данные из базы данных SQLite по пути
data/sshintel.db. Сначала запустите honeypot, чтобы начался сбор телеметрии, а затем запустите панель управления, чтобы наблюдать за её наполнением.