بناء سياسة SELinux

تتناول هذه المقالة كيفية بناء سياسة 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 :
      • chkcon : تحديد ما إذا كان سياق الأمان صالحًا لسياسة ثنائية معينة (مضيف قابل للتنفيذ).
      • libsepol : مكتبة SELinux لمعالجة سياسات الأمان الثنائية (مكتبة المضيف الثابتة/المشتركة، المكتبة الثابتة المستهدفة).
    • 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 على الجهاز:

تُظهر هذه الصورة منطق بناء 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

ملفات سيلينوكس

بعد التجميع، عادةً ما تحتوي أجهزة 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

    تم إنشاء سياسة 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 على القسم المقابل. تشمل الخطوات ما يلي:

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

    سياسة 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 .

    • كلا /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 لمزيد من التفاصيل.