إنشاء سياسة SELinux

توضّح هذه الصفحة كيفية إنشاء سياسة SELinux. يتم إنشاء سياسة SELinux من خلال الجمع بين سياسة AOSP الأساسية (المنصة) والسياسة الخاصة بالجهاز (المورّد). كانت عملية إنشاء سياسة SELinux في الإصدارات من Android 4.4 إلى Android 7.0 تدمج جميع أجزاء sepolicy ثم تنشئ ملفات متكاملة في الدليل الجذر. وهذا يعني أنّ مورّدي المنظومة على الرقاقة (SoC) والمصنّعين الأصليين للأجهزة (ODM) كانوا يعدّلون boot.img (للأجهزة غير المتوافقة مع تحديثات A/B) أو system.img (للأجهزة المتوافقة مع تحديثات A/B) في كل مرة يتم فيها تعديل السياسة.

في الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث، يتم إنشاء سياسة المنصة وسياسة البائع بشكل منفصل. يمكن لمورّدي برامج التشغيل ومصنّعي المعدات الأصلية تعديل أجزاء السياسة الخاصة بهم وإنشاء صورهم (مثل vendor.img وboot.img)، ثم تعديل هذه الصور بشكل مستقل عن تحديثات النظام الأساسي.

ومع ذلك، بما أنّ ملفات سياسات SELinux المجزّأة يتم تخزينها في أقسام /vendor، يجب أن تعمل عملية init على تثبيت أقسام النظام والمورّد في وقت سابق حتى تتمكّن من قراءة ملفات SELinux من هذه الأقسام ودمجها مع ملفات SELinux الأساسية في دليل النظام (قبل تحميلها في النواة).

الملفات المصدر

تتوفّر منطق إنشاء SELinux في الملفات التالية:

  • external/selinux: مشروع SELinux خارجي، يُستخدم لإنشاء أدوات سطر الأوامر HOST لتجميع سياسة SELinux وتصنيفاتها.
    • external/selinux/libselinux: يستخدم Android مجموعة فرعية فقط من مشروع libselinux الخارجي، بالإضافة إلى بعض التعديلات الخاصة بنظام Android. للحصول على التفاصيل، يُرجى الاطّلاع على external/selinux/README.android.
    • external/selinux/libsepol:
      • chkcon: تحديد ما إذا كان سياق الأمان صالحًا لسياسة ثنائية معيّنة (ملف تنفيذي للمضيف).
      • libsepol: مكتبة SELinux للتعامل مع سياسات الأمان الثنائية (مكتبة ثابتة/مشترَكة للمضيف، ومكتبة ثابتة للهدف).
    • external/selinux/checkpolicy: برنامج تجميع سياسات SELinux (الملفات التنفيذية للمضيف: checkpolicy وcheckmodule وdispol). يعتمد على libsepol.
  • system/sepolicy: إعدادات سياسة SELinux الأساسية في Android، بما في ذلك السياقات وملفات السياسات يتوفّر هنا أيضًا منطق إنشاء sepolicy الرئيسي (system/sepolicy/Android.mk).

لمزيد من التفاصيل حول الملفات، راجِع system/sepolicy تنفيذ SELinux.

الإصدار 7.x من نظام التشغيل Android والإصدارات الأقدم

يتناول هذا القسم كيفية إنشاء سياسة SELinux في الإصدار 7.x من نظام التشغيل Android والإصدارات الأقدم.

عملية الإنشاء لنظام التشغيل Android 7.x والإصدارات الأقدم

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

على سبيل المثال، يمكن أن يضيف مورّد نظام على شريحة وشركة تصميم وتصنيع أصلية (ODM) كل منهما دليلاً، أحدهما للإعدادات الخاصة بالنظام على شريحة والآخر للإعدادات الخاصة بالجهاز، وذلك لإنشاء إعدادات SELinux النهائية لجهاز معيّن:

  • BOARD_SEPOLICY_DIRS += device/SOC/common/sepolicy
  • BOARD_SEPOLICY_DIRS += device/SoC/DEVICE/sepolicy

يتم ربط محتوى ملفات file_contexts في system/sepolicy وBOARD_SEPOLICY_DIRS لإنشاء file_contexts.bin على الجهاز:

تعرض هذه الصورة منطق إنشاء SELinux لنظام التشغيل Android 7.x.

الشكل 1. منطق إنشاء SELinux

يتألف الملف sepolicy من عدة ملفات مصدر:

  • يتم إنشاء النص العادي policy.conf من خلال دمج ملفات security_classes وinitial_sids و*.te وgenfs_contexts وport_contexts بهذا الترتيب.
  • بالنسبة إلى كل ملف (مثل security_classes)، يكون محتواه عبارة عن تسلسل للملفات التي تحمل الاسم نفسه ضمن system/sepolicy/ وBOARDS_SEPOLICY_DIRS.
  • يتم إرسال policy.conf إلى برنامج SELinux المجمّع للتحقّق من بناء الجملة وتجميعه بتنسيق ثنائي باسم sepolicy على الجهاز.
    تعرض هذه الصورة الملفات التي تنشئ ملف سياسة SELinux لنظام التشغيل Android 7.x.

    الشكل 2. ملف سياسة SELinux

ملفات SELinux

بعد التجميع، تحتوي أجهزة Android التي تعمل بالإصدار 7.x والإصدارات الأقدم عادةً على الملفات التالية ذات الصلة بـ SELinux:

  • selinux_version
  • sepolicy: الناتج الثنائي بعد دمج ملفات السياسات (مثل security_classes وinitial_sids و*.te)
  • file_contexts
  • property_contexts
  • seapp_contexts
  • service_contexts
  • system/etc/mac_permissions.xml

لمزيد من التفاصيل، اطّلِع على تنفيذ SELinux.

إعداد SELinux

عند تشغيل النظام، يكون SELinux في وضع التساهل (وليس في وضع التنفيذ). تنفِّذ عملية init المهام التالية:

  • تحميل sepolicy ملف من ramdisk إلى النواة من خلال /sys/fs/selinux/load
  • يتم التبديل إلى وضع التنفيذ في SELinux.
  • يتم تشغيل re-exec() لتطبيق قاعدة نطاق SELinux على نفسه.

لتقليل وقت التشغيل، عليك تنفيذ عملية re-exec() على عملية init في أقرب وقت ممكن.

الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث

في نظام التشغيل Android 8.0، يتم تقسيم سياسة SELinux إلى مكوّنات خاصة بالمنصة ومكوّنات خاصة بالمورّد للسماح بتعديلات مستقلة على سياسة المنصة/المورّد مع الحفاظ على التوافق.

يتم تقسيم سياسة الأمان SELinux للمنصة إلى جزأين، أحدهما خاص والآخر عام، وذلك لتصدير أنواع وسمات معيّنة إلى كُتّاب سياسات المورّدين. نضمن الحفاظ على ثبات الأنواع/السمات العامة للمنصة كواجهات برمجة تطبيقات لإصدار معيّن من المنصة. يمكن ضمان التوافق مع الأنواع/السمات العامة السابقة للمنصة لعدة إصدارات باستخدام ملفات ربط المنصة.

عملية إنشاء الإصدار لنظام التشغيل Android 8.0

يتم إنشاء سياسة SELinux في Android 8.0 من خلال دمج أجزاء من /system و/vendor. يمكنك الاطّلاع على منطق إعداد هذه الميزة بشكل سليم في /platform/system/sepolicy/Android.mk.

تتوفّر السياسة في المواقع الجغرافية التالية:

الموقع الجغرافي يحتوي على
system/sepolicy/public واجهة برمجة التطبيقات sepolicy في النظام الأساسي
system/sepolicy/private تفاصيل تنفيذ المنصّة (يمكن للمورّدين تجاهلها)
system/sepolicy/vendor ملفات السياسات والسياق التي يمكن للمورّدين استخدامها (يمكن للمورّدين تجاهلها إذا أرادوا ذلك)
BOARD_SEPOLICY_DIRS Vendor sepolicy
BOARD_ODM_SEPOLICY_DIRS (الإصدار 9 من نظام التشغيل Android والإصدارات الأحدث) Odm sepolicy
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث) واجهة برمجة تطبيقات sepolicy الخاصة بـ System_ext
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث) تفاصيل تنفيذ System_ext (يمكن للمورّدين تجاهلها)
PRODUCT_PUBLIC_SEPOLICY_DIRS (الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث) واجهة برمجة التطبيقات sepolicy الخاصة بالمنتج
PRODUCT_PRIVATE_SEPOLICY_DIRS (الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث) تفاصيل تنفيذ المنتج (يمكن للمورّدين تجاهلها)

يأخذ نظام الإنشاء هذه السياسة وينتج مكونات سياسة النظام وsystem_ext والمنتج والمورّد وodm على القسم المقابل. تشمل الخطوات ما يلي:

  1. تحويل السياسات إلى تنسيق لغة وسيطة مشتركة (CIL) في SELinux، وتحديدًا:
    1. سياسة المنصة العامة (النظام + نظام_ext + المنتج)
    2. سياسة مشتركة بين القطاع الخاص والقطاع العام
    3. السياسة العامة + المورّد وBOARD_SEPOLICY_DIRS
  2. تحديد إصدار السياسة التي يقدّمها الجمهور كجزء من سياسة المورّد يتم ذلك باستخدام سياسة CIL العامة التي تم إنتاجها لإبلاغ السياسة المجمّعة العامة + المورّد + BOARD_SEPOLICY_DIRS بشأن الأجزاء التي يجب تحويلها إلى سمات سيتم ربطها بسياسة المنصة.
  3. إنشاء ملف ربط يربط بين أجزاء المنصة وأجزاء المورّد في البداية، يربط هذا الحقل الأنواع من السياسة المتاحة للجميع بالسمات المقابلة في سياسة المورّد، وسيوفّر لاحقًا الأساس للملف الذي سيتم الاحتفاظ به في إصدارات المنصة المستقبلية، ما يتيح التوافق مع سياسة المورّد التي تستهدف إصدار المنصة هذا.
  4. دمج ملفات السياسات (وصف الحلول المتوفّرة على الجهاز والحلول المُجمَّعة مسبقًا)
    1. دمج سياسات الربط والنظام الأساسي والمورّد
    2. تجميع ملف سياسة الإخراج الثنائي

سياسة الأمان العامة للمنصة

يتضمّن sepolicy العام للنظام الأساسي كل ما تم تحديده ضمن system/sepolicy/public. يمكن للمنصة افتراض أنّ الأنواع والسمات المحدّدة بموجب السياسة العامة هي واجهات برمجة تطبيقات ثابتة لإصدار معيّن من المنصة. يشكّل هذا الجزء من sepolicy الذي يصدّره النظام الأساسي، والذي يمكن لمطوّري سياسات المورّدين (أي الأجهزة) كتابة سياسات إضافية خاصة بالجهاز.

يتم تحديد إصدارات الأنواع وفقًا لإصدار السياسة التي يتم إنشاء ملفات المورّد استنادًا إليها، ويتم تحديدها من خلال المتغيّر PLATFORM_SEPOLICY_VERSIONbuild. يتم بعد ذلك تضمين السياسة العامة التي تتضمّن معلومات الإصدار مع سياسة المورّد، كما يتم تضمينها (بشكلها الأصلي) في سياسة المنصة. وبالتالي، تتضمّن السياسة النهائية سياسة المنصة الخاصة وسياسة SELinux العامة الحالية للمنصة وسياسة الجهاز وسياسة الإصدار العام المتوافق مع إصدار المنصة الذي تم إعداد سياسة الجهاز استنادًا إليه.

سياسة أمان SELinux الخاصة بالمنصة

تتضمّن سياسة الأمان الخاصة بالمنصة كل ما تم تحديده ضمن /system/sepolicy/private. يشكّل هذا الجزء من السياسة أنواعًا وأذونات وسمات خاصة بالنظام الأساسي فقط، وهي مطلوبة لتوفير وظائف النظام الأساسي. ولا يتم تصديرها إلى كتّاب سياسة vendor/device. يجب ألا يكتب واضعو سياسات غير المنصات امتدادات سياساتهم استنادًا إلى الأنواع أو السمات أو القواعد المحدّدة في سياسة الأمان الخاصة بالمنصة. بالإضافة إلى ذلك، يمكن تعديل هذه القواعد أو قد تختفي كجزء من تحديث خاص بالإطار فقط.

المطابقة الخاصة على المنصة

يتضمّن الربط الخاص بالمنصة بيانات السياسة التي تربط السمات المعروضة في السياسة العامة للمنصة في إصدارات المنصة السابقة بالأنواع المحدّدة المستخدَمة في سياسة الأمان العامة الحالية للمنصة. ويضمن ذلك استمرار عمل سياسة المورّد التي تم إعدادها استنادًا إلى السمات العامة للمنصة من إصدارات سياسة الأمان العامة السابقة للمنصة. تستند عملية تحديد الإصدار إلى PLATFORM_SEPOLICY_VERSIONمتغير الإنشاء المحدّد في مشروع Android مفتوح المصدر (AOSP) لإصدار نظام أساسي معيّن. يتوفّر ملف ربط منفصل لكل إصدار سابق من النظام الأساسي يُتوقّع أن يقبل هذا النظام الأساسي سياسة المورّد. لمزيد من التفاصيل، يُرجى الاطّلاع على مقالة التوافق.

الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث

system_ext وproduct sepolicy

في نظام التشغيل Android 11، تتم إضافة سياسة system_ext وسياسة المنتج. وكما هو الحال مع سياسة النظام الأساسي، يتم تقسيم سياسة system_ext وسياسة المنتج إلى سياسة عامة وسياسة خاصة.

يتم تصدير السياسة العامة إلى المورّد. تصبح الأنواع والسمات واجهة برمجة تطبيقات ثابتة، ويمكن أن تشير سياسة المورّد إلى الأنواع والسمات في السياسة العامة. يتم تحديد إصدارات الأنواع وفقًا PLATFORM_SEPOLICY_VERSION، ويتم تضمين السياسة المحدّدة الإصدار في سياسة المورّد. يتم تضمين السياسة الأصلية في كل من قسمَي system_ext وproduct.

تحتوي السياسة الخاصة على أنواع وأذونات وسمات خاصة بنظام system_ext فقط وأخرى خاصة بالمنتج فقط، وهي مطلوبة لتفعيل وظائف أقسام system_ext والمنتج. سياسة الخصوصية غير مرئية للمورّد، ما يعني أنّ هذه القواعد داخلية ويُسمح بتعديلها.

ربط system_ext وproduct

يُسمح لتطبيقَي system_ext وproduct بتصدير الأنواع العامة المحدّدة إلى vendor. ومع ذلك، تقع مسؤولية الحفاظ على التوافق على عاتق كل شريك. لضمان التوافق، يمكن للشركاء توفير ملفات ربط خاصة بهم تربط بين السمات التي تتضمّن أرقام إصدارات للإصدارات السابقة والأنواع المحدّدة المستخدَمة في سياسة الأمان الحالية المتاحة للجميع.

  • لتثبيت ملف ربط لنظام system_ext، ضَع ملف cil يحتوي على معلومات الربط المطلوبة في {SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil، ثم أضِف system_ext_{ver}.cil إلى PRODUCT_PACKAGES.
  • لتثبيت ملف ربط للمنتج، ضَع ملف cil يحتوي على معلومات الربط المطلوبة في {PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil، ثم أضِف product_{ver}.cil إلى PRODUCT_PACKAGES.

راجِع مثالاً يضيف ملف ربط لقسم منتجات جهاز redbull.

سياسة SELinux المُجمَّعة مسبقًا

قبل أن يفعّل init SELinux، يجمع init جميع ملفات CIL من الأقسام (system وsystem_ext وproduct وvendor وodm) ويحوّلها إلى سياسة ثنائية، وهو التنسيق الذي يمكن تحميله إلى النواة. بما أنّ عملية التجميع تستغرق وقتًا (عادةً من ثانية واحدة إلى ثانيتين)، يتم تجميع ملفات CIL مسبقًا في وقت الإنشاء ووضعها في /vendor/etc/selinux/precompiled_sepolicy أو /odm/etc/selinux/precompiled_sepolicy، بالإضافة إلى قيم التجزئة sha256 لملفات CIL المدخلة. أثناء وقت التشغيل، يتحقّق init مما إذا تم تعديل أي من ملفات السياسة من خلال مقارنة قيم التجزئة. إذا لم يتغيّر أي شيء، سيحمّل init السياسة المجمَّعة مسبقًا. إذا لم يكن كذلك، سيتم تجميع init أثناء التنفيذ واستخدامه بدلاً من الإصدار المجمّع مسبقًا.

على وجه التحديد، يتم استخدام السياسة المجمّعة مسبقًا إذا تم استيفاء جميع الشروط التالية. في هذا المثال، يمثّل {partition} القسم الذي تتوفّر فيه السياسة المجمّعة مسبقًا، أي vendor أو odm.

  • تتوفّر كلتا السمتَين /system/etc/selinux/plat_sepolicy_and_mapping.sha256 و/{partition}/etc/selinux/precompiled_sepolicy.plat_sepolicy_and_mapping.sha256 وهما متطابقتان.
  • لا يتوفّر كل من /system_ext/etc/selinux/system_ext_sepolicy_and_mapping.sha256 و/{partition}/etc/selinux/precompiled_sepolicy.system_ext_sepolicy_and_mapping.sha256. أو أن يكونا متطابقَين.
  • لا يتوفّر كل من /product/etc/selinux/product_sepolicy_and_mapping.sha256 و/{partition}/etc/selinux/precompiled_sepolicy.product_sepolicy_and_mapping.sha256. أو أن يكونا متطابقَين.

إذا كان أيّ منها مختلفًا، يعود init إلى مسار التجميع على الجهاز. لمزيد من التفاصيل، يُرجى الاطّلاع على system/core/init/selinux.cpp.