مفاهيم SELinux

راجِع هذه الصفحة للتعرّف على مفاهيم SELinux.

التحكّم الإلزامي في الوصول

‫Security Enhanced Linux (SELinux) هو نظام تحكّم إلزامي في الوصول (MAC) لنظام التشغيل Linux. يختلف هذا النظام عن نظام التحكم التقديري في الوصول (DAC) المألوف في Linux. في نظام DAC، يتوفّر مفهوم الملكية، حيث يتحكّم مالك مورد معيّن في أذونات الوصول المرتبطة به. ويكون هذا الإذن بشكل عام دقيقًا ويخضع لتصعيد غير مقصود للأذونات. في المقابل، يستشير نظام MAC جهة مركزية لاتخاذ قرار بشأن جميع محاولات الوصول.

تم تنفيذ SELinux كجزء من إطار عمل "وحدة أمان Linux" (LSM)، الذي يتعرّف على عناصر النواة المختلفة والإجراءات الحساسة التي يتم تنفيذها عليها. عند تنفيذ كل إجراء من هذه الإجراءات، يتم استدعاء دالة ربط LSM لتحديد ما إذا كان يجب السماح بالإجراء استنادًا إلى المعلومات المخزّنة في عنصر أمان مبهم. توفّر SELinux عملية تنفيذ لهذه الخطافات وإدارة لعناصر الأمان هذه، والتي تتكامل مع سياستها الخاصة لتحديد قرارات الوصول.

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

في نظام التشغيل Android 4.3 والإصدارات الأحدث، يوفّر SELinux مظلة إلزامية للتحكّم في الوصول (MAC) على بيئات التحكّم التقليدية في الوصول التقديري (DAC). على سبيل المثال، يجب عادةً تشغيل البرامج كحساب مستخدم رئيسي للكتابة إلى أجهزة الحظر الأولية. في بيئة Linux تقليدية تستند إلى التحكم التقديري في الوصول، إذا تم اختراق مستخدم الجذر، يمكن لهذا المستخدم الكتابة إلى كل جهاز حظر أولي. ومع ذلك، يمكن استخدام SELinux لتصنيف هذه الأجهزة حتى تتمكّن العملية التي تم منحها امتيازات الجذر من الكتابة إلى تلك الأجهزة المحدّدة في السياسة المرتبطة بها فقط. بهذه الطريقة، لا يمكن للعملية الكتابة فوق البيانات وإعدادات النظام خارج جهاز حظر البيانات الأولية المحدّد.

يمكنك الاطّلاع على حالات الاستخدام للحصول على مزيد من الأمثلة حول التهديدات وطرق التعامل معها باستخدام SELinux.

مستويات التنفيذ

يمكن تنفيذ SELinux في أوضاع مختلفة:

  • متساهل: لا يتم فرض سياسة أمان SELinux، بل يتم تسجيلها فقط.
  • فرض: يتم فرض سياسة الأمان وتسجيلها. تظهر حالات الفشل كأخطاء EPERM.

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

الأنواع والسمات والقواعد

يعتمد نظام التشغيل Android على مكوّن "فرض النوع" (TE) في SELinux لتطبيق سياسته. وهذا يعني أنّ جميع العناصر (مثل الملف أو العملية أو المقبس) لها نوع مرتبط بها. على سبيل المثال، يكون نوع التطبيق untrusted_app تلقائيًا. بالنسبة إلى العملية، يُعرف نوعها أيضًا باسم نطاقها. يمكن إضافة تعليق توضيحي إلى نوع باستخدام سمة واحدة أو عدة سمات. تكون السمات مفيدة للإشارة إلى أنواع متعددة في الوقت نفسه.

يتم ربط العناصر بالفئات (على سبيل المثال، ملف أو دليل أو رابط رمزي أو مقبس)، ويتم تمثيل أنواع الوصول المختلفة لكل فئة من خلال الأذونات. على سبيل المثال، يتوفّر الإذن open للفئة file. مع أنّ الأنواع والسمات يتم تعديلها بانتظام كجزء من سياسة SELinux في Android، يتم تحديد الأذونات والفئات بشكل ثابت ونادرًا ما يتم تعديلها كجزء من إصدار Linux جديد.

تتّخذ قاعدة السياسة الشكل التالي: allow source target:class permissions; حيث:

  • المصدر: نوع (أو سمة) موضوع القاعدة. مَن يطلب إذن الوصول؟
  • الهدف: نوع العنصر (أو سمته). ما هو المحتوى الذي تم طلب الوصول إليه؟
  • الفئة: نوع العنصر (على سبيل المثال، ملف أو مقبس) الذي يتم الوصول إليه.
  • الأذونات: العملية (أو مجموعة العمليات) (مثل القراءة والكتابة) التي يتم تنفيذها.

في ما يلي مثال على قاعدة:

allow untrusted_app app_data_file:file { read write };

يشير ذلك إلى أنّه يُسمح للتطبيقات بقراءة الملفات التي تحمل التصنيف app_data_file وتعديلها. تتوفّر أنواع أخرى للتطبيقات. على سبيل المثال، يتم استخدام isolated_app لخدمات التطبيقات التي تتضمّن isolatedProcess=true في ملف البيان. بدلاً من تكرار القاعدة لكلا النوعين، يستخدم Android سمة باسم appdomain لجميع الأنواع التي تشمل التطبيقات:

# Associate the attribute appdomain with the type untrusted_app.
typeattribute untrusted_app appdomain;

# Associate the attribute appdomain with the type isolated_app.
typeattribute isolated_app appdomain;

allow appdomain app_data_file:file { read write };

عند كتابة قاعدة تحدّد اسم سمة، يتم تلقائيًا توسيع هذا الاسم ليشمل قائمة النطاقات أو الأنواع المرتبطة بالسمة. في ما يلي بعض السمات البارزة:

  • domain: سمة مرتبطة بجميع أنواع العمليات
  • file_type: سمة مرتبطة بجميع أنواع الملفات

وحدات الماكرو

في ما يتعلق بالوصول إلى الملفات تحديدًا، هناك العديد من أنواع الأذونات التي يجب مراعاتها. على سبيل المثال، لا يكفي الإذن read لفتح الملف أو استدعاء stat عليه. لتبسيط تعريف القاعدة، يوفّر نظام التشغيل Android مجموعة من وحدات الماكرو للتعامل مع الحالات الأكثر شيوعًا. على سبيل المثال، لإدراج الأذونات الناقصة، مثل open، يمكن إعادة كتابة القاعدة أعلاه على النحو التالي:

allow appdomain app_data_file:file rw_file_perms;

اطّلِع على الملفَين global_macros وte_macros للاطّلاع على المزيد من الأمثلة لوحدات الماكرو المفيدة. يجب استخدام وحدات الماكرو كلّما أمكن ذلك للمساعدة في تقليل احتمالية حدوث أخطاء بسبب رفض الأذونات ذات الصلة.

بعد تحديد نوع، يجب ربطه بالملف أو العملية التي يمثّلها. يمكنك الاطّلاع على تنفيذ SELinux للحصول على مزيد من التفاصيل حول كيفية إجراء عملية الربط هذه. لمزيد من المعلومات حول القواعد، راجِع دفتر ملاحظات SELinux.

سياق الأمان والفئات

عند تصحيح أخطاء سياسات SELinux أو تصنيف الملفات (باستخدام file_contexts أو عند استخدام ls -Z)، قد تصادف سياق أمان (يُعرف أيضًا باسم تصنيف). على سبيل المثال: u:r:untrusted_app:s0:c15,c256,c513,c768. يتضمّن سياق الأمان التنسيق التالي: user:role:type:sensitivity[:categories]. يمكنك عادةً تجاهل الحقول user وrole وsensitivity في السياق (راجِع التحديد). تم توضيح الحقل type في القسم السابق. categories هي جزء من ميزة "الأمان المتعدّد المستويات" (MLS) المتاحة في SELinux. في نظام التشغيل Android 12 والإصدارات الأحدث، تُستخدَم الفئات في ما يلي:

  • عزل بيانات التطبيق عن الوصول إليها من خلال تطبيق آخر
  • عزل بيانات التطبيق من مستخدم فعلي إلى آخر

الدقة

لا يستخدم Android جميع الميزات التي يوفّرها SELinux. عند قراءة مستندات خارجية، ضَع في اعتبارك النقاط التالية:

  • يتم تحديد معظم السياسات في AOSP باستخدام "لغة سياسات النواة". هناك بعض الاستثناءات لاستخدام لغة Common Intermediate Language (CIL).
  • لا يتم استخدام مستخدمي SELinux. المستخدم الوحيد المحدّد هو u. عند الضرورة، يتم تمثيل المستخدمين الفعليين باستخدام حقل الفئات في سياق الأمان.
  • لا يتم استخدام الأدوار في SELinux والتحكّم في الوصول المستند إلى الدور (RBAC). يتم تحديد دورَين تلقائيَين واستخدامهما: r للمواضيع وobject_r للكائنات.
  • لا يتم استخدام مستويات حساسية SELinux. يتم دائمًا ضبط حساسية s0 التلقائية.
  • لا يتم استخدام قيم SELinux المنطقية. عند إنشاء السياسة لجهاز، لا تعتمد على حالة الجهاز. ويؤدي ذلك إلى تبسيط عملية التدقيق في السياسات وتصحيح أخطائها.