كيف تبني نظام يراقب الملفات في خادمك ؟!

الكاتب: SilenCker في 15 يوليو 2011

بسم الله الرحمن الرحيم

 

بما أنني لم أستقبل أي رسالة تحتوي مشكلة لأحلها علنا (وهذا دليل أنه ليس لديكم مشاكل :D )، قررت أن أفكر في شيء ما، ووقع اختياري على انشاء تدوينة تجعلك بعد قراءتها قادرا على انشاء نظام مراقبة خاص بك وحدك، يقوم بفحص الملفات في خادمك وابلاغك عن الملفات الخطيرة أو الخاصة أو ذات لاحقة محددة وفعل ما تشاء بها …الخ

قد تسأل نفسك، ماذا أستفيد؟ نعم، سؤال براغماتي (غير متأكد :D ) مميز… سأجيب عنه بأمثلة معينة ولك أن تتخيل:

  • نفرض أنه لديك برنامج يقوم بوضع ملفات في مجلد ما في أوقات غير محددة، وتريد أن تنقل أي ملف صورة الى مجلد آخر أو الى خادم آخر في الوقت الحقيقي، التدوينة هذه تساعدك على هذا !
  • تكون قد منعت Options من أن تكون في ملفات .htaccess، والعملاء دائما ما يشتكون في صفحة الخطأ 500 ودائما ما تخبرهم بأنه يتوجب عليهم حذف التعليمة Options ليعمل المجلد، هذه التدوينة تجعلك قادرا على بناء مراقب يقوم بحذف السطر Options من أي ملف .htaccess يتم رفعه في حسابات خادمك !
  • لديك قاعدة بيانات تحتوي بصمات لملفات ضارة لا تريد أن تكون في خادمك، هذه التدوينة تجعلك قادرا على صنع نظام يحذفها بمجرد تواجدها في خادمك !
  • والكثير الكثير من الأفكار الأخرى …

ببساطة، كل هذا يعتمد على Inotify والتي بكل بساطة عبارة عن خاصية مضافة في Linux منذ الاصدار 2.6.13 والتي تسمح باعطائنا الملفات التي عدلت والتي أضيفت في المسار المراقَب في الوقت الحقيقي، وما نقوم به نحن هو بناء السكربت المرشح والذي يقوم بعمليات نحددها نحن على هذه الملفات، مثل (اذا كان الملف صورة فارسل نسخة الى الخادم السادس واحذفه من مكانه الحالي).

وبما أننا لا نريد أن نتعمق فيها، بل نود الاستفادة من مميزاتها، سنستعمل برنامج يستعملها يدعى fsniper، ما الذي يقوم به هذا البرنامج بشكل عام؟

هذا البرنامج كما أسلفت -وبتعبير عام جدا- يستعمل خصائص Inotify لمعرفة الملفات الجديدة وتطبيق أمر أو سكربت عليها، يوفر لنا ملف اعدادات بسيط ويسهل علينا الكثير في تطبيق هذه الفكرة.

خطة العمل:

  • نقوم ببناء سكربت ترشيح يقوم بنقل أي ملف symbolic link, perl يرفع الى المسار الى مسار آمن مع ابلاغنا بالبريد الالكتروني.
  • نركب fsniper ونقوم باعداده ليراقب مسار معين ونعده ليقوم بتنفيذ سكربت الترشيح على أي ملف جديد.
  • انتهى !

سكربت الترشيح:

من المهم أن يعمل السكربت بناء على الـ Arguments، نمرر له مسار الملف كـ arg ويقوم بفحصه واتخاذ الاجراء المناسب، وهذا لأن الـ fsniper يقوم بتطبيقه بهذا الشكل عندما يتم انشاء ملف جديد في المسار المراقَب.

ولهذا السكربت بكل بساطة جعلته كالتالي:

1
2
3
#!/bin/bash

[ -e "$1" ] && [ $(file "$1" | egrep -c "symbolic link|text executable") -gt "0" ] && chmod 000 "$1" && mv "$1" ~/safe && echo "File moved: $1 at `date '+%d/%m/%Y %H:%M'`" | mail -s "File monitor $HOSTNAME" silencker@gmail.com

يقوم السكربت السابق بالقيام بفحص الملفات الممرر كـ argument فاذا كان كـ symbolic link أو text executable مثل (perl,python…) سيقوم بنقله الى المجلد safe الموجود في المسار الرئيسي للمستخدم ويرسل رسالة تنبيه الى البريد الالكتروني (طبعا قم بتغيير البريد اذا أردت نقل نفس السكربت)، كما أود أن أقول أن هذا السكربت ما هو الا كمثال.

نفرض أن مسار هذا السكربت هو :

1
/root/filter.sh

تركيب واعداد fsniper:

في هذا الجزء سنرى كيفية تركيب واعداد fsniper على التوزيعة CentOS الخامسة، وهذا لأنها ذات انتشار واسع في أوساط الخوادم.

لتركيبه من المصدر قم بتنفيذ الأوامر التالية (لا داعي لشرحها):

أولا نقوم بتركيب المكتبة pcre فهي  من متطلبات التشغيل:

1
yum install pcre-devel

ثم نقوم بتطبيق الأوامر التالية تباعا:

1
2
3
4
5
6
7
cd /usr/src
wget http://projects.l3ib.org/fsniper/files/fsniper-1.3.1.tar.gz
tar zxf fsniper*.tar.gz
cd fsniper*
./configure
make
make install

وبهذا نكون قد أنهينا التركيب ! نأتي للاعداد.

البرنامج يقوم بقراءة ملف اعدادات config يكون داخل مجلد fsniper والذي يكون داخل مجلد .config الموجود في المسار الرئيسي للمستخدم !

ولهذا نقوم بانشاء المجلد المناسب والملف الذي سيتحوي الاعدادات بالأمرين:

1
2
mkdir -p ~/.config/fsniper/
touch ~/.config/fsniper/config

ملف الاعدادات نجعله يحتوي محتوى كالتالي:

1
2
3
4
5
6
7
8
watch {
/home/user/public_html {
*/* {
recurse = true
handler = /root/filter.sh "%%"
}
}
}

مع ملاحظة أن /root/filter.sh هو السكربت المرشح ويجب أن يكون قابلا للتنفيذ، والمسار /home/user/public_html هو المجلد المراد مراقبته، و */* تعني كل أنواع الملفات (mime)، أما %% هي التي سيتبدلها الـ fsniper بمسار الملف الجديد، ويجدر بالذكر أن استعمال الـ wildcard في المسار المراقَب غير ممكن مثل أن تضع /home/*/public_html للأسف، للاستزادة يمكنك مراجعة الصفحة الخاصة به بالضغط هنا.

بعد هذا قم بتشغيل الـ fsniper بالأمر التالي:

1
fsniper --daemon --sync

للاستزادة أنصح بزيارة المواقع التالية:

  • http://en.wikipedia.org/wiki/Inotify
  • http://files.minuslab.net/doc.html
  • https://github.com/rvoicilas/inotify-tools/wiki
  • http://tldp.org/LDP/abs/html

أرجوا أن يكون هذا التطبيق العملي البسيط بوابة لتمكين الكثيرين من تطبيق أفكار أخرى ان شاء الله.

اذا واجهتك مشكلة لا تتردد بوضعها كي أحلها ان شاء الله.

تقبلوا تحياتي أخوكم.

مقالات عشوائية

    3 ردود

  1. M374 S7ru7 قال:

    أهلا بالعودة لا تعليق
    موضوع رائع كالعادة
    دعنا نستفيد من كل هذا دائما ;)

  2. no name قال:

    هل قال لك أحد من قبل أنك عبقري !!

    ما شاء الله عليك

علق على المقال

التعليق