منذ فترة و انا ابحث عن موضوع يتكلم عن هذا الجبار في عالم السيكيوريتي و الذي يسمى SELinux او Secure Linux ، و طبعا لم أجد اي موضوع عربي يشرح هذه التقنية و احببت ان اعد هذا الموضوع ليكون نقطة انطلاق لكي يعرف الناس ما هو الSELinux .
طبعا الموضوع موجه لمدراء الأنظمة وذوي الخبرة فقط و هو لايناسب الاعمار دون ال18 سنة
لا تأخذوا كلامي على محمل الجد :thumpsup_green:
-مقدمة:
طبعا كميزة جديدة في توزيعات ريدهات لينكس انتربرايز و بالتحديد الاصدار الرابع منها تم اضافة الSELinux لتكون اضافة جديدة لمدراء الانظمة من أجل رفع مستوى الحماية على خوادمهم. و طبعا الSELinux بدأ كمشروع من تطوير الNSA "www.nsa.gov/selinux" كخدمة لمدراء الانظمة ليتمكنوا من عمل تقنيات حماية على مستوى الكيرنل اثناء أداءه لوظائفه العادية.
باستخدام الSELinux يتم تصنيف الخدمات processes لتعمل ضمن ما يسمى الSELinux domain وكل المصادر الأخرى ( مثل الملفات ، السوكتس ، السستم كولز ...) يتم فرض ما تسمى SELinux context عليها، و هي الpolicy أو الآلية التي سيتم تطبيقها في حالة طلب هذا الريسورس (الملف مثلا) من قبل اي خدمة اخرى (مثل الSSH أو الscp على سبيل المثال) . يتم تحميل الpolicy على الكيرنل عادة في مرحلة البووت وهي ستحدد اي process domain يمكنها استخدام اي resource context .
ان اي ميكانيكية للحماية تتطلب ان تكون مرنة وسهلة لمدير النظام بحيث يتجنب المشكلة الشائعة التي يقع فيها اي مدير للحماية و هي هل النظام مكشوف اكثر من اللازم؟ أو انه ليس متوفرا كفاية لباقي الخدمات و المستخدمين؟ لذلك فإن أي مدير للحماية يرغب في استخدام الSELinux عليه ان يسأل نفسه الأسئلة التالية:
1- هل احتاج فعلا الى تفعيل الSELinux ؟
2- اذا كان الجواب بنعم، هل اجعله بوضع الenforcing اي تطبيق الpolicy أم وضع الpermissive اي التحذيري فقط دون منع الخدمات؟
3-ما هي الcontext المناسبة التي سأطبقها على الملف حتى ارفع من مستوى الحماية عليه؟
المنهجية (policy) التي سيختارها مدير النظام لنظامه قد تشكل موضوعا صعبا عليه ، ورغم وجود العديد من المنهجيات او الpolices لكن ريدهات انتربرايز تأتي مع policy واحده رئيسية تسمى targeted وهي تشمل بعض الخدمات الخاصة بالشبكات فقط والخدمات المشمولة هي كالتالي:
dhcpd
httpd
mysqld
named
nscd
ntpd
portmap
postgres
snmpd
squid
syslogd
وطبعا يمكنك تفعيل الcontext على اي خدمة من الخدمات اعلاه و تعطيلها ايضا.
-تفعيل الSELinux
عند تشغيل النظام و في مرحلة البووت يتم تحديد الحالة التي سيعمل فيها الSELinux وهي الحالات الثلاثة التالية:
1-disabled : اي خيار التعطيل و عندها لن يتم تطبيق اي خيار للSELinux .
2-ا permissive : وهي احدى حالات التفعيل للSELinux و تعمل على مبدأ ان اي محاولة لاستخدام الملف المراقب من قبل الcontext سيتم تسجيله في اللوغ /var/log/messeges ولكن لن يتم منع الوصول للريسورس او الملف.
3-enforcing : وهي الحالة الثانية في حالات التفعيل للSELinux حيث يتم منع اي محاولة وصول لا تسمح بها الcontext للملف او الريسورس المطلوب.
-ملف اعدادات الSELinux
في ريدهات انتربرايز المسار لملف الاعدادات الاساسي للSELinux هو :
و هذا مثال لمحتوى الملف:
طبعا الملف واضح و السطر الذي يحتاج للتعديل هو:
طبعا الحالات التي يمكننا استخدامها هي:
permissive , enforcing , disabled
طبعا في حالة التحويل من الوضع disabled الى احد وضعي التفعيل (enforcing , permissive ) فإن ذلك يستلزم عمل اعادة تشغيل للجهاز ليتم تطبيق الخيار على مستوى الكيرنل كما سبق و ذكرنا. ولكني افضل وضعه على الخيار permissive في البداية عند اعادة التشغيل لأن الوضع enforcing قد يبدا بمنع بعض الخدمات من الوصول للملفات عند بدء التشغيل للخدمات مما سيسبب في كثير من الاحيان عدم اقلاع الجهاز بالشكل الطبيعي. و لكن لا تبالي لأنك ستتمكن من الانتقال من الوضعية permissive الى enforcing اثناء العمل دون الحاجة لاعادة تشغيل الجهاز.
- التبديل بين الوضعين التحذيري permissive والوضع التنفيذي enforcing
يمكنك عمل ذلك باستخدام الأمر setenforce على النحو التالي:
طبعا الرقم 0 لتفعيل الخيار permissive التحذيري ، والرقم 1 لتفعيل الخيار enforcing :
طبعا كما لاحظت فإن الأمر getenforce يعطيك الحالة الحالية.
-كيف اشاهد الcontext المطبقة على ملف او خدمة ما؟
الأمرين ps -Z و ls -Z يعطيانك اسماء الcontext المطبقة على خدمة او ملف على الترتيب:
مثال آخر:
- مراقبة محاولات تعدي الSELinux
كما سبق و ذكرت فإن اي محاولة سيتم تسجيلها في الملف var/log/messeges والآتي هو مثال:
طبعا بعض ما نستخلصه من المثال السابق أنه تم عمل منع denied لخدمة برقم 15842 ,وهي الأمر usr/bin/ssh لمحاولة استخدام الريسورس الملف etc/krb5.conf و اسم الcontext التي قامت بمنعه.
-تعديل الcontext المطبقة على ملف
يتم ذلك باستخدام الأمر chcon وهو اختصار ل change context و باسلوب تطبيق context معروفة لملف يعمل جيدا على الملف الذي لا نستطيع الوصول اليه بسبب الSELinux اليكم هذا المثال:
لدينا ملف اسمه named.conf يقوم الSELinux بمنع الوصول اليه، ولدينا ملف آخر اسمه named.conf.rpmorig يعمل بشكل طبيعي و غير محجوب بواسطة الSELinux ، عندها نقوم بالتالي:
-تفعيل او تعطيل الcontext على خدمة معينة.
يمكننا تعديل بعض المتغيرات الخاصة بالcontext المطبقة على خدمة بعينها بعمل on أو off لها و باستخدام الأمر setsebool الاختصار لset SELinux boolean و المثال التالي يوضح الآلية:
الأمر getsebool سيعطينا معلومة عن حالة الcontext وهل هي فعالة أم لا على خدمة معينة:
لتفعيل context معينة يمكننا عمل التالي:
كما هو واضح من المثال فإننا قمنا بتفعيل context على احدى الخدمات الخاصة باللوغ وهي الsyslogd
طبعا هذه المتغيرات يتم تخزينها بشكل مؤقت في الملف :
شاهد المثال التالي الذي يستعرض المتغيرات المخزنة فيه:
ذكرت أن القيم ستعود لحالتها الأصلية عند اعادة التشغيل (active or inactive) واذا رغبت في تثبيتها استخدم الخيار -P مع الأمر setsebool .
-استخدام graphical tool
لمستخدمي ريدهات انتربرايز يمكنك تعديل خيارات الSELinux باستخدام الأداة system-config-securitylevel وهذه صورة للأداة:

-الخاتمة
ارجو ان يكون الموضوع قد حاز على اعجابكم و رضاكم و اريد ان اوضح انني لم أتطرق لكثير من الأمور الأخرى التي يتميز فيها الSELinux حيث ان هناك كورس كامل في شهادة الRHCSS يشرح عن هذا الموضوع و لن استطيع شمله في موضوعي هذا ، ولكنه يشكل نقطة انطلاق جيدة للراغبين في التعرف على هذه التقنية الجديدة. و في النهاية ارجوكم ثم ارجوكم ان لا تنسوني من دعائكم في قلوبكم لأني في أمس الحاجة اليه
طبعا الموضوع موجه لمدراء الأنظمة وذوي الخبرة فقط و هو لايناسب الاعمار دون ال18 سنة

-مقدمة:
طبعا كميزة جديدة في توزيعات ريدهات لينكس انتربرايز و بالتحديد الاصدار الرابع منها تم اضافة الSELinux لتكون اضافة جديدة لمدراء الانظمة من أجل رفع مستوى الحماية على خوادمهم. و طبعا الSELinux بدأ كمشروع من تطوير الNSA "www.nsa.gov/selinux" كخدمة لمدراء الانظمة ليتمكنوا من عمل تقنيات حماية على مستوى الكيرنل اثناء أداءه لوظائفه العادية.
باستخدام الSELinux يتم تصنيف الخدمات processes لتعمل ضمن ما يسمى الSELinux domain وكل المصادر الأخرى ( مثل الملفات ، السوكتس ، السستم كولز ...) يتم فرض ما تسمى SELinux context عليها، و هي الpolicy أو الآلية التي سيتم تطبيقها في حالة طلب هذا الريسورس (الملف مثلا) من قبل اي خدمة اخرى (مثل الSSH أو الscp على سبيل المثال) . يتم تحميل الpolicy على الكيرنل عادة في مرحلة البووت وهي ستحدد اي process domain يمكنها استخدام اي resource context .
ان اي ميكانيكية للحماية تتطلب ان تكون مرنة وسهلة لمدير النظام بحيث يتجنب المشكلة الشائعة التي يقع فيها اي مدير للحماية و هي هل النظام مكشوف اكثر من اللازم؟ أو انه ليس متوفرا كفاية لباقي الخدمات و المستخدمين؟ لذلك فإن أي مدير للحماية يرغب في استخدام الSELinux عليه ان يسأل نفسه الأسئلة التالية:
1- هل احتاج فعلا الى تفعيل الSELinux ؟
2- اذا كان الجواب بنعم، هل اجعله بوضع الenforcing اي تطبيق الpolicy أم وضع الpermissive اي التحذيري فقط دون منع الخدمات؟
3-ما هي الcontext المناسبة التي سأطبقها على الملف حتى ارفع من مستوى الحماية عليه؟
المنهجية (policy) التي سيختارها مدير النظام لنظامه قد تشكل موضوعا صعبا عليه ، ورغم وجود العديد من المنهجيات او الpolices لكن ريدهات انتربرايز تأتي مع policy واحده رئيسية تسمى targeted وهي تشمل بعض الخدمات الخاصة بالشبكات فقط والخدمات المشمولة هي كالتالي:
dhcpd
httpd
mysqld
named
nscd
ntpd
portmap
postgres
snmpd
squid
syslogd
وطبعا يمكنك تفعيل الcontext على اي خدمة من الخدمات اعلاه و تعطيلها ايضا.
-تفعيل الSELinux
عند تشغيل النظام و في مرحلة البووت يتم تحديد الحالة التي سيعمل فيها الSELinux وهي الحالات الثلاثة التالية:
1-disabled : اي خيار التعطيل و عندها لن يتم تطبيق اي خيار للSELinux .
2-ا permissive : وهي احدى حالات التفعيل للSELinux و تعمل على مبدأ ان اي محاولة لاستخدام الملف المراقب من قبل الcontext سيتم تسجيله في اللوغ /var/log/messeges ولكن لن يتم منع الوصول للريسورس او الملف.
3-enforcing : وهي الحالة الثانية في حالات التفعيل للSELinux حيث يتم منع اي محاولة وصول لا تسمح بها الcontext للملف او الريسورس المطلوب.
-ملف اعدادات الSELinux
في ريدهات انتربرايز المسار لملف الاعدادات الاساسي للSELinux هو :
كود:
/etc/sysconfig/selinux
كود:
[[email protected] ~]$ cat /etc/sysconfig/selinux # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - SELinux is fully disabled. SELINUX=permissive # SELINUXTYPE= type of policy in use. Possible values are: # targeted - Only targeted network daemons are protected. # strict - Full SELinux protection. SELINUXTYPE=targeted
كود:
SELINUX=permissive
permissive , enforcing , disabled
طبعا في حالة التحويل من الوضع disabled الى احد وضعي التفعيل (enforcing , permissive ) فإن ذلك يستلزم عمل اعادة تشغيل للجهاز ليتم تطبيق الخيار على مستوى الكيرنل كما سبق و ذكرنا. ولكني افضل وضعه على الخيار permissive في البداية عند اعادة التشغيل لأن الوضع enforcing قد يبدا بمنع بعض الخدمات من الوصول للملفات عند بدء التشغيل للخدمات مما سيسبب في كثير من الاحيان عدم اقلاع الجهاز بالشكل الطبيعي. و لكن لا تبالي لأنك ستتمكن من الانتقال من الوضعية permissive الى enforcing اثناء العمل دون الحاجة لاعادة تشغيل الجهاز.
- التبديل بين الوضعين التحذيري permissive والوضع التنفيذي enforcing
يمكنك عمل ذلك باستخدام الأمر setenforce على النحو التالي:
كود:
[[email protected] ~]# setenforce 0 [[email protected] ~]# getenforce Permissive
كود:
[[email protected] ~]# setenforce 1 [[email protected] ~]# getenforce Enforcing
-كيف اشاهد الcontext المطبقة على ملف او خدمة ما؟
الأمرين ps -Z و ls -Z يعطيانك اسماء الcontext المطبقة على خدمة او ملف على الترتيب:
كود:
[[email protected] ~]$ ps ax -Z LABEL PID TTY STAT TIME COMMAND user_u:system_r:unconfined_t 1 ? S 0:00 init [5] user_u:system_r:unconfined_t 2 ? SN 0:00 [ksoftirqd/0] user_u:system_r:unconfined_t 3 ? S< 0:00 [events/0] user_u:system_r:unconfined_t 4 ? S< 0:00 [khelper] ... user_u:system_r:syslogd_t 2251 ? Ss 0:00 syslogd -m 0 user_u:system_r:unconfined_t 2255 ? Ss 0:00 klogd -x user_u:system_r:portmap_t 2277 ? Ss 0:00 portmap root:system_r:httpd_t 3955 ? Ss 0:00 /usr/sbin/httpd root:system_r:httpd_t 3956 ? S 0:00 /usr/sbin/httpd ...
كود:
[[email protected] ~]$ ls -a -Z drwxr-xr-x student student root:object_r:file_t . drwxr-xr-x root root .. -rw------- student student user_u:object_r:file_t .bash_history -rw-r--r-- student student root:object_r:file_t .bash_logout -rw-r--r-- student student root:object_r:file_t .bash_profile -rw-r--r-- student student root:object_r:file_t .bashrc drwx------ student student user_u:object_r:file_t .gconf drwx------ student student user_u:object_r:file_t .gconfd
كما سبق و ذكرت فإن اي محاولة سيتم تسجيلها في الملف var/log/messeges والآتي هو مثال:
كود:
kernel: audit(1122958950.808:0): avc: denied { getatt r }for pid=15842 exe=/usr/bin/ssh path=/etc/krb5.conf dev=hda3 ino=609458 scon text=root:system_r:httpd_sys_script_t tcontext=system_u:object_r:krb5_conf_t tcl ass=file
-تعديل الcontext المطبقة على ملف
يتم ذلك باستخدام الأمر chcon وهو اختصار ل change context و باسلوب تطبيق context معروفة لملف يعمل جيدا على الملف الذي لا نستطيع الوصول اليه بسبب الSELinux اليكم هذا المثال:
لدينا ملف اسمه named.conf يقوم الSELinux بمنع الوصول اليه، ولدينا ملف آخر اسمه named.conf.rpmorig يعمل بشكل طبيعي و غير محجوب بواسطة الSELinux ، عندها نقوم بالتالي:
كود:
[[email protected] ~]# chcon --reference=/etc/named.conf.rpmorig /etc/named.conf
يمكننا تعديل بعض المتغيرات الخاصة بالcontext المطبقة على خدمة بعينها بعمل on أو off لها و باستخدام الأمر setsebool الاختصار لset SELinux boolean و المثال التالي يوضح الآلية:
الأمر getsebool سيعطينا معلومة عن حالة الcontext وهل هي فعالة أم لا على خدمة معينة:
كود:
[[email protected] ~]# getsebool -a allow_ypbind --> active dhcpd_disable_trans --> inactive httpd_disable_trans --> inactive httpd_enable_cgi --> active httpd_enable_homedirs --> active ...
كود:
[[email protected] ~]# getsebool syslogd_disable_trans syslogd_disable_trans --> inactive [[email protected] ~]# setsebool syslogd_disable_trans 1 [[email protected] ~]# getsebool syslogd_disable_trans syslogd_disable_trans --> active
طبعا هذه المتغيرات يتم تخزينها بشكل مؤقت في الملف :
كود:
/etc/selinux/targeted/booleans
كود:
[[email protected] ~]# cat /etc/selinux/targeted/booleans httpd_enable_cgi=1 httpd_enable_homedirs=1 httpd_ssi_exec=1 named_write_master_zones=0 httpd_unified=1 httpd_tty_comm=0
-استخدام graphical tool
لمستخدمي ريدهات انتربرايز يمكنك تعديل خيارات الSELinux باستخدام الأداة system-config-securitylevel وهذه صورة للأداة:

-الخاتمة
ارجو ان يكون الموضوع قد حاز على اعجابكم و رضاكم و اريد ان اوضح انني لم أتطرق لكثير من الأمور الأخرى التي يتميز فيها الSELinux حيث ان هناك كورس كامل في شهادة الRHCSS يشرح عن هذا الموضوع و لن استطيع شمله في موضوعي هذا ، ولكنه يشكل نقطة انطلاق جيدة للراغبين في التعرف على هذه التقنية الجديدة. و في النهاية ارجوكم ثم ارجوكم ان لا تنسوني من دعائكم في قلوبكم لأني في أمس الحاجة اليه

تعليق