
مستشعر شبكة Spip مكتوب بلغة Go
سباي هو مستشعر هونيبوت شبكة خفيف الوزن ومنخفض التفاعل. يستمع إلى حركة مرور TCP الواردة العشوائية (نصية وTLS)، ويلتقط ما يرسله الماسحون والروبوتات، ويسجل كل اتصال بصيغة JSON منظمة (مشكلة وفق ECS) لسهولة الاستيعاب في نظام SIEM أو بحيرة البيانات لديك.
تشغل مستشعرات سباي HoneyLabs، وهي منصة استخبارات تهديدات مجانية وقابلة للاستعلام مبنية على البيانات التي تلتقطها. لرؤية ما يجمعه سباي عملياً، تصفح التقارير المباشرة لكل عنوان IP هناك أو تقرير التهديد الأسبوعي الذي يتم إنشاؤه من شبكة المستشعرات.

المتطلبات الأساسية
iptablesgit clone https://github.com/honeylabshq/Spip-Go.git
cd Spip-Go
go build -o spip-agent ./cmd/spip-agent
sudo ./scripts/initial_setup.sh
يكتب هذا المساعد ملف config.toml (يطلب اسماً قصيراً name يُستخدم في السجلات)، ويمكنه إنشاء مفاتيح TLS موقعة ذاتياً، ويقوم اختيارياً بتكوين لوم (URL, sensor_id, token, إلخ)، ويطبق اختيارياً إعادة توجيه iptables PREROUTING المستخدمة في الأمثلة أدناه.
config.toml
ملف config.toml الأدنى:name = "spip-agent"
ip = "127.0.0.1"
port = 8080
مفاتيح التهيئة الاختيارية:
cert_path / key_path — تمكين TLS في حال تعيين كليهما؛ قد يكونان نسبيين بالنسبة لملف التهيئة (يكتب سكريبت الإعداد مسارات نسبية بحيث يعمل التهيئة من أي دليل عمل)log_file (محلي) و/أو [loom] (عن بُعد). راجع إخراج السجل أدناه.read_timeout_seconds / write_timeout_seconds — مهلات الاتصالrate_limit_per_second / rate_limit_burst — تحديد معدل الاتصالcommunity_id_seed — بذرة اختيارية بطول 16 بت لتجزئة Community ID v1 للتدفق (احذفها أو اضبطها على 0 للافتراضي)إذا تم حذف هذه الحقول أو ضبطها على 0، يطبق سباي القيم الافتراضية التالية:
read_timeout_seconds: 30write_timeout_seconds: 10rate_limit_per_second: 20rate_limit_burst: 50000sudo iptables -t nat -F
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j RETURN
sudo iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port 8080
./spip-agent -config config.toml
يكتب سباي سجلات ECS إلى وجهة محلية واحدة ويمكنه اختيارياً إرسال نفس السجلات إلى خادم لوم:
إذن: المحلي افتراضياً هو الإخراج القياسي؛ استبدله بـ log_file لملف. اختيارياً أضف لوم في الأعلى. كلاهما يستخدم نفس تنسيق ECS.
log_file معلقاً/فارغاً (الإخراج القياسي) أو اضبطه على مسار.[loom] مع url و sensor_id و token (راجع لوم أدناه).يصدر سباي كل اتصال ككائن JSON واحد. تم تنسيق الإخراج ليكون متوافقاً مع ECS باستخدام الحقول التي يمكن لسباي توفيرها فقط (بدون إثراء ASN/جغرافي). تشمل الحقول النموذجية المنتجة:
@timestamp — طابع زمني RFC3339 للحدثevent.id — معرف جلسة لكل اتصالobserver.hostname / host.name — اسم name للوكيل من التهيئةsource.ip, source.port و destination.ip, destination.portnetwork.transport — مثال tcphttp.request.body / url.path — عندما يشبه الحمولة HTTP بوضوحuser_agent.original — عندما يكون متاحاًمثال لسجل (مشكل وفق ECS) منتج بواسطة سباي:
{
"@timestamp": "2025-12-01T19:35:18.123Z",
"event": {
"id": "bd30cdc1-95b0-49aa-b8fe-e77230b6a04f",
"summary": "BitTorrent protocol",
"original_payload_hex": "426974546f7272656e742070726f746f636f6c",
"ingested_by": "spip"
},
"observer": {"hostname": "spip-agent"},
"host": {"name": "spip-agent"},
"source": {"ip": "146.70.1.1", "port": 35882},
"destination": {"ip": "146.190.1.1", "port": 6881},
"network": {"transport": "tcp"}
}
ملاحظة: يصدر الوكيل فقط الحقول التي يمكنه اشتقاقها من حمولة الاتصال والبيانات الوصفية. يمكن للأنظمة النهائية إثراء هذه السجلات (جغرافي، ASN، إلخ) إذا رغبت.
يمكن لسباي إضافة حقول بصمات سلبية إلى كل سجل اتصال (متوافقة مع ECS، دون تغيير في التقاط الحمولة):
network.community_id) — تجزئة تدفق v1 للخماسي (عنوان IP المصدر والوجهة والمنفذ والبروتوكول). عند إعادة توجيه حركة المرور عبر iptables، يستخدم سباي الوجهة الأصلية (قبل REDIRECT) بحيث تتطابق التجزئة مع ما ستحسبه أدوات أخرى (مثل Zeek, Suricata) لنفس التدفق.tls.client.server_name (SNI), tls.client.supported_protocols (قائمة ALPN), tls.client.hash.ja4 (بصمة JA4).http.request.hash.ja4h (JA4H).SSH-2.0- وتحتوي على KEXINIT: ssh.client.hash.hassh (Hassh).كل هذه إضافية؛ السلوك الحالي (السجل المحلي، لوم، الست عشري للحمولة، تحليل HTTP) لم يتغير.
المراجع (للتحقق والإسناد):
Community ID: مواصفات Corelight Community ID.
JA4 / JA4H: FoxIO JA4.
Hassh: Salesforce HASSH.
بصمات TLS باستخدام github.com/psanford/tlsfingerprint (MIT).
جزء من إخراج السجل: عندما يكون [loom] به enabled = true، يتم أيضاً تجميع نفس سجلات ECS وإرسالها عبر POST إلى رابط إدخال لوم الخاص بك. المطلوب عند التمكين: url, sensor_id, token. اختياري: batch_size (الافتراضي 50)، flush_interval (مثال "10s")، insecure_skip_verify (لشهادات لوم الموقعة ذاتياً). يعمل المُصدر بشكل غير متزامن ولا يحجب حلقة الالتقاط؛ يتم تسجيل POSTs الفاشلة إلى stderr ويتم إسقاط الدفعة (فشل مفتوح).
.
├── cmd/ # نقطة دخول التطبيق الرئيسية
├── internal/ # التهيئة، التسجيل، الشبكة، TLS، البصمات، المُصدرين (مثال لوم)
├── pkg/ # أدوات مآخذ لينكس المساعدة (SO_ORIGINAL_DST عبر syscall)
├── test/ # أدوات اختبار شاملة
└── scripts/ # سكريبتات مساعدة (بما في ذلك `initial_setup.sh`)
قم بتشغيل اختبارات الوحدة باستخدام:
go test ./...
اختبارات شاملة تتطلب صلاحيات للتعامل مع iptables. قم بتشغيلها عبر السكريبت (من جذر المستودع):
sudo -E ./scripts/run_e2e_tests.sh
يقوم السكريبت بإعداد البيئة و iptables. بدلاً من ذلك استخدم مساعد الحاوية: ./scripts/run_e2e_in_container.sh. تتحقق الاختبارات الشاملة من السلوك الأساسي (التقاط الحمولة، المصدر/الوجهة، كشف TLS، تجميع لوم، البصمات).
يقوم سباي بكشف طلبات HTTP بأفضل جهد من الحمولة الملتقطة. عندما تشبه الحمولة طلب HTTP بوضوح (سطر طلب صالح مع رؤوس أساسية أو ALPN)، يصدر الوكيل حقول http.* و url.path و user_agent.original. عندما لا يكون الأمر كذلك، يتراجع سباي إلى تخزين الحمولة في event.summary ويحافظ دائماً على الست عشري للحمولة الخام في event.original_payload_hex.
نظراً لأن سباي يعكس عنوان IP المصدر في استجاباته ويقبل حركة مرور TCP الواردة العشوائية، فهو مخصص للاستخدام كمستشعر شبكة من نوع هونيبوت أو جامع طرفي في بيئات خاضعة للرقابة/مراقبة، وليس على نقاط نهاية مستخدم عشوائية.
قم بتشغيل المساعد التفاعلي من جذر المستودع (يتطلب صلاحية الجذر عند تطبيق قواعد iptables):
sudo ./scripts/initial_setup.sh
يطلب السكريبت: اسماً قصيراً name (يكتب في config.toml، يُستخدم في السجلات بـ observer.hostname / host.name)، عنوان IP ومنفذ الاستماع، إنشاء شهادة TLS موقعة ذاتياً اختيارياً (تُكتب المسارات نسبياً بالنسبة للتهيئة بحيث تعمل من أي دليل)، تكوين لوم اختياري (URL, sensor_id, token, batch_size, flush_interval, TLS verify)، مسار ملف السجل، وإعادة توجيه iptables PREROUTING اختيارية.
| الوجهة |
|---|
| التهيئة |
|---|
| السلوك |
|---|
| محلي | log_file | الافتراضي: احذف أو اترك فارغاً → الإخراج القياسي. اضبط على مسار → ذلك الملف. واحد منهما، دائماً قيد التشغيل. |
| لوم | [loom] مع enabled = true | اختياري. يتم تجميع نفس الأحداث وإرسالها عبر POST إلى رابط إدخال لوم الخاص بك بالإضافة إلى المحلي. |
event.summary — الحمولة الخام لفحوصات غير HTTPevent.original_payload_hex — الحمولة الخام بصيغة ست عشرية (محفوظة دائماً)network.community_id, tls.client.*, http.request.hash.ja4h, ssh.client.hash.hassh عند الاقتضاء.