تتناول هذه المقالة كيفية بناء سياسة SELinux. تم إنشاء سياسة SELinux من خلال الجمع بين سياسة AOSP الأساسية (النظام الأساسي) والسياسة الخاصة بالجهاز (البائع). قام تدفق بناء سياسة SELinux لنظام Android 4.4 إلى Android 7.0 بدمج جميع أجزاء sepolicy ثم إنشاء ملفات متجانسة في الدليل الجذر. وهذا يعني أن موردي SoC ومصنعي ODM قاموا بتعديل boot.img
(للأجهزة غير A/B) أو system.img
(لأجهزة A/B) في كل مرة يتم فيها تعديل السياسة.
في نظام التشغيل Android 8.0 والإصدارات الأحدث، يتم إنشاء سياسة النظام الأساسي والمورد بشكل منفصل. يمكن لشركات SOC ومصنعي المعدات الأصلية تحديث الأجزاء الخاصة بهم من السياسة، وإنشاء صورهم (مثل، 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
: تكوينات سياسة Android SELinux الأساسية، بما في ذلك السياقات وملفات السياسة. منطق بناء sepolicy الرئيسي موجود هنا أيضًا (system/sepolicy/Android.mk
).
لمزيد من التفاصيل حول الملفات الموجودة في system/sepolicy
تنفيذ SELinux .
أندرويد 7.0 والإصدارات الأقدم
يغطي هذا القسم كيفية بناء سياسة SELinux في Android 7.x والإصدارات الأقدم.
بناء سياسة SELinux
يتم إنشاء سياسة SELinux من خلال الجمع بين سياسة AOSP الأساسية والتخصيصات الخاصة بالجهاز. يتم بعد ذلك تمرير السياسة المجمعة إلى مترجم السياسة والمدققين المختلفين. يتم إجراء التخصيص الخاص بالجهاز من خلال المتغير BOARD_SEPOLICY_DIRS
المحدد في ملف Boardconfig.mk
الخاص بالجهاز. يحتوي متغير البناء العام هذا على قائمة من الدلائل التي تحدد الترتيب الذي سيتم به البحث عن ملفات السياسة الإضافية.
على سبيل المثال، قد يقوم كل من بائع SoC وODM بإضافة دليل، واحد للإعدادات الخاصة بـ SoC والآخر للإعدادات الخاصة بالجهاز، لإنشاء تكوينات 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
على الجهاز:
يتكون ملف sepolicy
من ملفات مصدر متعددة:
- يتم إنشاء
policy.conf
للنص العادي عن طريق ربطsecurity_classes
، وinitial_sids
، و*.te
، وgenfs_contexts
، وport_contexts
بهذا الترتيب. - بالنسبة لكل ملف (مثل
security_classes
)، يكون محتواه عبارة عن سلسلة من الملفات التي تحمل الاسم نفسه ضمنsystem/sepolicy/
وBOARDS_SEPOLICY_DIRS
. - يتم إرسال
policy.conf
إلى برنامج التحويل البرمجي SELinux للتحقق من بناء الجملة وتجميعه في تنسيق ثنائي كسياسةsepolicy
على الجهاز.
ملفات سيلينوكس
بعد التجميع، عادةً ما تحتوي أجهزة 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 إلى kernel من خلال/sys/fs/selinux/load
. - يقوم بتحويل SELinux إلى وضع الفرض.
- يقوم بتشغيل
re-exec()
لتطبيق قاعدة مجال SELinux على نفسه.
لتقصير وقت التمهيد، قم بإجراء re-exec()
على عملية init
في أقرب وقت ممكن.
أندرويد 8.0 والإصدارات الأحدث
في Android 8.0، تم تقسيم سياسة SELinux إلى مكونات النظام الأساسي ومكونات البائع للسماح بتحديثات سياسة النظام الأساسي/المورد المستقلة مع الحفاظ على التوافق.
يتم تقسيم خصوصية النظام الأساسي أيضًا إلى أجزاء خاصة بالمنصة وأجزاء عامة بالمنصة لتصدير أنواع وسمات محددة إلى كتاب سياسة البائعين. يتم ضمان الحفاظ على الأنواع/السمات العامة للنظام الأساسي كواجهات برمجة تطبيقات مستقرة لإصدار نظام أساسي معين. يمكن ضمان التوافق مع الأنواع/السمات العامة السابقة للنظام الأساسي لعدة إصدارات باستخدام ملفات تعيين النظام الأساسي.
منصة sepolicy العامة
تتضمن الخصوصية العامة للمنصة كل ما تم تحديده ضمن system/sepolicy/public
. يمكن للنظام الأساسي أن يفترض أن الأنواع والسمات المحددة بموجب السياسة العامة هي واجهات برمجة تطبيقات مستقرة لإصدار نظام أساسي معين. يشكل هذا جزءًا من الخصوصية التي يتم تصديرها بواسطة النظام الأساسي حيث يمكن لمطوري سياسة البائع (أي الجهاز) أن يكتبوا سياسة إضافية خاصة بالجهاز.
يتم إصدار الأنواع وفقًا لإصدار السياسة التي يتم كتابة ملفات البائع وفقًا لها، والتي يتم تحديدها بواسطة متغير البناء PLATFORM_SEPOLICY_VERSION
. يتم بعد ذلك تضمين السياسة العامة التي تم إصدارها مع سياسة البائع و(في شكلها الأصلي) في سياسة النظام الأساسي. وبالتالي، تتضمن السياسة النهائية سياسة النظام الأساسي الخاص، والسياسة العامة للنظام الأساسي الحالي، والسياسة الخاصة بالجهاز، والسياسة العامة التي تم إصدارها والتي تتوافق مع إصدار النظام الأساسي الذي تمت كتابة سياسة الجهاز عليه.
منصة الخصوصية الخاصة
تتضمن الخصوصية الخاصة بالمنصة كل ما تم تحديده ضمن /system/sepolicy/private
. يشكل هذا الجزء من السياسة أنواعًا وأذونات وسمات خاصة بالنظام الأساسي فقط مطلوبة لوظائف النظام الأساسي. لا يتم تصديرها إلى كتاب سياسة vendor/device
. يجب على كتاب السياسة خارج النظام الأساسي عدم كتابة امتدادات السياسة الخاصة بهم بناءً على الأنواع/السمات/القواعد المحددة في سياسة الخصوصية الخاصة بالمنصة. علاوة على ذلك، يُسمح بتعديل هذه القواعد أو قد تختفي كجزء من تحديث إطار العمل فقط.
رسم الخرائط الخاصة بالمنصة
يتضمن التعيين الخاص بالمنصة بيانات السياسة التي تحدد السمات المكشوفة في السياسة العامة للمنصة لإصدارات النظام الأساسي السابقة للأنواع الملموسة المستخدمة في السياسة العامة الحالية للمنصة. وهذا يضمن استمرار عمل سياسة البائع التي تمت كتابتها استنادًا إلى السمات العامة للنظام الأساسي من إصدار (إصدارات) السياسة العامة للنظام الأساسي السابقة. يعتمد الإصدار على مجموعة متغيرات البناء PLATFORM_SEPOLICY_VERSION
في AOSP لإصدار نظام أساسي معين. يوجد ملف تعيين منفصل لكل إصدار سابق للنظام الأساسي والذي من المتوقع أن يقبل هذا النظام الأساسي سياسة البائع منه. لمزيد من التفاصيل، راجع التوافق .
أندرويد 11 والإصدارات الأحدث
system_ext وسياسة المنتج
في Android 11، تتم إضافة سياسة system_ext وسياسة المنتج. مثل سياسة النظام الأساسي، يتم تقسيم سياسة system_ext وسياسة المنتج إلى سياسة عامة وسياسة خاصة.
يتم تصدير السياسة العامة إلى البائع. تصبح الأنواع والسمات واجهة برمجة تطبيقات مستقرة، ويمكن أن تشير سياسة البائع إلى الأنواع والسمات في السياسة العامة. يتم إصدار الأنواع وفقًا لـ PLATFORM_SEPOLICY_VERSION
، ويتم تضمين السياسة التي تم إصدارها في سياسة البائع. يتم تضمين السياسة الأصلية في كل من قسم system_ext والمنتج.
تحتوي السياسة الخاصة على أنواع System_ext فقط وأنواع المنتج فقط والأذونات والسمات المطلوبة لوظائف أقسام System_ext والمنتج. السياسة الخاصة غير مرئية للبائع، مما يعني أن هذه القواعد داخلية ويمكن تعديلها.
system_ext وتعيين المنتج
يُسمح لـ system_ext والمنتج بتصدير الأنواع العامة المخصصة لهما إلى البائع. ومع ذلك، فإن مسؤولية الحفاظ على التوافق تقع على عاتق كل شريك. من أجل التوافق، يمكن للشركاء توفير ملفات التعيين الخاصة بهم والتي تقوم بتعيين سمات الإصدارات السابقة للأنواع الملموسة المستخدمة في السياسة العامة الحالية.
- لتثبيت ملف تعيين لـ 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 Common Intermediate Language (CIL)، وتحديدًا:
- سياسة النظام الأساسي العام (النظام + system_ext + المنتج)
- الجمع بين السياسة الخاصة + العامة
- سياسة البائع + العامة و
BOARD_SEPOLICY_DIRS
- إصدار السياسة المقدمة من قبل الجمهور كجزء من سياسة البائع. يتم ذلك باستخدام سياسة CIL العامة المنتجة لإبلاغ السياسة العامة + البائع +
BOARD_SEPOLICY_DIRS
المتعلقة بالأجزاء التي يجب تحويلها إلى سمات سيتم ربطها بسياسة النظام الأساسي. - إنشاء ملف تعيين يربط بين أجزاء النظام الأساسي والبائعين. في البداية، يقوم هذا فقط بربط الأنواع من السياسة العامة بالسمات المقابلة لها في سياسة البائع؛ لاحقًا، سيوفر أيضًا الأساس للملف الذي سيتم الاحتفاظ به في إصدارات النظام الأساسي المستقبلية، مما يتيح التوافق مع سياسة البائع التي تستهدف إصدار النظام الأساسي هذا.
- الجمع بين ملفات السياسة (وصف كل من الحلول الموجودة على الجهاز والحلول المترجمة مسبقًا).
- الجمع بين رسم الخرائط والمنصة وسياسة البائع.
- تجميع ملف السياسة الثنائية الإخراج.
- كلا
/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
غير موجودين. أو كلاهما موجودان ومتطابقان.
بناء سياسة SELinux
تم إنشاء سياسة SELinux في Android 8.0 من خلال دمج أجزاء من /system
و /vendor
. منطق إعداد هذا بشكل مناسب موجود في /platform/system/sepolicy/Android.mk
.
السياسة موجودة في المواقع التالية:
موقع | يتضمن |
---|---|
system/sepolicy/public | واجهة برمجة تطبيقات sepolicy الخاصة بالمنصة |
system/sepolicy/private | تفاصيل تنفيذ النظام الأساسي (يمكن للبائعين تجاهلها) |
system/sepolicy/vendor | ملفات السياسة والسياق التي يمكن للبائعين استخدامها (يمكن للبائعين تجاهلها إذا رغبوا في ذلك) |
BOARD_SEPOLICY_DIRS | سياسة البائع |
BOARD_ODM_SEPOLICY_DIRS (Android 9 والإصدارات الأحدث) | سياسة الخصوصية |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) | واجهة برمجة تطبيقات sepolicy الخاصة بـ System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) | تفاصيل تنفيذ System_ext (يمكن للبائعين تجاهلها) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) | واجهة برمجة تطبيقات sepolicy للمنتج |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 والإصدارات الأحدث) | تفاصيل تنفيذ المنتج (يمكن للبائعين تجاهلها) |
يأخذ نظام الإنشاء هذه السياسة وينتج مكونات سياسة النظام وsystem_ext والمنتج والبائع وسياسة odm على القسم المقابل. تشمل الخطوات ما يلي:
سياسة SELinux المترجمة مسبقًا
قبل أن يقوم init
بتشغيل SELinux، يقوم init
بجمع كل ملفات CIL من الأقسام ( system
و system_ext
و product
و vendor
و odm
) ويجمعها في سياسة ثنائية، وهو التنسيق الذي يمكن تحميله إلى kernel. نظرًا لأن التجميع يستغرق وقتًا (عادةً 1-2 ثانية)، يتم تجميع ملفات CIL مسبقًا في وقت الإنشاء ووضعها إما في /vendor/etc/selinux/precompiled_sepolicy
أو /odm/etc/selinux/precompiled_sepolicy
، جنبًا إلى جنب مع تجزئة sha256 من ملفات CIL الإدخال. في وقت التشغيل، يتحقق init
مما إذا كان قد تم تحديث أي من ملفات السياسة عن طريق مقارنة التجزئات. إذا لم يتغير شيء، فسيقوم init
بتحميل السياسة المترجمة مسبقًا. إذا لم يكن الأمر كذلك، فإن init
يجمعها سريعًا ويستخدمها بدلاً من المترجمة مسبقًا.
وبشكل أكثر تحديدًا، يتم استخدام النهج المترجم مسبقًا في حالة استيفاء كافة الشروط التالية. هنا، يمثل {partition}
القسم الذي توجد به السياسة المترجمة مسبقًا: إما vendor
أو odm
.
إذا اختلف أي منها، فسيعود init
إلى مسار الترجمة الموجود على الجهاز. راجع system/core/init/selinux.cpp
لمزيد من التفاصيل.