إنشاء سياسة SELinux

تتناول هذه الصفحة كيفية إنشاء سياسة SELinux. يتم إنشاء سياسة SELinux من مزيج من سياسة AOSP الأساسية (المنصة) والسياسة الخاصة بالجهاز (المورّد). دمج مسار إنشاء سياسة SELinux لنظام التشغيل Android 4.4 حتى الإصدار 7.0 جميع أجزاء سياسة sepolicy، ثم أنشأ ملفات موحّدة في الدليل الرئيسي. وهذا يعني أنّ مورّدي المنظومة على الرقاقة والمصنّعين الأصليين للأجهزة (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: إعدادات سياسة Android SELinux الأساسية التي تشمل السياقات وملفات السياسات يمكنك أيضًا العثور على منطق برمجة سياسة الأمان الرئيسية (system/sepolicy/Android.mk).

لمزيد من التفاصيل حول الملفات في system/sepolicy تنفيذ SELinux.

الإصدار 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/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 ملفًا من ذاكرة التخزين المؤقت للنظام إلى النواة من خلال /sys/fs/selinux/load.
  • تبديل SELinux إلى وضع التنفيذ
  • تشغيل re-exec() لتطبيق قاعدة نطاق SELinux على نفسها

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

الإصدار 8.0 من Android والإصدارات الأحدث

في Android 8.0، يتم تقسيم سياسة 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 سياسة أمان المورّد
BOARD_ODM_SEPOLICY_DIRS (الإصدار 9 من Android والإصدارات الأحدث) سياسة الأمان في Odm
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 وsystem_ext وproduct وvendor وodm في القسم المقابل. تشمل الخطوات ما يلي:

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

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

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

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

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

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

الربط الخاص بالمنصة

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

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

نظام_ext وسياسات الأمان الخاصة بالمنتج

في Android 11، تتم إضافة سياسة system_ext وسياسة المنتج. مثل سياسة منصّة sepolicy، يتم تقسيم سياسة system_ext وسياسة المنتج إلى سياسة عامة و سياسة خاصة.

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

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

تعيين system_ext وproduct

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

  • لتثبيت ملف تعيين لنظام_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) ويجمعها في سياسة ثنائية، وهو التنسيق الذي يمكن تحميله إلى النواة. بما أنّ compiling يستغرق بعض الوقت (عادةً من ثانية إلى ثانيتَين)، يتم تجميع ملفات 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 لمزيد من التفاصيل.