
مستودع 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 > environment > configuration file > defaults.
فقط أعلام 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 الإصدار 3.11+ من Python؛ وتفشل الإصدارات الأقدم مع تعليمات واضحة لاستخدام 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 لتجاوز إعداد صحيح ذي أولوية أدنى. تستخدم مسارات قاعدة البيانات علامة --db الحالية في سطر الأوامر. جلب الحمولات غير مُنفَّذ: يُرفض تفعيل fetch_payloads بدلًا من تجاهله بصمت.
تُستثنى ملفات sshintel.toml/sshintel.json المحلية من Git ومن عمليات بناء Docker لأنها قد تحتوي على بيانات اعتماد. بدلًا من ذلك، اربط ملف إعدادات للقراءة فقط داخل حاوية. تستهلك Docker متغيرات البيئة مباشرةً (دون إجراء استبدال shell لبيانات الاعتماد)؛ وتأخذ قيم ENV الافتراضية الحالية الأولوية على ملف مربوط. تجاوز تلك المتغيرات حسب الحاجة أو استخدم علامات CLI صريحة.
يحمي SSHintel من استنزاف الموارد الناتج عن كثرة الاتصالات المتزامنة أو الاتصالات التي تبقى نشطة إلى أجل غير مسمى. ويمكن ضبط هذه عبر CLI:
| العلامة | الافتراضي | الغرض |
|---|---|---|
--max-connections | 50 | الحد الأقصى للاتصالات النشطة المتزامنة؛ تُرفض الاتصالات الإضافية وتُسجَّل كحدث connection_rejected |
--auth-timeout | 60 (ث) | الوقت المسموح لإكمال مصافحة SSH/المصادقة؛ تُفصل العملاء المتوقفة |
--session-idle-timeout | 300 (ث) | مهلة الخمول لجلسة shell مصادَق عليها؛ تُنهى الجلسة الخاملة، لكن المهاجم الذي يكتب بنشاط لا يُقتل أبدًا |
مثال:
python3 run.py serve --port 2222 --username user1 --password pass123 \
--max-connections 25 --auth-timeout 30 --session-idle-timeout 300
عندما تكون اتصالات كثيرة مفتوحة، يُغلق الاتصال الإضافي فورًا وتُكتب حادثة أمنية connection_rejected (مع reason: connection_limit) في سجل JSONL. تُسجَّل المصادقة المتوقفة كقطع اتصال مع reason: auth_timeout؛ وتنتهي الصدفة الخاملة بـ reason: idle_timeout.
يرسل وضع Tarpit المخرجات ببطء عمدًا لإبقاء المهاجم منشغلًا، لذا لا تخضع حلقة لافتة tarpit لمهلة الخمول — لكن جلسات tarpit تُحتسب ضمن حد الاتصالات.
تتضمن SSHinteL لوحة معلومات ويب محلية تعرض القياسات الأمنية المخزنة في SQLite.
python3 run.py dashboard
ثم افتح http://localhost:5000 في متصفحك.
تقرأ لوحة المعلومات من قاعدة بيانات SQLite الموجودة في
data/sshintel.dbافتراضيًا. ابدأ تشغيل المصيدة أولًا حتى يتم التقاط البيانات التليمترية، ثم شغّل لوحة المعلومات لمشاهدتها وهي تُملأ.
انقر على معرّف جلسة (أو انتقل إلى /session/<session_id>) لفتح عرض التحقيق في الجلسة، الذي يعيد بناء هجوم واحد بترتيب زمني:
$ command لكل ما كتبه المهاجم، مع أدلة العمل# Terminal 1: start the honeypot
python3 run.py serve --port 2222 --username user1 --password pass123
# Terminal 2: start the dashboard
python3 run.py dashboard
# Terminal 3: simulate an attacker
ssh user1@localhost -p 2222
# (run some commands, then exit)
ثم افتح http://localhost:5000 لفحص النشاط المُلتقط.