
Honeypot SSH autonome permettant de capturer les interactions des attaquants et de les transformer en renseignements de sécurité structurés.
SSHintel est un honeypot SSH léger construit avec Python et Paramiko. Il simule un faux shell Linux pour journaliser les tentatives d'accès non autorisées, capturer les identifiants et analyser le comportement des attaquants dans un environnement contrôlé.
ls, cd, pwd, cat, echo, grep, find, tree, head, tail, wc, stat, ps, df, free, env, id, whoami, etc.)--tarpit optionnel pour ralentir les attaquants avec une sortie différéeSSHintel n'est pas un shell Bash/Linux complet. Il simule un sous-ensemble crédible de commandes courantes afin de recueillir la télémétrie des attaquants. Les commandes sont distribuées par un registre léger ; ajouter une commande revient à ajouter une petite fonction de gestion.
pip install -r requirements.txt
Remarque : La clé d'hôte SSH est générée automatiquement au premier lancement. Aucune génération manuelle de clé n'est nécessaire.
Lancez le honeypot avec un port, un nom d'utilisateur et un mot de passe spécifiques :
python3 run.py serve --port 2222 --username user1 --password pass123
Le port par défaut est
2222et l'hôte est0.0.0.0.
Le honeypot génère automatiquement une clé d'hôte SSH dans static/server.key au premier lancement si elle n'existe pas. Aucune génération manuelle de clé n'est nécessaire.
Pour activer le mode tarpit :
python3 run.py serve --port 2222 --username user1 --password pass123 --tarpit
Pour désactiver la télémétrie SQLite (JSONL uniquement) :
python3 run.py serve --port 2222 --username user1 --password pass123 --no-db
Les paramètres du capteur suivent l'ordre CLI > environnement > fichier de configuration > valeurs par défaut.
Seuls les indicateurs CLI explicitement fournis remplacent les autres sources. Cela s'applique à
serve ; les commandes dashboard/query conservent leurs propres paramètres CLI.
Sur Python 3.11+ :
cp sshintel.toml.example sshintel.toml
chmod 600 sshintel.toml
python3 run.py serve
Sur Python 3.8/3.10, utilisez l'équivalent JSON sans dépendance :
cp sshintel.json.example sshintel.json
chmod 600 sshintel.json
python3 run.py serve
Modifiez le fichier copié avant le déploiement. TOML nécessite Python 3.11+ ; les
versions plus anciennes échouent avec une instruction claire d'utiliser JSON. Sans fichier
explicite, SSHintel recherche sshintel.toml, puis sshintel.json dans le répertoire courant.
Utilisez serve --config /path/to/settings.json ou HONEYPOT_CONFIG pour sélectionner un autre
fichier (--config est prioritaire). Les fichiers explicitement manquants, les fichiers malformés, les clés inconnues
et les valeurs invalides échouent avant le démarrage du serveur ou de la base de données. Les chemins de fichiers dans
la configuration sont relatifs au répertoire de travail du processus, et non au fichier de configuration.
| Clé de fichier | Variable d'environnement | Valeur par défaut |
|---|---|---|
host | HONEYPOT_HOST | 0.0.0.0 |
port | HONEYPOT_PORT (alias hérité : 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 | non défini |
db_path | HONEYPOT_DB_PATH | data/sshintel.db |
no_db | HONEYPOT_NO_DB | false |
fetch_payloads | HONEYPOT_FETCH_PAYLOADS | false (réservé) |
Les booléens d'environnement acceptent true/false, 1/0, yes/no et on/off.
HONEYPOT_PORT est prioritaire sur PORT. Les ports doivent être compris entre 1 et 65535, et les limites
et délais d'expiration doivent être des entiers positifs. Utilisez --no-tarpit, --db-enabled ou
--no-fetch-payloads pour remplacer un paramètre true de priorité inférieure. Les chemins de base de données
utilisent l'option CLI existante --db. La récupération de payloads n'est pas implémentée : activer
fetch_payloads est rejeté plutôt que silencieusement ignoré.
Les fichiers locaux sshintel.toml/sshintel.json sont ignorés par Git et exclus des builds Docker
car ils peuvent contenir des identifiants. Montez plutôt un fichier de configuration en lecture seule
dans un conteneur. Docker consomme directement les variables d'environnement (sans
interpolation shell des identifiants) ; ses valeurs ENV par défaut existantes sont prioritaires sur
un fichier monté. Remplacez ces variables selon les besoins ou utilisez des options CLI explicites.
SSHintel se protège contre l'épuisement des ressources dû à de nombreuses connexions simultanées ou à des connexions maintenues actives indéfiniment. Ces paramètres sont configurables via la CLI :
| Option | Valeur par défaut | Objectif |
|---|---|---|
--max-connections | 50 | Nombre maximal de connexions actives simultanées ; les connexions supplémentaires sont rejetées et journalisées comme un événement connection_rejected |
--auth-timeout | 60 (s) | Temps accordé pour terminer la poignée de main/authentification SSH ; les clients bloqués sont déconnectés |
--session-idle-timeout | 300 (s) | Délai d'inactivité pour un shell authentifié ; une session inactive est terminée, mais un attaquant en train de taper activement n'est jamais tué |
Exemple :
python3 run.py serve --port 2222 --username user1 --password pass123 \
--max-connections 25 --auth-timeout 30 --session-idle-timeout 300
Lorsque trop de connexions sont ouvertes, la connexion supplémentaire est fermée immédiatement et un événement de sécurité connection_rejected (avec reason: connection_limit) est écrit dans le journal JSONL. Une authentification bloquée est enregistrée comme une déconnexion avec reason: auth_timeout ; un shell inactif se termine avec reason: idle_timeout.
Le mode tarpit envoie intentionnellement la sortie lentement pour maintenir un attaquant engagé, de sorte que la boucle de bannière du tarpit n'est pas soumise au délai d'inactivité — mais les sessions tarpit sont prises en compte dans la limite de connexions.
SSHintel inclut un tableau de bord web local qui visualise la télémétrie de sécurité stockée dans SQLite.