كيف تبني نظام يراقب الملفات في خادمك ؟!
بسم الله الرحمن الرحيم
بما أنني لم أستقبل أي رسالة تحتوي مشكلة لأحلها علنا (وهذا دليل أنه ليس لديكم مشاكل
)، قررت أن أفكر في شيء ما، ووقع اختياري على انشاء تدوينة تجعلك بعد قراءتها قادرا على انشاء نظام مراقبة خاص بك وحدك، يقوم بفحص الملفات في خادمك وابلاغك عن الملفات الخطيرة أو الخاصة أو ذات لاحقة محددة وفعل ما تشاء بها …الخ
قد تسأل نفسك، ماذا أستفيد؟ نعم، سؤال براغماتي (غير متأكد
) مميز… سأجيب عنه بأمثلة معينة ولك أن تتخيل:
- نفرض أنه لديك برنامج يقوم بوضع ملفات في مجلد ما في أوقات غير محددة، وتريد أن تنقل أي ملف صورة الى مجلد آخر أو الى خادم آخر في الوقت الحقيقي، التدوينة هذه تساعدك على هذا !
- تكون قد منعت 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 ردود
أهلا بالعودة لا تعليق
موضوع رائع كالعادة
دعنا نستفيد من كل هذا دائما
هل قال لك أحد من قبل أنك عبقري !!
ما شاء الله عليك
حقا جميل … مواضيعه قيمة ومفيدة
ننتظر جديدك