توضّح هذه الصفحة كيفية إنشاء سياسة 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
: -
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
على الجهاز:

الشكل 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_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 على القسم المقابل. تشمل الخطوات ما يلي:
- تحويل السياسات إلى تنسيق لغة وسيطة مشتركة (CIL) في SELinux، وتحديدًا:
- سياسة المنصة العامة (النظام + نظام_ext + المنتج)
- سياسة مشتركة بين القطاع الخاص والقطاع العام
- السياسة العامة + المورّد و
BOARD_SEPOLICY_DIRS
- تحديد إصدار السياسة التي يقدّمها الجمهور كجزء من سياسة المورّد
يتم ذلك باستخدام سياسة CIL العامة التي تم إنتاجها لإبلاغ السياسة المجمّعة العامة + المورّد +
BOARD_SEPOLICY_DIRS
بشأن الأجزاء التي يجب تحويلها إلى سمات سيتم ربطها بسياسة المنصة. - إنشاء ملف ربط يربط بين أجزاء المنصة وأجزاء المورّد في البداية، يربط هذا الحقل الأنواع من السياسة المتاحة للجميع بالسمات المقابلة في سياسة المورّد، وسيوفّر لاحقًا الأساس للملف الذي سيتم الاحتفاظ به في إصدارات المنصة المستقبلية، ما يتيح التوافق مع سياسة المورّد التي تستهدف إصدار المنصة هذا.
- دمج ملفات السياسات (وصف الحلول المتوفّرة على الجهاز والحلول المُجمَّعة مسبقًا)
- دمج سياسات الربط والنظام الأساسي والمورّد
- تجميع ملف سياسة الإخراج الثنائي
سياسة الأمان العامة للمنصة
يتضمّن sepolicy العام للنظام الأساسي كل ما تم تحديده ضمن
system/sepolicy/public
. يمكن للمنصة افتراض أنّ الأنواع والسمات المحدّدة بموجب السياسة العامة هي واجهات برمجة تطبيقات ثابتة لإصدار معيّن من المنصة. يشكّل هذا الجزء من sepolicy الذي يصدّره النظام الأساسي، والذي يمكن لمطوّري سياسات المورّدين (أي الأجهزة) كتابة سياسات إضافية خاصة بالجهاز.
يتم تحديد إصدارات الأنواع وفقًا لإصدار السياسة التي يتم إنشاء ملفات المورّد استنادًا إليها، ويتم تحديدها من خلال المتغيّر PLATFORM_SEPOLICY_VERSION
build. يتم بعد ذلك تضمين السياسة العامة التي تتضمّن معلومات الإصدار مع سياسة المورّد، كما يتم تضمينها (بشكلها الأصلي) في سياسة المنصة. وبالتالي، تتضمّن السياسة النهائية سياسة المنصة الخاصة وسياسة 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
.