توضّح هذه الصفحة كيفية إنشاء سياسة SELinux. يتم إنشاء سياسة SELinux من خلال الجمع بين سياسة AOSP الأساسية (المنصة) والسياسة الخاصة بالجهاز (المورّد). كانت عملية إنشاء سياسة SELinux في الإصدارات من Android 4.4 إلى Android 7.0 تدمج جميع أجزاء سياسة SELinux ثم تنشئ ملفات متكاملة في الدليل الجذر. وكان هذا يعني أنّ مورّدي المنظومة على الرقاقة (SoC) والمصنّعين الأصليين للأجهزة (ODM) كانوا يعدّلون boot.img (للأجهزة غير المتوافقة مع نظام التشغيل A/B) أو system.img (للأجهزة المتوافقة مع نظام التشغيل A/B) في كل مرة يتم فيها تعديل السياسة.
في الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث، يتم إنشاء سياسة المنصة وسياسة البائع بشكل منفصل.
يمكن لمورّدي الأنظمة على الرقاقات ومصنّعي المعدات الأصلية تعديل أجزائهم من السياسة وإنشاء صورهم (مثل vendor.img وboot.img)، ثم تعديل هذه الصور بشكل مستقل عن تحديثات النظام الأساسي.
ومع ذلك، بما أنّ ملفات سياسة SELinux النمطية يتم تخزينها في أقسام /vendor، يجب أن تعمل عملية init على ربط أقسام system وvendor في وقت سابق حتى تتمكّن من قراءة ملفات SELinux من هذه الأقسام ودمجها مع ملفات SELinux الأساسية في دليل system (قبل تحميلها في النواة).
الملفات المصدر
تتوفّر منطق إنشاء SELinux في الملفات التالية:
-
external/selinux: مشروع SELinux خارجي، يُستخدم لإنشاء أدوات سطر الأوامر HOST لتجميع سياسة SELinux وتصنيفاتها.-
external/selinux/libselinux: يستخدم Android مجموعة فرعية فقط من مشروعlibselinuxالخارجي بالإضافة إلى بعض التعديلات الخاصة بنظام التشغيل Android. للحصول على التفاصيل، يُرجى الاطّلاع علىexternal/selinux/README.android. -
external/selinux/libsepol: -
external/selinux/checkpolicy: برنامج تجميع سياسات SELinux (الملفات التنفيذية للمضيف:checkpolicyوcheckmoduleوdispol). يعتمد علىlibsepol.
-
-
system/sepolicy: إعدادات سياسة SELinux الأساسية في Android، بما في ذلك السياقات وملفات السياسات يتوفّر هنا أيضًا منطق الإنشاء الرئيسي لسياسة الأمان (system/sepolicy/Android.mk).
لمزيد من التفاصيل حول الملفات في system/sepolicy، يُرجى الاطّلاع على
الملفات الرئيسية.
الإصدار 7.x من نظام التشغيل Android والإصدارات الأقدم
يتناول هذا القسم كيفية إنشاء سياسة SELinux في الإصدار 7.x من نظام التشغيل Android والإصدارات الأقدم.
عملية التصميم لنظام التشغيل Android 7.x والإصدارات الأقدم
يتم إنشاء سياسة SELinux من خلال الجمع بين سياسة AOSP الأساسية والتعديلات المخصّصة الخاصة بالجهاز. بعد ذلك، يتم تمرير السياسة المدمَجة إلى برنامج تجميع السياسات وأدوات التحقّق المختلفة. يتم إجراء التخصيص الخاص بالجهاز من خلال المتغيّر BOARD_SEPOLICY_DIRS المحدّد في ملف Boardconfig.mk الخاص بالجهاز. يحتوي متغير الإنشاء العام هذا على قائمة بالأدلة التي تحدد ترتيب البحث عن ملفات السياسات الإضافية.
على سبيل المثال، يمكن أن يضيف مورّد نظام على شريحة (SoC) ومصنّع تصميم أصلي (ODM) كل منهما دليلاً، أحدهما للإعدادات الخاصة بنظام على شريحة والآخر للإعدادات الخاصة بالجهاز، وذلك لإنشاء إعدادات SELinux النهائية لجهاز معيّن:
BOARD_SEPOLICY_DIRS += device/SoC/common/sepolicyBOARD_SEPOLICY_DIRS += device/SoC/DEVICE/sepolicy
يتم ربط محتوى ملفات file_contexts في system/sepolicy وBOARD_SEPOLICY_DIRS لإنشاء file_contexts.bin على الجهاز:

الشكل 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على الجهاز.
الشكل 2. ملف سياسة SELinux
ملفات SELinux
بعد التجميع، تحتوي أجهزة Android التي تعمل بالإصدار 7.x والإصدارات الأقدم عادةً على الملفات التالية ذات الصلة بـ SELinux:
selinux_versionsepolicy: الناتج الثنائي بعد دمج ملفات السياسات (مثلsecurity_classesوinitial_sidsو*.te)file_contextsproperty_contextsseapp_contextsservice_contextssystem/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.bp.
تتوفّر السياسة في المواقع الجغرافية التالية:
| الموقع الجغرافي | يحتوي على |
|---|---|
system/sepolicy/public |
Platform sepolicy API |
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 والإصدارات الأحدث) |
system_ext sepolicy API |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث) |
تفاصيل تنفيذ system_ext (يمكن للمورّدين تجاهلها) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث) |
Product sepolicy API |
PRODUCT_PRIVATE_SEPOLICY_DIRS (الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث) |
تفاصيل تنفيذ المنتج (يمكن للمورّدين تجاهلها) |
يأخذ نظام الإنشاء هذه السياسة وينتج مكوّنات السياسة system وsystem_ext وproduct وvendor وodm على القسم المعنيّ. تشمل الخطوات ما يلي:
- تحويل السياسات إلى تنسيق لغة SELinux الوسيطة الشائعة (CIL)، وتحديدًا:
- سياسة المنصة العامة (
systemوsystem_extوproduct) - سياسة مشتركة بين السياسة الخاصة والسياسة العامة
- سياسة
BOARD_SEPOLICY_DIRSوالعامة والمورّدين
- سياسة المنصة العامة (
- إصدار السياسة التي يقدّمها الجمهور كجزء من سياسة المورّد
استخدِم سياسة CIL العامة التي تم إنتاجها لإعلام السياسة المدمجة العامة وسياسة
BOARD_SEPOLICY_DIRSبشأن الأجزاء التي يجب تحويلها إلى سمات مرتبطة بسياسة المنصة. - أنشئ ملف ربط يربط بين أجزاء المنصة والمورّد. في البداية، يربط هذا الحقل الأنواع من السياسة المتاحة للجميع بالسمات المقابلة في سياسة المورّد، ثم يوفّر أيضًا الأساس للملف الذي يتم الاحتفاظ به في إصدارات المنصة المستقبلية، ما يتيح التوافق مع سياسة المورّد التي تستهدف إصدار المنصة هذا.
- دمج ملفات السياسات (وصف الحلول المتوفّرة على الجهاز والحلول المجمَّعة مسبقًا)
- الجمع بين سياسات تحديد الموقع الجغرافي والمنصة والمورّد
- تجميع ملف سياسة الإخراج الثنائي
سياسة الأمان العامة للمنصة
يتضمّن sepolicy العام للنظام الأساسي كل ما تم تحديده ضمن
system/sepolicy/public. يمكن للمنصة افتراض أنّ الأنواع والسمات المحدّدة بموجب السياسة العامة هي واجهات برمجة تطبيقات ثابتة لإصدار معيّن من المنصة. يشكّل هذا الجزء من sepolicy الذي يصدّره النظام الأساسي
الذي يمكن لمطوّري سياسات المورّدين (أي الأجهزة) كتابة سياسات إضافية
خاصة بالجهاز.
يتم تحديد إصدارات الأنواع وفقًا لإصدار السياسة التي تم إنشاء ملفات المورّد استنادًا إليها، ويتم تحديدها من خلال المتغيّر PLATFORM_SEPOLICY_VERSIONbuild. بعد ذلك، يتم تضمين السياسة العامة التي تم تحديد إصدارها مع سياسة المورّد وفي سياسة المنصة (بشكلها الأصلي). وبالتالي، تتضمّن السياسة النهائية سياسة المنصة الخاصة وسياسة الأمان العامة الحالية للمنصة وسياسة الجهاز وسياسة الأمان العامة التي تتضمّن معلومات الإصدار والمتوافقة مع إصدار المنصة الذي تم إعداد سياسة الجهاز استنادًا إليه.
سياسة أمان SELinux الخاصة بالمنصة
تتضمّن سياسة الأمان الخاصة بالمنصة كل ما هو محدّد ضمن
/system/sepolicy/private. يشكّل هذا الجزء من السياسة أنواعًا وأذونات وسمات خاصة بالنظام الأساسي فقط، وهي مطلوبة لتوفير وظائف النظام الأساسي. ولا يتم تصديرها إلى مورّدي أدوات كتابة سياسات الأجهزة. يجب ألا يكتب مؤلفو سياسات غير المنصات امتدادات سياساتهم
استنادًا إلى الأنواع والسمات والقواعد المحددة في سياسة الأمان الخاصة بالمنصة. بالإضافة إلى ذلك،
يُسمح بتعديل هذه القواعد أو قد تختفي كجزء من تحديث الإطار فقط.
المطابقة الخاصة على مستوى المنصة
يتضمّن الربط الخاص بالمنصة بيانات السياسة التي تربط السمات المعروضة في السياسة العامة للمنصة في إصدارات المنصة السابقة بالأنواع المحدّدة المستخدَمة في السياسة العامة الحالية للمنصة. ويضمن ذلك استمرار عمل سياسة المورّد التي تم إعدادها استنادًا إلى السمات العامة للمنصة من إصدارات sepolicy العامة السابقة للمنصة. تستند عملية تحديد الإصدار إلى PLATFORM_SEPOLICY_VERSION متغير الإنشاء
المحدّد في مشروع Android مفتوح المصدر (AOSP) لإصدار نظام أساسي معيّن. يتوفّر ملف ربط منفصل لكل إصدار سابق من النظام الأساسي يُتوقّع أن يقبل هذا النظام الأساسي سياسة المورّد. لمزيد من التفاصيل، يُرجى الاطّلاع على توافق السياسات.
الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث
يتناول هذا القسم كيفية إنشاء سياسة SELinux في الإصدار 11 من نظام التشغيل Android والإصدارات الأحدث.
system_ext وproduct sepolicy
في نظام التشغيل Android 11، تمت إضافة السياسة system_ext والسياسة product. كما هو الحال مع سياسة الأمان في نظام التشغيل (SELinux)، يتم تقسيم سياسة system_ext وسياسة product إلى سياسة عامة وسياسة خاصة.
يتم تصدير السياسة العامة إلى المورّد. تصبح الأنواع والسمات واجهة برمجة تطبيقات ثابتة، ويمكن أن تشير سياسة المورّد إلى الأنواع والسمات في السياسة العامة. يتم تحديد إصدارات الأنواع وفقًا PLATFORM_SEPOLICY_VERSION، ويتم تضمين السياسة المحدّدة الإصدار في سياسة المورّد. تم تضمين السياسة الأصلية في كل قسم من قسمَي system_ext وproduct.
تحتوي سياسة الخصوصية على أنواع وأذونات وسمات system_ext فقط وproduct فقط المطلوبة لوظائف تقسيم system_ext وproduct.
سياسة الخصوصية غير مرئية للمورّد، ما يعني أنّ هذه القواعد داخلية ويُسمح بتعديلها.
ربط system_ext وproduct
يُسمح لكل من system_ext وproduct بتصدير الأنواع العامة المحدّدة إلى المورّد. ومع ذلك، يتحمّل كل شريك مسؤولية الحفاظ على التوافق. لضمان التوافق، يمكن للشركاء توفير ملفات الربط الخاصة بهم التي تربط السمات التي تم إصدارها في الإصدارات السابقة بالأنواع المحددة المستخدَمة في سياسة الأمان الحالية:
- لتثبيت ملف ربط لتطبيق
system_ext، ضَع ملف CIL يحتوي على معلومات الربط المطلوبة في{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil، ثم أضِفsystem_ext_{ver}.cilإلىPRODUCT_PACKAGES. - لتثبيت ملف ربط لتطبيق
product، ضَع ملف CIL يحتوي على معلومات الربط المطلوبة في{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil، ثم أضِفproduct_{ver}.cilإلىPRODUCT_PACKAGES.
راجِع مثالاً يضيف ملف ربط لقسم product في جهاز 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.