استخدام Tripwire لاكتشاف اختراقات الخادوم على توزيعة Ubuntu


محمد هاني صباغ

الحماية هي مشكلة كبيرة في غاية الأهمّية عند الحديث عن الخواديم على الشبكة. صحيح أنه يمكن إعداد الجدران النارية، سياسات fail2ban، الخدمات الآمنة وتطبيق بعض التقييدات على تطبيقات الويب، إلّا أنّه من الصعب أن تتأكّد مما إذا قمتَ حقًا بمنع حصول كلّ الهجمات على خادومك أو صدّها.

tripwire.thumb.png.92bb82e6a2c0d48f9d742

يعمل نظام اكتشاف الاختراق على جهاز المستضيف (HIDS - host-based intrusion detection system) عبر جمع التفاصيل عن نظام ملفّات حاسوبك وإعداداته. ثمّ يقوم بتخزين هذه المعلومات لديه ليستخدمها في مطابقة حالة النظام الحالية مع البيانات التي قام بجمعها بالسابق. إذا حصل أيّ تغيير بين حالة النظام الحالية وبين حالة النظام المخزّنة لدى HIDS، فتلك قد تكون إشارة إلى أنّه قد تمّ اختراق خادومك.

من أنظمة اكتشاف الاختراق الشهيرة على نظام لينكس هو تطبيق Tripwire. وهو برنامج يمكنه تعقّب العديد من نقط بيانات نظام الملفّات بهدف اكتشاف ما إذا حصلت تغييرات غير متوقّعة عليها.

في هذا الدرس، سنشرح كيفية تثبيت وإعداد tripwire على Ubuntu 12.04. بسبب طبيعة نظام اكتشاف الاختراقات، فمن المستحسن أن تقوم بتثبيت هذا النظام مباشرةً بعد إعداد خادومك، لكي يتمكّن النظام من الحصول على نسخةٍ نظيفة وآمنة بالأساس من خادومك.

تثبيت Tripwire

لحسن الحظّ، يتوفّر tripwire في المستودعات الافتراضية لتوزيعة Ubuntu، يمكن تثبيته عبر الأمر التالي:

sudo apt-get update
sudo apt-get install tripwire

أثناء عملية التثبيت، سيتم ضبط إعدادات العديد من الحزم الأخرى التي يعتمد عليها التطبيق في عمله.

أوّلًا، سيقوم بإعداد تطبيق البريد الذي يحتاجه كاعتمادية. إذا كنت تريد إعداد التنبيهات عبر البريد الإلكتروني، فاختر "internet site".

بعدها سيسألك عمّا إذا كنت تريد اختيار جمل المرور passphrases أثناء التثبيت، اختر Yes لكلا السؤالين. ثمّ سيسألك عمّا إذا كنت تريد إعادة بناء ملفّ الإعدادات، اختر yes. وأخيرًا، سيسألك سؤالًا مشابهًا عن ملفّ السياسة المتّبعة policy، اختر yes.

بعدها، سيطلب منك اختيار وتأكيد جُمَل مرور للموقع. يستخدم Tripwire مفتاحين اثنين لتأمين ملفّات إعداداته:

  • مفتاح الموقع site key: يُستخدم هذا المفتاح لتأمين ملفّات الإعدادات. نحتاج إلى أن نضمن أنّ هذه الملفّات لن يتم تغييرها، وإلّا فلن نتمكّن من الوثوق بنظام اكتشاف الاختراقات بأكمله حينها. بما أنّ نفس ملفّات الغعدادات يمكن أن يتم استخدامها من قبل أكثر من خادوم، فإنّه بالإمكان استخدام هذا المفتاح على أكثر من خادوم.
  • المفتاح المحلّي local key: يتم استخدام هذا المفتاح على كلّ آلة لتشغيل الملفّات الثنائية (binaries). وهو أمرٌ ضروري لضمان أنّ الملفّات الثنائية لن يتم تشغيلها دون موافقتنا.

ستقوم أوّلًا باختيار وتأكيد جُملة مرور لمفتاح الموقع، ثمّ للمفتاح المحلّي. تأكّد من إدخال جمل قوّية.

تحليل قاعدة البيانات

بعد التثبيت، يجب أن تقوم بتحليل وإعداد تثبيتك. كما في معظم برامج الحماية، يأتي tripwire مع إعدادت افتراضية عامّة مُقيّدة يمكن تعديلها لتناسب احتياجاتك.

أوّلًا، إذا لم تختر yes عندما سألك عن إنشاء ملفّ السياسة المتّبعة policy أثناء التثبيت، فإنّه يجب عليك فعل ذلك الآن عبر الأمر:

sudo twadmin --create-polfile /etc/tripwire/twpol.txt

سيتم سؤالك بعدها عن جملة المرور التي اخترتها سابقًا.

يقوم هذا بإنشاء ملفّ سياسة مشفّر من الملفّ الموجود في المسار etc/tripwire/، هذا الملفّ المشفّر هو ما يقرأه tripwire حقا عند تنفيذ فحوصاته.

يمكننا الآن تحليل قاعدة البيانات التي سيستخدمها tripwire للتحقق من نظامنا لاحقًا. تستخدم قاعدة البيانات هذه الملف الذي قمنا بإنشاءه للتو كما أنّها تقوم بالتحقق من النقاط المحددة بداخله.

بسبب أنّ هذا الملف ليس مجهّزا لنظامنا بعد، فسنحصل على الكثير من رسائل التحذير، الأخطاء وغيرها. سنستخدم هذه الرسائل كدليل لنقوم بضبط ملفّ إعدادتنا حاليًا.

للقيام بتحليل قاعدة البيانات، طبّق:

sudo tripwire --init

يقوم هذا الأمر بإنشاء ملفّ قاعدة البيانات وطباعة الأشياء التي يجب علينا ضبطها في ملفّ إعداداتنا.

ولأننا نريد حفظ النتائج لنقوم بتحديد ما سنقوم بتعديله بالإعدادات، فيمكننا التقاط أيّ جزءٍ يقوم بذكر اسم ملف معيّن نريده من الخرج، ووضعه في مجلّد إعدادات tripwire. يمكننا تشغيل عمليّة التحقق ووضع الملفّات التي تمّ سردها داخل ملف يدعى test_results عن طريق الأمر:

sudo sh -c 'tripwire --check | grep Filename > test_results'

إذا فتحنا هذا الملف، فيجب أن نرى شيئا مثل:

less /etc/tripwire/test_results

Filename: /etc/rc.boot
Filename: /root/mail
Filename: /root/Mail
Filename: /root/.xsession-errors
. . .

إعداد ملف السياسة المتبعة لمطابقة حالة نظامك

الآن وبعد أن صار لدينا قائمة بكل الملفّات التي تشكّل إعدادات tripwire، يمكننا تعديل ملفّ السياسة policy file للتخلص من تلك الرسائل المزعجة التي تظهر لنا.

افتح ملف السياسة الصرف بمحرر النصوص الخاص بك وبصلاحيات الجذر:

sudo nano /etc/tripwire/twpol.txt

ابحث عن عن جميع الملفّات الموجودة في ملف test_results. قم بتعليق كل السطور التي تجدها منها (ضع إشارة # قبلها فقط).

في قسم "Boot Scripts"، يجب أن تقوم بتعليق السطر etc/rc.boot/ لأنّه ليس موجودًا على نظام Ubuntu:

(
  rulename = "Boot Scripts",
  severity = $(SIG_HI)
)
{
         /etc/init.d             -> $(SEC_BIN) ;
         #/etc/rc.boot            -> $(SEC_BIN) ;
         /etc/rcS.d              -> $(SEC_BIN) ;
}

كان هناك العديد من الملفّات الموجودة بمسار root/ والتي كان يجب علي تعليقها على نظامي، قم بتعليق أي ملف غير متوفر على نظامك حاليًا:

(
  rulename = "Root config files",
  severity = 100
)
{
        /root                           -> $(SEC_CRIT) ; # Catch all additions to /root
        #/root/mail                     -> $(SEC_CONFIG) ;
        #/root/Mail                     -> $(SEC_CONFIG) ;
        #/root/.xsession-errors         -> $(SEC_CONFIG) ;
        #/root/.xauth                   -> $(SEC_CONFIG) ;
        #/root/.tcshrc                  -> $(SEC_CONFIG) ;
        #/root/.sawfish                 -> $(SEC_CONFIG) ;
        #/root/.pinerc                  -> $(SEC_CONFIG) ;
        #/root/.mc                      -> $(SEC_CONFIG) ;
        #/root/.gnome_private           -> $(SEC_CONFIG) ;
        #/root/.gnome-desktop           -> $(SEC_CONFIG) ;
        #/root/.gnome                   -> $(SEC_CONFIG) ;
        #/root/.esd_auth                        -> $(SEC_CONFIG) ;
        #/root/.elm                     -> $(SEC_CONFIG) ;
        #/root/.cshrc                   -> $(SEC_CONFIG) ;
        /root/.bashrc                   -> $(SEC_CONFIG) ;
        #/root/.bash_profile            -> $(SEC_CONFIG) ;
        #/root/.bash_logout             -> $(SEC_CONFIG) ;
        /root/.bash_history             -> $(SEC_CONFIG) ;
        #/root/.amandahosts             -> $(SEC_CONFIG) ;
        #/root/.addressbook.lu          -> $(SEC_CONFIG) ;
        #/root/.addressbook             -> $(SEC_CONFIG) ;
        #/root/.Xresources              -> $(SEC_CONFIG) ;
        #/root/.Xauthority              -> $(SEC_CONFIG) -i ; # Changes Inode number on login
        #/root/.ICEauthority                -> $(SEC_CONFIG) ;
}

آخر جزءٍ من عملية التحقق الخاصّة بي كان يتذمّر من الملفّات الوصفية بنظام الملفّات proc/. تتغير هذه الملفّات طوال الوقت، لذا فإنّها تقوم بإرجاع نتيجة موجبة طوال الوقت لنظام اكتشاف الاختراقات بعد أن تتغير.

في قسم "Devices & Kernel information"، يمكنك أن ترى أن نظام الملفّات proc/ مُعلّم ليتم التحقق منه:

(
  rulename = "Devices & Kernel information",
  severity = $(SIG_HI),
)
{
        /dev            -> $(Device) ;
        /proc           -> $(Device) ;
}

ولكن هذا يقوم بالتحقق من كل الملفّات الموجودة ضمنه، ونحن لا نريد هذا. وعوضا عن ذلك، فسنقوم بحذف هذا الخيار، وإضافة الملفّات الفرعية الموجودة داخل نظام proc/ والتي نريد التحقق منها فقط:

{
        /dev                    -> $(Device) ;
        #/proc                  -> $(Device) ;
        /proc/devices           -> $(Device) ;
        /proc/net               -> $(Device) ;
        /proc/tty               -> $(Device) ;
        /proc/sys               -> $(Device) ;
        /proc/cpuinfo           -> $(Device) ;
        /proc/modules           -> $(Device) ;
        /proc/mounts            -> $(Device) ;
        /proc/dma               -> $(Device) ;
        /proc/filesystems       -> $(Device) ;
        /proc/interrupts        -> $(Device) ;
        /proc/ioports           -> $(Device) ;
        /proc/scsi              -> $(Device) ;
        /proc/kcore             -> $(Device) ;
        /proc/self              -> $(Device) ;
        /proc/kmsg              -> $(Device) ;
        /proc/stat              -> $(Device) ;
        /proc/loadavg           -> $(Device) ;
        /proc/uptime            -> $(Device) ;
        /proc/locks             -> $(Device) ;
        /proc/meminfo           -> $(Device) ;
        /proc/misc              -> $(Device) ;
}

وبما أننا في هذا القسم من الملف، فنريدُ أيضًا عمل شيءٍ مع نظام الملفّات dev/pts/. لن يتحقق Tripwire من نظام الملفّات ذاك افتراضيًا لأنّه مضبوط لأن يتحقق من dev/ فقط، بينما يعتبر dev/pts/ نظام ملفات منفصل، ولذلك لن يتم اعتباره في عملية التحقق. لجعل Tripwire يتحقق من هذا النظام كذلك، يمكنك إضافته كالشكل التالي:

{
        /dev                    -> $(Device) ;
        /dev/pts                -> $(Device) ;
        #/proc                  -> $(Device) ;
        /proc/devices           -> $(Device) ;
        /proc/net               -> $(Device) ;
        /proc/tty               -> $(Device) ;
        . . .

الشيء الأخير الذي سنقوم بوضع إشارة تعليق قبله هما السطران var/run/ و var/lock/ لكي لا يقوم نظامنا باعتبار التغييرات التي تجري على نظام الملفّات من طرف الخدمات:

(
  rulename = "System boot changes",
  severity = $(SIG_HI)
)
{
        #/var/lock              -> $(SEC_CONFIG) ;
        #/var/run               -> $(SEC_CONFIG) ; # daemon PIDs
        /var/log                -> $(SEC_CONFIG) ;
}

احفظ الملف وأغلقه عندما تنتهي.

الآن وبعد أن قمنا بضبط ملفّنا، نحتاج إلى استخدامه عبر إعادة إنشاء ملف السياسة المشفّر الذي يستخدمه tripwire في الواقع:

sudo twadmin -m P /etc/tripwire/twpol.txt

بعد أن يتم إنشاؤه، يجب أن نقوم بإعادة تحليل قاعدة البيانات لتطبيق السياسة الجديدة:

sudo tripwire --init

Please enter your local passphrase:
Parsing policy file: /etc/tripwire/tw.pol
Generating the database...
*** Processing Unix File System ***
Wrote database file: /var/lib/tripwire/tripit.twd
The database was successfully generated.

يجب أن تختفي الآن جميع رسائل التحذيرات والأخطاء المزعجة التي رأيتها في البداية، إذا كان لا يزال هناك رسائل تحذير مثلا، فيجب أن تتابع تحرير ملف etc/tripwire/twpol.txt/ إلى أن تختفي.

اختبار الإعدادات

إذا لم تشتكي عمليّة تحليل قاعدة البيانات من أي مشاكل أو أخطاء، فهذا يعني أن إعداداتك تطابق نظام الحالي في هذه النقطة. ولكننا سنقوم بعمل اختبار لرؤية ما يبدو عليه تقرير tripwire إذا لم يكن هناك حقًا أيّ أخطاء.

الأمر الرئيسي للاختبار هو:

sudo tripwire --check

يجب أن ترى تقريرًا يتم طباعته على شاشتك ليخبرك أنّه لا يوجد أيّ أخطاء أو تغييرات مُكتشفة على نظامك.

بمجرّد اكتمال هذه العملية، يمكنك أن تكون مطمئنا إلى أن إعداداتك تم ضبطها بالشكل الصحيح. يجب علينا تنظيف ملفّاتنا قليلًا لحذف المعلومات الحسّاسة من نظامنا.

يمكننا حذف ملف test_results الذي قمنا بإنشائه:

sudo rm /etc/tripwire/test_results

شيء آخر يمكننا القيام به هو إزالة ملف الإعدادات الصرف الغير مشفّر. يمكننا الآن القيام بهذا بشكل آمن لأنّه يمكن إعادة إنشائه إن أردنا مجددا من الملف المشفّر باستخدام جملة المرور الخاصّة بنا لاحقا.

كل ما علينا فعله لإعادة إنشاء ملف الإعدادات الصرف هو تمرير الملف المشفّر إلى twadmin، بنفس الطريقة التي قمنا بإنشاء الإصدار المشفّر بداية. يجب علينا فقط تطبيق:

sudo sh -c 'twadmin --print-polfile > /etc/tripwire/twpol.txt'

اختر هذا الآن عبر نقل الإصدار النصّي إلى موقع النسخ الاحتياطي ثم حاول إعادة إنشائه:

sudo mv /etc/tripwire/twpol.txt /etc/tripwire/twpol.txt.bak
sudo sh -c 'twadmin --print-polfile > /etc/tripwire/twpol.txt'

إذا عمل بشكل صحيح، فيمكنك حينها حذف الملفّات الصرفة بشكل آمن الآن:

sudo rm /etc/tripwire/twpol.txt
sudo rm /etc/tripwire/twpol.txt.bak

إعداد التنبيهات عبر البريد الإلكتروني

سنقوم بإعداد tripwire ليتم تشغيله كل يوم وليتم أتمتة التنبيهات عبر البريد الإلكتروني فيه. خلال العملية، يمكننا أن نختبر كيفيّة تحديث قاعدة البيانات عندما نقوم بعمل تغييرا على نظامنا.

سنستخدم الأمر mail لإرسال التنبيهات إلى عنوان بريدنا الإلكتروني. هذا الأمر غير مثبّت حاليا على نظامنا، لذلك يجب علينا تحميله من المستودعات الرسمية.

لتثبيته:

sudo apt-get install mailutils

الآن وبعد أن تم تثبيت الأمر، فلنقم باختبار قدرة نظامنا على إرسال تقرير tripwire عبر البريد الإلكتروني. سيحتوي هذا التقرير على رسائل التحذير والتغييرات الحاصلة مؤخّرًا على الخادوم، وبما أننا قمنا للتو بتثبيت برنامج جديد دون إخبار tripwire:

sudo tripwire --check | mail -s "Tripwire report for `uname -n`" your_email@domain.com

يجب أن تتلقى تقريرا بعد فترة قصيرة في بريدك الإلكتروني عن البرنامج الجديد "mail" الذي تمّ تثبيته على النظام. هذا أمر جيّد، إنّه يعني أن tripwire يقوم بمهمّته بمراقبة نظام ملفّاتنا وأنّ نظام التنبيهات عبر البريد الإلكتروني يعمل كذلك.

يجب علينا الآن تشغيل اختبار تحقق لتحديث قاعدة البيانات بعد أن قمنا بتثبيت برنامج جديد.

يمكننا فعل ذلك عبر:

sudo tripwire --check --interactive

سيقوم هذا الأمر بتشغيل الاختبارات كالمعتاد، ولكن في النهاية، عوضًا عن أن يقوم بطباعة التقرير على الشاشة، سيتم نسخه إلى ملف نصّي وفتحه بواسطة محرر النصوص الافتراضي.

يحتوي هذا التقرير على الكثير من التفاصيل عن الملفّات التي تمّ تغييرها. في الواقع، على جهازي، كان الملفّ المُنشَئ يتكوّن من أكثر من 2275 سطر. هذه الكمّية من المعلومات مفيدة جدًا في حال حصول مشكلة حقيقية تتعلق بالحماية.

الجزء الأهم هو ببداية الملف. بعد القليل من المعلومات التقديمية، يجب أن ترى بضع سطور تحتوي صناديق اختيار لكل من الملفّات المُعدّلة أو المُضافة:

Rule Name: Other binaries (/usr/sbin)
Severity Level: 66
-------------------------------------------------------------------------------

Remove the "x" from the adjacent box to prevent updating the database
with the new values for this object.

Added:
[x] "/usr/sbin/maidag"

Modified:
[x] "/usr/sbin"
. . .

تشير صناديق الاختيار هذه إلى أنّك تريد تحديث قاعدة البيانات للسماح بهذه التغييرات. يجب أن تبحث عن كل صندوق يحوي إشارة "x" بداخله وأن تتحقق من أن هذه التغييرات قد قمت بها أنت فعلا وأنّه لا بأس بها.

إذا لم تكن تريد لتغيير معيّن أن يبقى، يمكنك إزالة إشارة "x" من الصندوق ولن يتم تحديث ذلك الملفّ في قاعدة البيانات. سيسبب هذا أن يقوم tripwire باعتبار الملفّ كملف تمّ تعديله دون أن يكون متوقعًا ذلك.

في هذه النقطة، سيسألك النظام عن جملة المرور التي اخترتها في البداية لكي يتمكّن tripwire من تحديث ملفّات قاعدة البيانات الخاصّة به.

إذا قبلنا جميع التغييرات، وإذا قمنا بتشغيل هذا الأمر بعدها، فيجب أن يكون التقرير أقصر بكثير الآن وألّا يسرد أيّ تغييرات.

أتمتة Tripwire مع Cron

الآن وبعد أن تحققنا من أن جميع وظائف النظام تعمل بشكل يدوي، يمكننا إعداد مهمّة cron لتقوم بتنفيذ اختبار تحقق بواسطة tripwire في كل صباح. يمكنك الإطلاع على كيفية عمل cron من هنا.

يمكننا استخدام crontab الخاص بالمستخدم الجذر، لأنّ التعديلات على الـcronjob الخاصّة بالنظام قد يتم محوها في حال توفّر تحديث لحزمة cron.

للتحقق ما إذا كان المستخدم الجذر يمتلك بالفعل crontab:

sudo crontab -l

إذا كان crontab موجودًا، فيجب عليك نقله عبر أنبوب (pipe) إلى ملف وأن تقوم بإرجاعه:

sudo sh -c 'crontab -l > crontab.bad'

بعدها، يمكننا تعديل الـcrontab عبر:

sudo crontab -e

إذا كانت هذه مرّتك الأولى في تشغيل crontab، فسيسألك عن اسم محرر النصوص الذي تود استخدامه. إذا كنت لا تفضّل واحدًا على آخر، فيمكنك استخدام المحرر nano.

بعدها، سيتم نقلك إلى ملف حيث يمكنك أتمتة tripwire من داخله. بما أننا سنقوم بتشغيل tripwire كل يوم، فسنحتاج فقط إلى أن نقرر الوقت الذي نريد تشغيله فيه. بشكلٍ عام، يتم تشغيل الخدمات في أوقات بعيدة عن أوقات الذروة لألّا تكون مزعجة أثناء التنفيذ للخادوم في ساعات الذروة والضغط على الخادوم.

الصيغة التي نحتاج استخدامها هي min hour * * * command والأمر الذي نريد استخدامه هو نفسه الذي استخدمناه في تقريرنا عبر البريد الإلكتروني سابقًا. لا نحتاج إلى استخدام sudo هذه المرّة بما أنّه سيتم تشغيل الأمر باسم المستخدم الجذر.

لتشغيل tripwire بالساعة 3:30 صباحًا كلّ يوم، يمكننا وضع السطر التالي بملفّنا:

30 3 * * * /usr/sbin/tripwire --check | mail -s "Tripwire report for `uname -n`" your_email@domain.com

يمكنك تعديله حسب احتياجك.

خاتمة

يجب أن تمتلك الآن نظام اكتشاف اختراق مؤتمن يُرسِل لك التقارير يوميًا في حال حصول تغييرات على نظام الملفّات الخاصّ بك. يجب أن تقوم بمعاينة التقارير المُرسلة بصفة دورية وتقوم باتّخاذ إجراء حيالها إن احتجت ذلك، إمّا بتحديث قاعدة tripwire بأنّ التغييرات لا بأس بها وأنّها من طرفك، وإمّا بالتحقيق بأي نشاط مشبوه.

ترجمة -وبتصرف- للمقال How To Use Tripwire to Detect Server Intrusions on an Ubuntu VPS لصاحبه Justin Ellingwoo.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن