مقال :مقدمه الى SELinux الجزء الثاني- الملفات والعمليات
في الجزء الأول من سلسلة SELinux تعرفنا على كيفية تفعيل وإلغاء تفعيل SELinux وتغير بعض الإعدادات الخاصة بالسياسة باستخدام القيم المنطقية Boolean values. في هذا المقال سوف نتعرف على security contexts الخاصة بالملفات والعمليات.
للتذكير فقط بالجزء الأول:
File security context: هو النوع type
Process security context: هو المجال domain
ملاحظة: كل التعليمات وحزم البيانات والملفات التي سوف نتعامل معها في هذا المقال تم تجريبها على نظام التشغيل CentOS 7 بشكل كامل فإن المبادئ تبقى نفسها في التوزيعات الأخرى.
في هذا المقال سنقوم بتشغيل التعليمات بصلاحيات root إذا لم تكن تستطيع العمل على حساب بصلاحيات root يمكنك استخدام حساب له صلاحيات sudo privileges واستخدام “sudo” قبل أي تعليمة.
إنشاء حسابات تجريبية
في البداية سنقوم بخلق أربعة حسابات تجريبية لنتمكن من إثبات وعرض إمكانيات SELinux:
- regularuser
- switcheduser
- guestuser
- restricteduser
يجب أن نملك صلاحيات root، لنبدأ باستخدام التعليمة التالية لإضافة حساب مستخدم باسم regularuser
useradd -c “Regular User” regularuser
ومن ثم يمكننا استخدام التعليمة “passwd” لضبط كلمة السر لهذا الحساب
passwd regularuser
سيتطلب مننا إدخال كلمة السر الجديدة وتأكيدها ومن ثم سيكون الحساب جاهز للاستخدام
Changing password for user regularuser.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
وبنفس الطريقة لنقوم بخلق حسابات لباقي المستخدمين
useradd -c “Switched User” switcheduser
passwd switcheduser
useradd -c “Guest User” guestuser
passwd guestuser
useradd -c “Restricted Role User” restricteduser
passwd restricteduser
SELinux من أجل الملفات والعمليات
الهدف من استخدام SELinux هو حماية عملية الوصول إلى الملفات في نظام لينكس. بدون SELinux فإن العملية أو التطبيق مثل سيرفر الأباتشي Apache سوف يعمل بحالة المستخدم الذي قام بتشغيله.
وإذا تم الوصول إلى النظام من قبل تطبيق خبيث يعمل بصلاحيات root فإن التطبيق قادر على عمل أي شيء يريده لأنه يملك صلاحيات root وله كامل الحقوق والصلاحيات على كل الملفات.
SELinux تحاول التقدم خطوة للأمام لتجاوز هذه المخاطر، عند تطبيق SELinux فإن العمليات processes والتطبيقات application لها الحقوق والصلاحيات التي تحتاجها لتعمل ولا شيء غير ذلك.
سياسة SELinux الخاصة بالتطبيقات سوف تحدد ما هي أنواع الملفات التي تحتاج الوصول إليها وماهي العمليات المسموح لها تنفيذها. سياسات SELinux يتم كتابتها من قبل مطور التطبيق وتنتقل إلى توزيعه لينكس التي تدعمها، السياسة هي مجموعة من القواعد التي تحدد للعمليات والمستخدمين الحقوق والصلاحيات الخاصة بهم.
نبدأ هذا المقال بفهم ماهي SELinux contexts and domains
أول جزء من الحماية يتم من خلال تخصيص وسم label لكل شيء موجود في نظام لينكس. الوسم label هو مثل أي صفة أخرى للملف أو للعملية (المالك، المجموعة، تاريخ الإنشاء) , وهي تظهر حالة context الخاصة بالمصادر .
ماهي الحالة context ؟؟؟
هي مجموعة من معلومات الحماية التي تساعد SELinux في اتخاذ قرارات التحكم بالوصول.
كل شيء في نظام لينكس يمكن أن يملك security context (حساب المستخدم، الملف، المجلد، المنفذ) ولكن security context تختلف باختلاف أنواع الأشياء التي تتعامل معها.
SELinux File Contexts
لنتمكن من فهم SELinux file contexts سنبدأ برؤية نتيجة تنفيذ التعليمة ls –l في المجلد etc/
ls -l /etc/*.conf
نتيجة تنفيذ هذه التعليمة سيكون مشابه للتالي:
... -rw-r--r--. 1 root root 19 Aug 19 21:42 /etc/locale.conf -rw-r--r--. 1 root root 662 Jul 31 2013 /etc/logrotate.conf -rw-r--r--. 1 root root 5171 Jun 10 07:35 /etc/man_db.conf -rw-r--r--. 1 root root 936 Jun 10 05:59 /etc/mke2fs.conf ...
لنقم بإضافة Z- للتعليمة السابقة
ls -Z /etc/*.conf
سوف نحصل على عمود إضافي بعد المستخدم والمجموعة والمالك
…
-rw-r–r–. root root system_u:object_r:locale_t:s0 /etc/locale.conf
-rw-r–r–. root root system_u:object_r:etc_t:s0 /etc/logrotate.conf
-rw-r–r–. root root system_u:object_r:etc_t:s0 /etc/man_db.conf
-rw-r–r–. root root system_u:object_r:etc_t:s0 /etc/mke2fs.conf
…
هذا العمود يظهر security contexts لهذه الملفات.
يمكننا أن نقول عن ملف أنه يملك وسم label خاص ب security context عندما يملك الملف هذه المعلومات.
-rw-r–r–. root root system_u:object_r:etc_t:s0 /etc/logrotate.conf
Security contexts هي هذه المعلومات:
system_u:object_r:etc_t:s0
يوجد أربع أجزاء منفصلة باستخدام النقطتين ” : ” وكل جزء هو security context :
- الجزء الأول: هو SELinux user context الخاص بالملف (سيتم مناقشته لاحقاً ولكن الآن هو system_u).
كل حساب لمستخدم في نظام لينكس يتم اعتباره على انه مستخدم SELinux وفي هذا المثال فإن المستخدم root مالك هذا الملف تم اعتباره على أنه المستخدم system_u SELinux user.
هذه العملية تتم من وفق السياسة الخاصة ب SELinux.
- الجزء الثاني: هو SELinux role (الأدوار) وفي هذا المثال هو object_r لمعرفة ما هي SELinux roles يمكنك مراجعة الجزء الأول من هذه السلسلة.
- الجزء الثالث: هو type (النوع) وفي هذا المثال هو etc_t.
وهذا الجزء يعرف ما هو النوع type الذي ينتمي له الملف أو المجلد، كما ترى فإن معظم الملفات الموجودة في المجلد etc/ تنتمي إلى etc_t type.
يمكن أن تعتقد بأن النوع type هو جزء من “group” أو جزء من الوصف الخاص بالملف، النوع type هو طريقة لتصنيف هذا الملف.
يمكننا أن نرى بعض الملفات التي من الممكن أن تنتمي لأنواع أخرى مثل locale.conf الذي له النوع locale_t
حتى ولو كانت كل الملفات تابعة لنفس المستخدم ولنفس المجموعة يمكن أن تنتمي لأنواع types مختلفة.
مثال أخر: لنقم بفحص type context للمجلد home
ls -Z /home
المجلد home يملك type context مختلف userhomedir_t:
drwx——. guestuser guestuser unconfined_u:object_r:user_home_dir_t:s0 guestuser
drwx——. root root system_u:object_r:lost_found_t:s0 lost+found
drwx——. regularuser regularuser unconfined_u:object_r:user_home_dir_t:s0 regularuser
drwx——. restricteduser restricteduser unconfined_u:object_r:user_home_dir_t:s0 restricteduser
drwx——. switcheduser switcheduser unconfined_u:object_r:user_home_dir_t:s0 switcheduser
drwx——. sysadmin sysadmin unconfined_u:object_r:user_home_dir_t:s0 sysadminunconfined_u:object_r:user_home_dir_t:s0 sysadmin
- الجزء الرابع: هو security context وفي هذا المثال هو s0 وهو يعمل مع MLS – multilevel security وهو طريقة أخرى من أجل تطبيق سياسة الحماية الخاصة ب SELinux وهذا الجزء يعرض حساسية sensitivity المصادر (s0) سوف نتحدث عن الحساسية sensitivity وعن التصنيف categories لاحقاً. أول ثلاث أجزاء هي المهمة من أجل إعداد SELinux.
SELinux Process Contexts
يمكننا تشغيل خدمة الأباتشي وخدمة SFTP (قمنا بتنصيبها في الجزء الأول من هذه السلسلة) باستخدام التعليمات التالية:
service httpd start
service vsftpd start
يمكننا استخدام التعليمة “ps” مع بعض الإضافات لرؤية العمليات الخاصة بكل من Apache and SFTP على السيرفر
ps -efZ | grep ‘httpd\|vsftpd’
Z- يستخدم لعرض SELinux contexts. نتيجة تنفيذ هذه التعليمة سوف تعرض العمليات الجارية ورقم العملية ورقم العملية الأب لكل عملية:
system_u:system_r:httpd_t:s0 root 7126 1 0 16:50 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 7127 7126 0 16:50 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 7128 7126 0 16:50 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 7129 7126 0 16:50 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 7130 7126 0 16:50 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:httpd_t:s0 apache 7131 7126 0 16:50 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND system_u:system_r:ftpd_t:s0-s0:c0.c1023 root 7209 1 0 16:54 ? 00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 root 7252 2636 0 16:57 pts/0 00:00:00 grep --color=auto httpd\|vsftpd
security context هو:
system_u:system_r:httpd_t:s0
وهو مكون من أربع أجزاء:
- User
- Role
- Doming
- Sensitivity
User , role and sensitivity هي نفسها لكل الملفات ولكن domain يختلف بين العمليات.
في المثال السابق يمكننا رؤية بعض العمليات التي تعمل ضمن httpd_t domain وعملية أخرى تعمل ضمن ftpd_t domain
ماذا يفعل المجال domain للعمليات ؟؟؟
إنه يقوم بإعطاء العملية حالة context لتعمل بها، كفقاعة حول العملية (حدود للعملية). وهو الذي يخبر العملية ما الأمور التي تستطيع القيام بها والأمور التي ممنوع القيام بها. ومن خلال هذا التقييد يتم التأكيد على أن كل مجال process domain يستطيع التعامل مع أنواع محددة من الملفات ولا شيء أكثر من ذلك. باستخدام هذه الطريقة حتى ولو تم سرقة العملية من قبل عملية أخرى أو من قبل مستخدم شرير فإن أسواء الاحتمالات هو تخريب الملفات التي يمكن الوصول إليها فقط من قبل هذه العملية.
مثلاً: العملية vsftp لا تملك وصول إلى الملفات المستخدمة من قبل sendmail or samba هذا التقييد يتم على مستوى النواة kernel level وهو يطبق بالقوة من قبل سياسة SELinux التي يتم تحميلها إلى الذاكرة وبالتالي فإن التحكم بالوصول أصبح أمر إلزامي.
التسميات
SELinux تستخدم اللاحقات التالية:
u: للإشارة إلى المستخدمين users
r: للإشارة إلى القواعد roles
t: للإشارة إلى الأنواع types للملفات وللإشارة إلى المجالات domains للعمليات.
كيف تصل العمليات إلى المصادر
تعرفنا على الملفات والعمليات و الحالات contexts التي تقوم بتحديد الأنواع types والمجالات domains المملوكة من قبل الملفات والعمليات.
كيف تعمل العملية ؟؟؟
العملية تحتاج للوصول إلى الملفات للقيام ببعض المهام (فتح ملف والقراءة منه أو التعديل عليه أو تنفيذ ملف) كل عملية يمكنها الوصول فقط إلى أنواع محددة من المصادر (ملفات ومجلدات ومنافذ وأمور أخرى). SELinux تحدد هذا الوصول من خلال السياسة الخاصة بها.
قواعد الوصول يمكن تعريفها باستخدام التعليمة التالية:
allow <domain> <type>:<class> { <permissions> };
تحدثنا مسبقاً عن الأنواع types والمجالات domains
سنتعرف على class والذي يعرف ماهي المصادر المسموح بالوصول لها (ملفات، مجلدات، أجهزة، منافذ)
التعليمة السابقة يمكن شرحها كالتالي:
- إذا كانت العملية ضمن مجال domain معين.
- وإذا كانت المصادر التي تحاول الوصول إليها موجودة ضمن class and type معين.
- اسمح لها بالوصول.
- وإلا امنعها من الوصول.
لنرى كيف تعمل هذه التقنية، لنفترض أن الحالات contexts الخاصة بعملية httpd التي تعمل على نظام التشغيل CentOS 7 هي:
system_u:system_r:httpd_t:s0 7126 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 7127 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 7128 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 7129 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 7130 ? 00:00:00 httpd
system_u:system_r:httpd_t:s0 7131 ? 00:00:00 httpd
المسار الافتراضي لسيرفر الويب هو var/www/html/ .لنقم بخلق ملف ضمن هذا المسار ومن ثم نفحص الحالة context الخاص به.
touch /var/www/html/index.html
ls -Z /var/www/html/*
File context لمحتوى الويب ستكون httpdsyscontent_t :
-rw-r–r–. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
يمكننا استخدام تعلمية sesearch لعرض الأنواع types المسموح الوصول إليها من قبل العملية httpd:
sesearch –allow –source httpd_t –target httpd_sys_content_t –class file
source domain: هو httpd_t وهو المجال domain الخاص بالأباتشي. إهتمامنا سيكون حول المصادر الهدف target resources وهي الملفات التي تملك httpdsyscontent_t : type context.
نتيجة تنفيذ التعليمة السابقة ستكون كالتالي:
Found 4 semantic av rules:
allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ;
allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
allow httpd_t httpdcontent : file { ioctl read write create getattr setattr lock append unlink link rename execute open } ;
السطر الأول:
allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ;
يعني أن httpd (سيرفر الأباتشي) يستطيع التحكم بالدخل والخرج I/O control ويستطيع القراءة والحصول على الوصف get attribute وقفل وفتح الملفات ضمن النوع httpdsyscontent type. في هذا المثال فإن الملف index.html موجود ضمن نفس هذا النوع. لنقم بتعديل الصفحة السابقة الموجودة في المسار التالي: /var/www/html/index.html/
لتحوي على التالي:
<html>
<title>
This is a test web page
</title>
<body>
<h1>This is a test web page</h1>
</body>
</html>
ومن ثم لنقم بتغيير الصلاحيات للمجلد /var/www/ ومحتوياته
chmod -R 755 /var/www
ومن ثم لنقم بإعادة تشغيل سيرفر الأباتشي
service httpd restart
لنقم الآن بطلب هذا الملف من المتصفح:
يمكننا الوصول لهذا الملف وهذا يعني أن httpd مسموح لها الوصول لهذا النوع من الملفات. نقم بعملية تغيير بسيطة من خلال تعديل الحالة context لهذا الملف. سوف نستخدم التعليمة chcon مع إضافة –type وهذا يسمح لنا بتحديد النوع الجديد للمصادر الهدف
chcon –type var_t /var/www/html/index.html
قمنا بتغيير نوع الملف إلى var_t . يمكننا التأكد من ذلك باستخدام التعليمة التالية:
ls -Z /var/www/html/
نتيجة تنفيذ هذه التعليمة:
-rwxr-xr-x. root root unconfined_u:object_r:var_t:s0 index.html
لنقم الآن بمحاولة الوصول لنفس الصفحة السابقة (httpd يحاول قراءة هذا الملف)
سوف نحصل على رسالة الخطأ forbidden
ماذا حدث هنا ؟؟؟؟
تم منع عملية الوصول لهذا الملف. سيرفر الويب مسموح له الوصول فقط إلى أنواع محددة من الملفات والنوع vart ليس من ضمن هذه الأنواع. عندما قمنا تغير الحالة context للملف index.html لتصبح vart فإن سيرفر الأباتشي لم يستطع قراءة هذا الملف وحصلنا على رسالة الخطأ السابقة. للسماح بقراءة الملف سنقوم بتغيير نوع الملف باستخدام التعليمة restorcon مع الخيار –v الذي يظهر التغير الذي تم على context labels.
restorecon -v /var/www/html/index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:var_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
الآن وإذا قمنا بطلب الصفحة السابقة فسوف يتم فتحها ولن نحصل على رسالة الخطأ. الأمر المهم الذي يجب عليك فهمه هو التأكد من أن المجلدات تملك context الصحيح.
وراثة الحالة context للمجلدات والملفات
بغض النظر عن السياسة المطبقة يمكننا خلق ملفات أو عمليات جديدة لها نفس الحالة context الخاصة بالعملية الأب أو المجلد الأصل.
(وراثة الحالة context inheritance)
إذا كان لدينا عملية لها الاسم “proca” وقامت بتوليد عملية أخرى لها الاسم “procb” فإن العملية الجديدة سوف تعمل ضمن نفس المجال domain والذي له الاسم proc_a بغض النظر عن السياسة المطبقة من قبل SELinux.
وبشكل مشابه إذا كان لدينا مجلد له النوع type: somecontext وقمنا بخلق ملف ضمن هذا المجلد فإن هذا الملف سوف يكون له نفس النوع بغض النظر عن السياسة المطبقة من قبل SELinux. لنقم بعرض الحالات contexts الخاصة بالمجلد /var/www/
ls -Z /var/www
المجلد html الموجود ضمن المجلد /var/www/ له type context: httpdsyscontent_t . وكما رأينا سابقاً فإن الملف index.html (الموجود في هذا المجلد) له نفس النوع أيضاً:
drwxr-xr-x. root root system_u:object_r:httpd_sys_script_exec_t:s0 cgi-bin
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html
هذه الوراثة لا تتم عندما نقوم بنسخ ملفات من مكان لآخر. في عملية النسخ سيتم تحديد نوع الملف بحسب نوع المجلد الهدف (مكان اللصق). لنقم بنسخ الملف index.html والذي له type context: httpdsyscontent_t. إلى المجلد /var/
cp /var/www/html/index.html /var/
إذا قمنا بعرض الحالة الخاصة بملف في المكان الجيد فسوف تكون vsr_t :
ls -Z /var/index.html
-rwxr-xr-x. root root unconfined_u:object_r:var_t:s0 /var/index.html
يمكننا إلغاء التغيير في الحالة عند عملية النسخ باستخدام الخيار preserver=context– مع تعلمية النسخ cp.
عندما يتم نقل أو نسخ مجلد أو ملف فإن الحالة الاصلية original context تبقى نفسها. في المثال التالي قمنا بنقل الملف /var/index.html إلى المجلد /etc/
mv /var/index.html /etc/
وعند فحص الحالة الجديدة في المجلد /etc/ نجد أنها لم تتغير وهي var_t
ls -Z /etc/index.html
-rwxr-xr-x. root root unconfined_u:object_r:var_t:s0 /etc/index.html
لماذا يجب أن نهتم بالحالات contexts في عمليات النسخ والنقل ؟؟؟
فكر في السيناريو التالي: إذا كنت تريد نسخ ملفات HTML الخاصة بسيرفر الويب إلى مجلد منفصل ضمن المجلد الرئيسي root folder. ولأسباب تتعلق بالحماية، لا تريد لأي مهاجم أن يستطيع بسهولة تخمين مكان ملفات الموقع. قمت بتحديث التحكم بالوصول للمجلد وقمت بتعديل ملف الإعدادات الخاص بالويب للإشارة إلى المكان الجديد وقمت بإعادة تشغيل سيرفر الأباتشي ولكن عملية الوصول لصفحات الويب لم تنجح. إذا نظرت إلى الحالات contexts الخاصة بالمجلد والملفات الموجودة في داخله سوف تعرف سبب هذه المشكلة.
تجريب File Context Error
في البداية لنقم بخلق مجلد له الاسم www ضمن المجلد الرئيسي root ومن ثم لنقم بخلق مجلد باسم html ضمن المجلد www
mkdir -p /www/html
لنقم بكتابة التعليمة التالية:
ls -Z /www/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 html
كما ترى فإن context: default_t . لنقم بنسخ محتوى المجلد /var/www/html إلى المجلد /www/html
cp /var/www/html/index.html /www/html/
الملفات التي تم نسخها سيكون لها نفس الحالة default_t. لنقم الآن بتعديل ملف الإعدادات httpd.conf للإشارة إلى المجلد الجديد الموجود ضمن المسار /www/html
vi /etc/httpd/conf/httpd.conf
تعديل هذا الملف يتم من خلال فتح الملف باستخدام محرر النصوص (vi في هذا المثال) ومن ثم إضافة الإشارة # إلى المسار القديم ليصبح عبارة عن تعليق وإضافة المسار الجديد
# DocumentRoot “/var/www/html”
DocumentRoot “/www/html”
سنقوم أيضاً بتعديل حقوق الوصول لتصيح كالتالي:
#<Directory “/var/www”>
# AllowOverride None
# Allow open access:
# Require all granted
#</Directory><Directory “/www”>
AllowOverride None
# Allow open access:
Require all granted
</Directory>
ومن ثم حفظ هذا التغيير وإعادة تشغيل الأباتشي
service httpd restart
بعد الانتهاء من عملية التعديل السابقة وعند محاولة الوصول لصفحة الويب index.html سوف نحصل على رسالة الخطأ 403 forbidden
السبب هو أن الملف index.html قد تغيرت الحالة context الخاصة به أثناء عملية النسخ ويجب إعادتها لحالتها الأصلية httpdsyscontent_t.
ولكن كيف يتم ذلك ؟؟؟
تغير واستعادة SELinux File Contexts
في المثال السابق استخدمنا التعليمات chcon and resstorecon. تشغيل التعليمة chcon هو إجراء مؤقت ويمكننا استخدامه في حالات تصليح الأخطاء الخاصة بمنع الوصول ويمكننا استخدام التعليمة restorecon للعودة للحالة السابقة. تشغيل التعليمة chcon يتطلب معرفة الحالة الصحيحة للملف من خلال إضافة type– لتحديد الحالة للهدف. التعليمة restorecon لا تتطلب تحديد ذلك وبمجرد تنفيذ هذه التعليمة سيتم إعادة تطبيق الحالة الصحيحة للملف وهذا التغير سيكون بشكل دائم. كيف سيعرف النظام أي حالة يجب أن يطبقها عند تنفيذ التعليمة restorcon.
SELinux تتذكر الحالة لكل ملف أو مجلد في السيرفر.
في نظام CentOS 7 فإن الحالات contexts موجودة في الملف التالي:
/etc/selinux/targeted/contexts/files/file_contexts
الحالات contexts للمجلدات والملفات الجديدة تسجل في الملف التالي:
/etc/selinux/targeted/contexts/files/file_contexts.local
عندما نقوم بتنفيذ التعليمة restorecon فإن SELinux يبحث عن الحالة الصحيحة في الملفين السابقين ويقوم بتطبيقها.
محتوى الملف السابق يمكن عرضه باستخدام التعليمة التالية:
cat /etc/selinux/targeted/contexts/files/file_contexts
…
/usr/(.*/)?lib(/.*)? system_u:object_r:lib_t:s0
/opt/(.*/)?man(/.*)? system_u:object_r:man_t:s0
/dev/(misc/)?agpgart -c system_u:object_r:agp_device_t:s0
/usr/(.*/)?sbin(/.*)? system_u:object_r:bin_t:s0
/opt/(.*/)?sbin(/.*)? system_u:object_r:bin_t:s0
/etc/(open)?afs(/.*)? system_u:object_r:afs_config_t:s0
…
لتغير حالة الملف index.html ضمن المسار www/html/ : نستخدم التعليمة semanage fcontext والتي تقوم بكتابة الحالة الجديدة في الملف /etc/selinux/targeted/contexts/files/file_contexts.local .
semanage fcontext –add –type httpd_sys_content_t “/www(/.*)?”
semanage fcontext –add –type httpd_sys_content_t “/www/html(/.*)?”
للتأكد من ذلك يمكننا فحص محتوى ملف الإعدادات
cat /etc/selinux/targeted/contexts/files/file_contexts.local
يجب أن نرى التعديل كالتالي:
# This file is auto-generated by libsemanage
# Do not edit directly./www(/.*)? system_u:object_r:httpd_sys_content_t:s0
/www/html(/.*)? system_u:object_r:httpd_sys_content_t:s0
ثم يمكننا تنفيذ التعليمة restorecon
restorecon -Rv /www
هذه التعليمة تقوم بإعادة ضبط الحالة على ثلاث مستويات:
- المستوى الأعلى /www
- ثم على المستوى /www/html
- ثم على مستوى الملفات الموجودة في هذا المجلد مثل الملف /www/html/index.html
restorecon reset /www context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /www/html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 restorecon reset /www/html/index.html context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
الآن وإذا حاولنا الوصول لصفحة الويب السابقة فسوف تنجح العملية ولن نحصل على رسالة الخطأ.
الأداة matchpathcon يمكن أن تساعد في مشاكل تصليح الأخطاء، هذه الأداة تقوم بالنظر إلى الحالة الحالية للمصادر وتقارنها مع محتوى قاعدة البيانات SELinux context database وإذا وجدت اختلاف تقترح اجراء التعديل.
matchpathcon -V /www/html/index.html
-V: للتحقق من الحالة.
النتيجة ستكون كالتالي:
/www/html/index.html verified.
في حال وجود ملف له وسم خاطئ سوف تكون النتيجة كالتالي:
/www/html/index.html has context unconfined_u:object_r:default_t:s0, should be system_u:object_r:httpd_sys_content_t:s0
انتقال المجال Domain Transition
تعرفنا على كيفية وصول العمليات لمصادر النظام، سنتعرف الآن على كيفية وصول العمليات لعمليات أخرى.
Domain transition: في هذه الطريقة تقوم العملية بتغيير الحالة context الخاصة بها من مجال domain لمجال أخر. ليكن لدينا العملية “proca” والتي تعمل ضمن الحالة context: contextat. باستخدام domain transition فإن العملية proca يمكنها تشغيل التطبيق (البرنامج أو السكريبت التنفيذي) ذو الاسم appx والذي من الممكن أن يولد عملية أخرى. العملية الجديدة لها الاسم procb والتي تعمل ضمن المجال الذي له context: contrxtbt
تم الانتقال من contextat to contextbt خلال البرنامج appx والذي يعمل كنقطة دخل ل contextb_t
لنقم بتشغيل العملية vsftp باستخدام التعليمة التالية: service vsftpd start
لنفترض أن العملية system هي الأب لكل العمليات وهذا سوف يبدل العملية System V init لتعمل في context: init_t
ps -eZ | grep init
system_u:system_r:init_t:s0 1 ? 00:00:02 systemd
system_u:system_r:mdadm_t:s0 773 ? 00:00:00 iprinit
العملية تعمل ضمن المجال domain: init_t والتي سوف تستدعي الملف التنفيذي /usr/sbin/vsftpd والذي له type context: ftpdexect وعندما يبدأ هذا البرنامج بالعمل فإن vsftpd ستعمل ضمن المجال domain: ftpd_t
يمكننا فحص domain contexts للملفات باستخدام التعليمة التالية:
ls -Z /usr/sbin/vsftpd
وستكون النتيجة كالتالي:
-rwxr-xr-x. root root system_u:object_r:ftpd_exec_t:s0 /usr/sbin/vsftpd
فحص العملية:
ps -eZ | grep vsftpd
النتيجة:
system_u:system_r:ftpd_t:s0-s0:c0.c1023 7708 ? 00:00:00 vsftpd
العملية تعمل ضمن init_t domain وهو الملف التنفيذي وله النوع type: ftpdexect هذا الملف بدأ العمل ضمن ftpd_t domain. لا يمكن للمستخدم أو التطبيق التحكم بعملية الانتقال وهي عبارة عن شرط مسبق موجود في سياسة SELinux التي يتم تحميلها إلى الذاكرة عن إقلاع النظام. في السيرفر الذي يعمل بدون SELinux فإن المستخدم يستطيع بدأ العملية من خلال الانتقال لحساب أقوى (له صلاحيات أعلى). في SELinux هذا التحكم بالوصول يكون مكتوب بشكل مسبق ضمن السياسة وهذا هو سبب قول أن SELinux تطبيق سياسة تحكم بالوصول الإلزامية Mandatory Access Control.
Domain transition يخضع لثلاث قواعد صارمة:
- العملية الأب التي تعمل ضمن source domain يجب أن تملك صلاحيات تنفيذية للتطبيق الموجود بين المجالين.
- ملف الحالة file context للتطبيق يجب أن يتم تعريفه ك entrypoint للمجال الهدف.
- المجال الأصلي يجب أن يملك صلاحيات للقيام بعملية التحويل للمجال الهدف.
لنقم بتنفيذ التعليمة sesearch على المثال السابق vsftpd لرؤية القواعد الثلاثة السابقة.
في البداية فإن source domain initt يجب أن يملك صلاحيات تنفيذية على التطبيق الدخل ضمن ftpdexec_t context
sesearch -s init_t -t ftpd_exec_t -c file -p execute -Ad
النتيجة تظهر العمليات ضمن init domain والتي تستطيع القراءة والحصول على الوصف get attribute وفتح الملفات ضمن ftpdexec_t context :
Found 1 semantic av rules:
allow init_t ftpd_exec_t : file { read getattr execute open } ;
لنقم بفحص الملف التنفيذ إذا كان نقطة دخل للمجال الهدف ftpd_t :
sesearch -s ftpd_t -t ftpd_exec_t -c file -p entrypoint -Ad
والنتيجة:
Found 1 semantic av rules:
allow ftpd_t ftpd_exec_t : file { ioctl read getattr lock execute execute_no_trans entrypoint open } ;
وفي النهائية فإن source domain initt يجب أن يملك صلاحيات ليتم تحويله إلى المجال الهدف ftpdt
sesearch -s init_t -t ftpd_t -c process -p transition -Ad
وهو يملك هذه الصلاحية
Found 1 semantic av rules:
allow init_t ftpd_t : process transition ;
المجالات الغير محددة Unconfined Domains:
تعرفنا على المجالات domains والتي هي عبارة عن حدود حول العملية والتي تحدد للعملية المسموح والممنوع القيام به وهذا يسمى تقييد العملية confines the process.
SELinux يحوي أيضاً على عمليات تعمل ضمن مجالات غير محدودة unconfined domains. يمكنك تخيل العمليات الغير محدودة على أنها العمليات التي يمكنها الوصول لكل أنواع المصادر في النظام وهذا الوصول الغير محدود ليس عشوائي وهو محدد ضمن سياسة SELinux
الخلاصة
قمنا بتغطية المفاهيم الأساسية ل SELinux وتعرفنا على طريقة إدارة file and process context والتي تعتبر أساس نجاح تطبيق SELinux
في المقال القادم سنعرف على طريقة تعامل SELinux مع المستخدمين.
ترجمة لمقال: an introduction to SELinux on CentOS 7 – Part 2: Files and Processes لصاحبها Sadequl Hussain