
إطار عمل آلي وقابل للتكرار لاختبار أمن الشبكات باستخدام Ansible وBATS للتحقق من DNS، وتوفر المضيف، والمنافذ المفتوحة، وتكوين TLS من عدة نقاط مراقبة.
يستخدم هذا المشروع Ansible لإنشاء ملفات اختبار BATS للتحقق من افتراضات الأمان حول البنية التحتية للشبكة. يتم تشغيل الاختبارات من أجهزة الفحص ("عُقد الفاحص") حيث يتم نشر Prober.
هذه الأداة مخصصة للاختبار الآلي القابل للتكرار للشبكات الخاصة. تدعم تشغيل اختبارات متعددة على عُقد فاحصة، كل منها له رؤية مختلفة للشبكة المفحوصة — على سبيل المثال، رؤية من المنطقة الخارجية، ومن المنطقة الداخلية، ورؤية من داخل DMZ.
قد يكون استخدام Prober لفحص شبكات غير مخول لك أمرًا غير قانوني.
على جهاز Ansible الرئيسي المستخدم لنشر الاختبارات إلى عُقد الفاحص:
ansible (بالطبع!)python*-netaddr (على GNU/Linux) / py*-netaddr (على FreeBSD)على عُقد الفاحص نفسها:
bashsshnmapdig/kdigtestsslعلى النظام الذي تراجع فيه النتائج (ملفات *.tap)، قد ترغب في تثبيت tappy. يتم الاحتفاظ بالنتائج على كل عقدة فاحصة، في مستودعات git محلية (افتراضيًا، في /var/run/prober/results/، راجع أدناه لخيارات التهيئة)، مع علامات commits بتاريخ انتهاء كل جولة فحص، للسجل التاريخي وسهولة المقارنة.
يستخدم Ansible لإنشاء اختبارات على عُقد الفاحص. يمكن أن تكون عقدة الفاحص أي مضيف FreeBSD أو GNU/Linux، طالما أنه من الممكن تثبيت تبعيات Prober. لا يلزم تخصيصها للاختبار، لكن يُوصى بذلك — فمسح شبكة بحجم معقول سيستغرق ساعات، ويستهلك الكثير من وحدة المعالجة المركزية، ويُولِّد قدرًا كبيرًا من حركة المرور.
من المنطقي نشر Prober على عدد من الأجهزة المختلفة للتحقق من شكل شبكتك من وجهات نظر مختلفة (على سبيل المثال: الشبكة الداخلية، DMZ، الإنترنت).
في دليل الاختبار على عُقد الفاحص، يتم إنشاء سكريبت run-tests.sh لتسهيل تشغيل الاختبارات. يتم تشغيل الاختبارات بطريقة تضمن تشغيل <simultaneous_tests_count> اختبار في وقت واحد في جميع الأوقات — هذا المتغير هو الطريقة الرئيسية للتحكم في كمية الموارد التي يستخدمها مسح الفحص ومقدار النطاق الترددي الذي يحتاجه.
ثم يتم حفظ نتائج الاختبار في مستودع git محلي، مع علامات commits بتاريخ انتهاء الجولة المحددة (قد يختلف عن تاريخ البدء لبعض جولات الفحص الطويلة).
إذا كنت تتعامل مع بنية تحتية أكبر من مجرد عدد قليل من المضيفين، فقد يكون من المنطقي استخدام أداة مثل Mitogen لتسريع إنشاء الاختبارات بشكل كبير.
جهز خادم Debian أو FreeBSD لاستخدامه كعقدة فاحصة (لنسمها prober.example.com)، تأكد من أن لديك وصول SSH إليه ويمكنك تنفيذ sudo عليه.
انسخ مثال الجرد باسم inventories/test/.
في ذلك test inventory:
group_vars/all.yml واضبط zone_nameserver و zone_domains و address_blocks حسب رغبتك؛ لنفترض أنك أضفت example.com كالنطاق الوحيد الذي سيتم فحصهhosts، مهيئًا عقدة الفاحص prober.example.com في القسم [prober-nodes]؛ لنقل أنك ضبطت tested_zone على test.انسخ مثال تهيئة المنطقة باسم data/<tested_zone>.yml (في حالتنا: data/test.yml) وعدّله؛ على الأقل، يجب أن يحتوي المفتاح tested_zone_settings.name على tested_zone (أي test).
صدّر نطاق DNS الخاص بك واحفظه باسم data/<dns_zone>.zone (في حالتنا: example.com).
قم بتشغيل playbook:
ansible-playbook prober.yml -i inventories/test/ -vvv
سيؤدي هذا إلى إنشاء الاختبارات على عقدة الفاحص وإعداد وظيفة cron لتشغيلها كل ليلة في الساعة 01:00 صباحًا
يمكنك الآن استخدام ssh للدخول إلى عقدة الفاحص وتفقد الاختبارات التي تم إنشاؤها في /opt/prober/. بمجرد أن تكون راضيًا، يمكنك تشغيلها بتنفيذ: /opt/prober/run_tests.sh. سيتم حفظ النتائج في /var/run/prober/results.
متغيرات التهيئة (المعرفة في probers.yml):
tests_directory (الافتراضي: /opt/prober):
الدليل على عُقد الفاحص حيث يتم إنشاء ملفات الاختبار (ملفات *.bats).
results_repo_directory (الافتراضي: /var/run/prober/results)
دليل المستودع لنتائج الاختبار (ملفات *.tap); يتم تهيئة مستودع git هناك وإنشاء دليل فرعي tap/ للنتائج الفعلية; يتم إيداع النتائج في مستودع git، ويتم وضع علامات على الإيداعات بتاريخ بتنسيق yyyy-mm-dd (مثلاً، الإيداع الذي يحتوي على نتائج اختبار انتهى في 19 مارس 2020 يُوسم بـ 2020-03-19).
simultaneous_tests_count (الافتراضي: 20):
عدد الاختبارات التي يتم تشغيلها في وقت واحد.
prober_dev (الافتراضي: غير معرف):
تخطي بعض المهام التي لا معنى لها على جهاز التطوير
(مثل إعداد cron أو zabbix).
يتم تعريف المناطق في ملفات ./data/<zone_name>.yml حيث يكون المفتاح الأعلى هو السلسلة "tested_zone_settings"، والتي تحتوي بعد ذلك على مفاتيح:
name: اسم المنطقة، مطابق لاسم الملف (بدون امتداد); على سبيل المثال: "internal", "external", "dmz"default (اختياري): الإعدادات الافتراضية لجميع المضيفين في هذه المنطقة^") تطابق أسماء FQDN متعددةالمفتاح default، وكل مفتاح تعبير عادي، وكل مفتاح نطاق بدوره يمكن أن يحتوي على هذه المفاتيح:
resolve: هل يجب أن يحل المضيف إلى عنوان IP ذي الصلة (قيمة منطقية true/false، أو السلسلة "skip")ping: هل يجب أن يستجيب المضيف لـ ping (قيمة منطقية true/false، أو السلسلة "skip")ports: قائمة بمنافذ TCP و UDP المسموح بفتحها (المفاتيح الفرعية "tcp" و "udp"، يحتوي كل منها على مصفوفة من الأعداد الصحيحة التي تحدد المنافذ المسموح بفتحها، أو السلسلة "skip")، ومنافذ TLS الممكّنة لإجراء فحص أعمق عليها (المفتاح الفرعي tls، يحتوي على قاموس بأرقام المنافذ كمفاتيح، ونوع خدمة TLS أو الكلمة "skip" كقيمة)ports: "skip" هو اختصار لـ:
ports:
tcp: "skip"
udp: "skip"
tls: "skip"
أنواع خدمات TLS هي ما يدعمه testssl.sh لخيار -t/--starttls، و "https" لاختبار HTTPS (بما في ذلك الترويسات)، أو "tls" لاختبار TLS العام.tcp".skip: ما إذا كان يجب تخطي المضيف بالكامل (قيمة منطقية)يمكنك رؤية مثال التهيئة هنا.
يتم تعريف الإعدادات الافتراضية العامة في probers.yml. لكل مضيف مفحوص، يتم بعد ذلك دمجها مع الإعدادات الافتراضية للمنطقة ذات الصلة، ثم مع مفاتيح التعبير العادية التي تطابق اسم المضيف المحدد، وأخيرًا مع إعدادات المضيف المحددة.
هذا يعني أن إعدادات المضيف المحددة في منطقة معينة لها أولوية على الإعدادات من مفاتيح التعبير العادية المطابقة، والتي بدورها تسبق الإعدادات الافتراضية للمنطقة، والتي بدورها تسبق الإعدادات الافتراضية العامة.
يتم التعامل مع المفتاح ports بطريقة خاصة بعض الشيء: إذا تم إدراج منافذ معينة في مكان ما في سلسلة توارث التهيئة، فمن المستحيل إلغاء إدراجها في الأسفل في السلسلة، فقط إضافة أرقام منافذ إضافية، أو اختيار "skip" لاختبارات جميع منافذ بروتوكول معين بشكل كامل.
يتم تحديد ملفات المنطقة بناءً على المتغير tested_zone المضبوط لكل عقدة فاحصة.
بعض الاختبارات منطقية في سياق عناوين IP الفردية، بغض النظر عن عدد النطاقات/أسماء المضيفين التي تحلها لها; على سبيل المثال، التحقق مما إذا كانت منافذ معينة مفتوحة. على سبيل المثال، لنفترض أن a.example.com و b.example.com يشيران إلى نفس عنوان IP. مع التهيئة من المثال أعلاه، يعني ذلك أن المنفذين 8080/tcp و 8443/tcp من المفترض أن يكونا مفتوحين، وأن HTTPS متوقع على المنفذ 8443/tcp.
بعض الاختبارات منطقية في سياق مجموعات نطاق/اسم مضيف معين وعنوان IP; على سبيل المثال، إذا كانت شهادة TLS المقدمة لاسم نطاق معين على عنوان IP معين صالحة.