
مسجل DNS سلبي قائم على الشبكة يلتقط ويسجل استعلامات DNS من حركة المرور الحية أو ملفات pcap، ويُخرج بيانات بصيغة JSON للتكامل مع منصات SIEM ومنصات استخبارات التهديدات.
تسجيل DNS المعتمد على الشبكة بلغة Go
مسجّل DNS يعتمد على التقاط الشبكة، مستوحى من https://github.com/gamelinux/passivedns. يستخدم gopacket للتعامل مع libpcap ومعالجة الحزم. يُخرج سجلات بصيغة JSON. صُمّم للتعامل مع التقاط الاستعلامات عالية الحجم في بيئات تحتوي على عدد يتراوح بين خادم تحليل واحد ومئات.
إنه خيار جيد. بنيت هذه الأداة لأنني أعتقد أن المهام التي تتضمن معالجة كميات كبيرة من البيانات غير الموثوقة مع العديد من الحالات الطرفية غير الموثقة جيدًا يجب أن تُدار بواسطة بيئة تشغيل مدارة لمنع هجمات تلف الذاكرة. لقد قمت بنشر PassiveDNS في عدة مؤسسات، وقمت ببناء gopassivedns لحل بعض المشكلات المحددة التي لاحظتها: كنت بحاجة إلى تجهيز عدد كبير من المواقع، وكنت بحاجة إلى توسيع نطاق طبقة التخزين للتعامل مع عدد كبير جدًا من الاستعلامات، وأردت مجموعة اختبارات بتغطية جيدة لجميع الحالات الطرفية لـ DNS.
هذا أيضًا خيار جيد. عادةً ما تُنشر أنظمة مثل Bro على مخارج الشبكة، مما يؤدي إلى إخفاء المصدر الحقيقي للاستعلام خلف خوادم التحليل التكراري. وهذا يعني أنك تحتاج عمومًا إلى نشر Bro مع تسجيل استعلامات الخادم التحليلي (إذا كنت تستطيع)، ثم دمج السجلات من كليهما في نظام تسجيل مركزي لتتبع الاستعلام إلى العميل. صُمّم gopassivedns ليُنشر على خوادم التحليل لديك دون تغيير إعدادات الخادم التحليلي و/أو على مخارج الشبكة، لتسجيل مركزي عبر بروتوكول موثوق وتحليل بسيط في أي نظام سجلات.
دعم خوادم التحليل لتسجيل الاستعلامات، بما في ذلك السؤال والإجابة، متفاوت في أحسن الأحوال. أحد أكثر خوادم DNS انتشارًا، BIND، لا يدعمه على الإطلاق. البعض الآخر، مثل Windows DNS، لديه تنسيقات سجلات سيئة للغاية. بالإضافة إلى ذلك، فإن التسجيل المعتمد على الشبكة سيلتقط الاستعلامات المرسلة مباشرة إلى الخوادم البعيدة (مثل Google DNS) من عملائك.
يمكن تحديد خيارات التكوين كمتغيرات بيئية، أو في ملف .env، أو عبر سطر الأوامر. الأولوية هي معلمات سطر الأوامر، ثم ملف .env، ثم المتغيرات المحددة بالفعل في البيئة. خيارات التكوين كالتالي:
يجب عليك تقديم إما -dev أو -pcap.
توجد مشكلات معروفة مع goroutines وعملية التحويل إلى خدمة خلفية القياسية (https://github.com/golang/go/issues/227)، لذا أوصي بشدة باستخدام إحدى الطرق الموضحة هنا: http://stackoverflow.com/questions/10067295/how-to-start-a-go-program-as-a-daemon-in-ubuntu لتشغيل هذه العملية كخدمة خلفية باستخدام أدوات النظام.
إذا اخترت استخدام تسجيل syslog، فإننا نستخدم "log/syslog" من Go والذي يتطلب وجود مقبس يونكس للتواصل مع syslog في أحد المسارات /dev/log أو /var/run/log أو /var/run/syslog.
لديك 3 خيارات: انشرها على خادم (خوادم) التحليل لديك، أو على بوابة (بوابات) الشبكة لديك، أو كليهما. النشر على خوادم التحليل مفيد لأنك ستحصل على عنوان IP الخاص بالعميل الذي أرسل الطلب الأصلي. يمكنك أيضًا رؤية الساق الصاعدة للطلب (من الخادم التحليلي إلى الخادم التالي في السلسلة)، ما لم تضبط مرشح BPF الخاص بك لتجاهل تلك الساق. النشر على البوابات يعني أنك لا ترى الساق من العميل إلى الخادم التحليلي الداخلي، لذا قد يكون من الصعب ربط الطلب بعميل معين. من ناحية أخرى، سترى الطلبات التي تتجاوز خوادم التحليل الداخلية. سترى أيضًا بالطبع الاستعلامات القادمة من الخادم التحليلي إلى أي خادم تحليل علوي يستخدمه. في عالم مثالي، سأنشر هذه الأداة على كل خادم تحليل داخلي لدي وعلى نقطة تجسس على بواباتي. سيكون لخوادم التحليل الداخلية مرشح BPF يتجاهل الساق الصاعدة للاستعلام، ولن تتجاهل البوابة أي شيء.
حاليًا، أوصي باستخدام logstash لنقل السجلات إلى مجموعة elasticsearch. جميع السجلات بصيغة JSON، لذا سيكون هذا سهلاً جدًا. أقترح أيضًا استخدام شيء مثل HDFS للتخزين طويل المدى والتحليل الجماعي. استعلامات DNS هي مصدر مذهل للبيانات الداخلية!