في الجزء الأول من سلسلة 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

 

نتيجة تنفيذ هذه التعليمة سيكون مشابه للتالي:

لنقم بإضافة 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. نتيجة تنفيذ هذه التعليمة سوف تعرض العمليات الجارية ورقم العملية ورقم العملية الأب لكل عملية:

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

 

لنقم الآن بطلب هذا الملف من المتصفح:

1

يمكننا الوصول لهذا الملف وهذا يعني أن 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

2

ماذا حدث هنا ؟؟؟؟

تم منع عملية الوصول لهذا الملف. سيرفر الويب مسموح له الوصول فقط إلى أنواع محددة من الملفات والنوع 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

الآن وإذا حاولنا الوصول لصفحة الويب السابقة فسوف تنجح العملية ولن نحصل على رسالة الخطأ.

الأداة  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

3

لنقم بتشغيل العملية 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