استجذار كل الخدمات في لينُكس

ArticleCategory:

System Administration

AuthorImage:

[Photo of the Author]

TranslationInfo:[Author and translation history]

original in en Mark Nielsen

en to ar Taha Zerrouki

AboutTheAuthor:

مارك يعمل مستشارا مستفلا، يهب وقته لقضايا مثل GNUJobs.com، يؤلف مقالات و يصوغ برامج حرة، و يتطوع لدى eastmont.net

Abstract:

استجذار خدمات النظام يعزز الأمن، و يقلل من الأضرار التي قد يسببها أحد ما إن اخترق النظام.

ArticleIllustration:[This is the title picture for your article]

[illustration]

ArticleBody:

مقدمة

ما الاستجذار؟ إنه تبديل بيئة برنامج ما، أي استبدال مجلد الجذر ROOT أي "\"، بالنسبة إلى برنامج ما أو جلسة عمل ما. أي أنّ أي شيء خارج المجلد الذي تستجذر به، غير موجود أبعد من البرنامج أو منفذ الأوامر المقصود.

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

ما يجعلني أعتبر الاستجذار ( مع خدمة غير الجذر) خطا دفاعيا، أنه إذا ما اخترق أحد ما حسابا غير الجذر، و لم يجد أي ملف يمكنه من اختراق الجذر، فــــسيضر فقط المساحة التي اخترقها. أما إن كانت المساحة المقتحمة غالبا لحساب الجذر، فلديه إذن خيارات أقل للهجوم. لا بد خلل ما، اخترق حسابك، لكن يستحسن أن تلطف المصيبة ما استطعت.

تذكر أنّ منهجي هذا قد لا يكون محكما 100 %، إنها محاولتي الأولى، و إن كانت تعمل جيدا بعض الشيء، فلابد أنها ستتم بيسر. إنها بداية الدرب لوثيقة "كيف يعمل" أود تأليفها عن الستجذار.

كيف سنستجذر كل شيء؟

حسنا، سنصنع مجلدا نسميه "/chroot"، و نجعل فيه كل الخدمات كما يأتي:

كل خدمة يجب أن تعزل تماما.

مخطوطتي ببرل للاستجذار.

نزّل Config_Chroot.pl.txt ثم سمّه Config_Chroot.pl. هذه المخطوطة - مكتوبة بـبرل - تسرد الخدمات المثبتة، و تريك ملفات الإعداد ، و تعدُّ خدمة ما، و تبدأها و توقفها، و هذا ما ينبغي عمله عموما.

  1. اصنع مجلد الاستجذار
    mkdir -p /chroot/Config/Backup
  2. نزّل Config_Chroot.pl.txt في /chroot/Config_Chroot.pl
  3. عدّل المتغير في المخطوطة إن لم تكن تستعمل /chroot مجلدا شخصيا.
  4. نزّل ملفاتي للإعداد.

و الآن، أشير أنني جربتها فقط على RedHat 7.2 و RedHat 6.2. إذن عدّل المخطوطة بما يناسب توزيعتك.

توصلت أن أكتب مقالا كبيرا طويلا عن الاستجذار ، لولا أنّ مخطوطتي قلصته. إذ لاحظت بعد استجذار كثير من الخدمات أنّ لها ملفات و إعدادات متشابهة . الطريقى المثلى لمعرفة ملفات خدمة ما التي ينبغي نسخها عند الاستجذار، هي مطالعة صفحة العون، و تنفيذ الأمر"ldd /usr/bin/file" للبرامج التي تحتاج ملفات المكتبات. كما يمكنك أن تستجذر خدمة ما و تشغلها يدويا لترى الأخطاء التي قد تحدث، أو تطالع ملفات الدخول.

عموما، لتثبيت خدمة ما عليك بـ:

cd /chroot
./Config_Chroot.pl config  SERVICE
./Config_Chroot.pl install SERVICE
./Config_Chroot.pl start   SERVICE

استجذار Ntpd

Ntpd خدمة زمنيو، فحسب، تحفظ تزامن حاسوبك و الحواسيب الأخرى مع الزمن الفعلي،و هي سهلة الاستجذار.

cd /chroot
# حرر السطر الموالي، إن لم تستعمل ملفاتي للإعداد.
#./Config_Chroot.pl config ntpd
./Config_Chroot.pl install ntpd
./Config_Chroot.pl start ntpd

استجذار DNS or named

مستجذر سلفا، زر
http://www.linuxdoc.org/HOWTO/Chroot-BIND8-HOWTO.html
أو
http://www.linuxdoc.org/HOWTO/Chroot-BIND-HOWTO.html

و إلا استعمل مخطوطتي .


cd /chroot
 # حرر السطر الموالي، إن لم تستعمل ملفاتي للإعداد. 
#./Config_Chroot.pl config  named
./Config_Chroot.pl install named
./Config_Chroot.pl start   named

استجذار Syslog مع الخدمات و انشغالاتي .

أود استجذارsyslogd . لكن المعضلة أنه يستخدم /dev/log تلقائيا، الذي لا يتمكن من البلوغ إليه من الخدمات المستجذرة. لذا لا أستطيع أن أدخل بيسر . أما الحلول الممكنة فهي:

الحل لدي أن تتأكد أن syslogd مستجذر جيدا مع كل خدمة.

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

أما إن فضلت ألا تفصل بين syslogd لكل خدمة، أضف الأوامر التالية إلى syslogd الرئيسي عندما يبدأ:

syslogd -a /chroot/SERVICE/dev/log

فإن كان لديك ssh و dns فسيبدوا هكذا :

syslogd -a /chroot/ssh/dev/log -a /chroot/named/dev/log -a /dev/log

آخر ملاحطة على syslogdن أنني رغبت أن أجعله يعمل في حساب غير الجذر، فحاولت أمرين بسيطين، لكنهما لم ينفعا، فاكتفيت. فإذا ما عمل في غير حساب الجذر مع كل خدمة فسيلبي حاجتي الأمنية.

استجذار Apache

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

و إليك هذا المثال، حيث أتصل بقاعدة بيانات عبر وصلة دائمة بApache.

$dbh ||= DBI->connect('dbi:Pg:dbname=DATABASE',"","", {PrintError=>0});

if ($dbh ) {$dbh->{PrintError} = 1;}
else 
  {$dbh ||= DBI->connect('dbi:Pg:dbname=DATABASE;host=127.0.0.1',"","",
      {PrintError=>1});}
      

المصدر : http://httpd.apache.org/dist/httpd

صرّف Compile أباش ثم ثبِّته في المجلد/usr/local/apache . ثم اعمل بمخطوط برل :

cd /chroot
 # Uncomment the next line if you don't use my config file. 
 # ./Config_Chroot.pl config  httpd
./Config_Chroot.pl install httpd
./Config_Chroot.pl start   httpd

عدلت ملفي httpd.conf لأحصل على .

ExtendedStatus On

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

<Location /server-info>
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
</Location>

ثم تصفح http://127.0.0.1/server-status أو http://127.0.0.1/server-info و تفحصها.

استجذار Ssh

أولا لابد أن تبدل ssh من المنفذ 22 إلى المنفذ 2222، ثم لما تبدأ ssh فسينصت إلى المنفذ 2222 من غير حساب الجذر. للاتصال بـ ssh اول مرة ينبعي وجود حساببات محصنة بكلمات سر، للسماح للآخرين بالدخول فقط لا غير. بعد الدخول لديهم برنامج ssh آخر يعمل على المنفذ 127.0.0.1:2322 ليتصلوا بالنظام الفعلي-- برنامج ssh الثاني يجب أن ينصت إلى جهاز الحلقة المفرغة loopbackفقط. الآن هذا ما عليك عمله، نحن لن نعمل ذلك، كل ما سنفعله أن تستجذر ssh في هذا المثال. و تركنا للقارئ تمارين يجربها بأن يضع sshd في حساب غير الجذر و يثبت sshd ثانيا ينصت إلى الحلقة المفرغة، ليجعل الآخرين يتصلون بالجهاز الفعلي .

مرة أخرى، سنستجذر ssh فقط، و نذكرك بنتائج ذلك إذ لن يمكنك رؤية نظامك كاملا ( إن فعلت هذا فحسب ). و هذا مثالي لجعل الدخولات بعيدا عن الموقع. كذلك كان علينا أن نستعمل OpenSSH لكنني استعملت ssh التجاري للتيسيير ( و هذا ليس عذرا).

المصدر : http://www.ssh.com/products/ssh/download.cfm

ثبّت ssh في /usr/local/ssh_chroot. ثم استعمل مخطوطة برل.

cd /chroot
 # Uncomment the next line if you don't use my config file.
 # ./Config_Chroot.pl config  sshd
./Config_Chroot.pl install sshd
./Config_Chroot.pl start   sshd

اعتقد أنّ الجيد في استجذار ssh أنك إن رغبت في استبدال خادم نقل الملفات ftp، فستحدّ من مجال دخول الجمهور إلى منطقتك. البرنامجان rsync و SCP يعملان معا لتمكين الناس من تنزيل النلفات (upload) . و أنا لا أحبذ أن أجعل خادما لنقل الملفات يمكن للناس دخوله. خوادم ftp المستجذرة كثيرة أيضا، لكنها ما زالت ترسل كلمات السر واضحة، و هذا ما لا أحبذه.

استجذار PostgreSQL

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

المصدر: ftp://ftp.us.postgresql.org/source/v7.1.3/postgresql-7.1.3.tar.gz

صرّف apache ثم ثبتّه في /usr/local/postgres. ثم استعمل مخطوطة برل.

cd /chroot
 # Uncomment the next line if you don't use my config file.
 # ./Config_Chroot.pl config  postgres
./Config_Chroot.pl install postgres
./Config_Chroot.pl start   postgres

استجذار Sendmail

اذهب رأسا و نفّذ مخطوطتي .

cd /chroot
 # Uncomment the next line if you don't use my config file.
 # ./Config_Chroot.pl config  sendmail
./Config_Chroot.pl install sendmail
./Config_Chroot.pl start   sendmail

أما من مشكل؟ بلى، إنه يعمل في حساب الجذر، و كذلك نشأت بعض الملفات في /etc/rc.d/init.d/sendmailعند انطلاقه . مخطوطتي لم تحتسب ذلك. أرجو منك أن تنسخ التعديلات إلى /chroot/sendmail/etc كلما عدلت /etc/mail كما عليك أن تجعل /var/spool/mail يشير إلى /chroot/sendmail/var/spool/mail حتى يستطيع برنامج sendmail و مستعمليه رؤية الملفات نفسها.

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

أمور أخرى للاستجذار

فلسفتي هي أنّ:

  1. أيّ شيء يجب أن يستجذر بما فيها sendmail و ssh و apache و postgresql و syslog و كل الخدمات على الحاسوب.
  2. أيّ شيء يجب أن يعمل في غير حساب الجذر ( عليك أن تنقل المنافذ المحصنة إلى منافذ غير محصنة). هذا ما يشمل sendmail و syslogd كذلك.
  3. الدخولات يجب أن ترسل بعيدا عن الموقع.
  4. كل خدمة لابد لها من جزء من القرص، حتى نحد من مساحة القرص التي قد يستعملها الهاكر، إن رغب أن يكتب ملفات ما. يمكنك أن تستعمل الحلقة المفرغة لتركيب الملفات على نظام الملفات لبعض الخدمات إن كنت تعمل خارج أجزاء القرص.
  5. الجذر يجب أن يمتكل كل الملفات التي لم تعدّل.

و الآن حين وصلنا إلى syslogd و sendmail مازلت أعتقد أنهما يجب أن يعملا في غير حساب الجذر. أما sendmail فقد استعصى علي إعماله في غير حساب الجذر، هذا يعوقني، و لا بد أن هناك مشكلا ما، لكنني مصر على أن ذلك ممكن. و إذا كانت أذونات الملفات تحاط بعناية فإنني أعجب أن لا يعمل sendmail في حساب الجذر. لابد من سبب لهذا لا أعلمه بيد أنني أشك أن هذا العائق لا يمكن تجاوزه.

أما syslogd فلم أجربه بعد، و أود أن أرى الدخولات تعمل في غير حساب الجذر. لكنني لا أعلم لماذا يستعصي. على الأقل قدرت أن استجذره مع كل خدمة على حدى.

الخدمات كلها يجب أن تعمل في غير حساب الجذر، حتى NFS، كلها.

اقتراحات

الخاتمة

الاستجذار رائع، و اعتقد أن إغفاله سيء جدا، و أتمنى لو تفعله التوزيعات كلها، أو بعضها أو أيا منها. ماندريك تتناول توزيعة ريدهات، و تعدلها، فلم لا يأخذ أحد ما توزيعة مندريك و يستجذر خدماتها و يوزعها، إذ لا مانع أن يعدل فلان عمل علان حسب ترخيص GNU/Linux. فلو أرادت بعض الشركات استجذار كل الخدمات و صممت بيئة يمكن للناس أن يستجذروا خدماتهم، فستكون نوزيعة رائعة. تذكر أن الاتجاه السائد في لينكس، أن الناس سئموا من سطر الأوامر، و يتمنون أن يعملوا على الواجهة الرسومية .

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

سوف أحضر " كيف يعمل " howto عن الاستجذار، و أدعو من قد يساعدني لتحويل مقالي إلى lyx لأقدر أن أجعله howto للينكس .

مراجع

  1. إذا ما عدلت مقالي هذا فستجده في http://www.gnujobs.com/Articles/23/chroot.html

مصطلحات

منفذ الأوامر shell
جلسة session
اخترق break in
منفذ port
حساب غير الجذر non-root account
ملفات الدخول logs files
كيف يعمل HowTo
مخطوطة script
برل Perl
صفحة العون man page
مكتبة librery
بعيدا عن الموقع- موقع مقفل offsite
الدخولات logs
منفذ شبكي network port