خط مشی SELinux را بسازید

این صفحه نحوه ساخت سیاست SELinux را پوشش می‌دهد. سیاست SELinux از ترکیب سیاست اصلی AOSP (پلتفرم) و سیاست مختص دستگاه (فروشنده) ساخته شده است. جریان ساخت سیاست SELinux برای اندروید ۴.۴ تا اندروید ۷.۰، تمام قطعات سیاست جداگانه را ادغام کرده و سپس فایل‌های یکپارچه‌ای را در دایرکتوری ریشه ایجاد می‌کرد. این بدان معناست که فروشندگان SoC و تولیدکنندگان ODM هر بار که سیاست تغییر می‌کرد، boot.img (برای دستگاه‌های غیر A/B) یا system.img (برای دستگاه‌های A/B) را تغییر می‌دادند.

در اندروید ۸.۰ و بالاتر، سیاست‌های پلتفرم و فروشنده به طور جداگانه ساخته می‌شوند. SoCها و OEMها می‌توانند بخش‌های مربوط به خود از این سیاست را به‌روزرسانی کنند، فایل‌های image خود (مانند vendor.img و boot.img ) را بسازند، سپس آن فایل‌های image را مستقل از به‌روزرسانی‌های پلتفرم به‌روزرسانی کنند.

با این حال، از آنجایی که فایل‌های سیاست SELinux ماژولار شده در پارتیشن‌های /vendor ذخیره می‌شوند، فرآیند init باید پارتیشن‌های system و vendor را زودتر mount کند تا بتواند فایل‌های SELinux را از آن پارتیشن‌ها بخواند و آنها را با فایل‌های اصلی SELinux در دایرکتوری system ادغام کند (قبل از بارگذاری آنها در هسته).

فایل‌های منبع

منطق ساخت SELinux در این فایل‌ها قرار دارد:

  • external/selinux : پروژه SELinux خارجی، که برای ساخت ابزارهای خط فرمان HOST جهت کامپایل سیاست‌ها و برچسب‌های SELinux استفاده می‌شود.
    • external/selinux/libselinux : اندروید تنها از زیرمجموعه‌ای از پروژه خارجی libselinux به همراه برخی سفارشی‌سازی‌های خاص اندروید استفاده می‌کند. برای جزئیات بیشتر، به external/selinux/README.android مراجعه کنید.
    • external/selinux/libsepol :
      • chkcon : تعیین می‌کند که آیا یک زمینه امنیتی برای یک سیاست دودویی مشخص (فایل اجرایی میزبان) معتبر است یا خیر.
      • libsepol : کتابخانه SELinux برای دستکاری سیاست‌های امنیتی دودویی (کتابخانه استاتیک/اشتراکی میزبان، کتابخانه استاتیک هدف).
    • external/selinux/checkpolicy : کامپایلر سیاست SELinux (فایل‌های اجرایی میزبان: checkpolicy ، checkmodule و dispol ). وابسته به libsepol است.
  • system/sepolicy : پیکربندی‌های سیاست اصلی SELinux اندروید، شامل contextها و فایل‌های سیاست. منطق ساخت اصلی seppolicy نیز در اینجا ( system/sepolicy/Android.mk ) قرار دارد.

برای جزئیات بیشتر در مورد فایل‌های موجود در system/sepolicy ، به Key files مراجعه کنید.

اندروید ۷.x و پایین‌تر

این بخش نحوه‌ی ساخت سیاست SELinux در اندروید ۷.x و پایین‌تر را پوشش می‌دهد.

فرآیند ساخت برای اندروید ۷.x و پایین‌تر

سیاست 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 برای اندروید ۷.x

شکل ۱. منطق ساخت 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 را برای اندروید ۷.x تولید می‌کنند
    شکل ۲. فایل سیاست SELinux.

فایل‌های SELinux

پس از کامپایل، دستگاه‌های اندروید با نسخه ۷.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 در حالت مجاز (permissive mode) است (و نه در حالت اجباری). فرآیند init وظایف زیر را انجام می‌دهد:

  • فایل‌های sepolicy را از ramdisk از طریق /sys/fs/selinux/load به هسته بارگذاری می‌کند.
  • SELinux را به حالت اجرایی (enforcing mode) تغییر می‌دهد.
  • تابع re-exec() ‎ را اجرا می‌کند تا قانون دامنه SELinux را روی خودش اعمال کند.

برای کوتاه کردن زمان بوت، دستور re-exec() را در اسرع وقت روی فرآیند init اجرا کنید.

اندروید ۸.۰ و بالاتر

در اندروید ۸.۰، سیاست SELinux به اجزای پلتفرم و فروشنده تقسیم شده است تا امکان به‌روزرسانی مستقل سیاست‌های پلتفرم و فروشنده را فراهم کند و در عین حال سازگاری را حفظ کند.

بخش سیاست پلتفرم به بخش‌های خصوصی پلتفرم و عمومی پلتفرم تقسیم می‌شود تا انواع و ویژگی‌های خاص را به نویسندگان سیاست فروشنده صادر کند. تضمین می‌شود که انواع/ویژگی‌های عمومی پلتفرم به عنوان APIهای پایدار برای یک نسخه پلتفرم مشخص حفظ شوند. سازگاری با انواع/ویژگی‌های عمومی پلتفرم قبلی را می‌توان برای چندین نسخه با استفاده از فایل‌های نگاشت پلتفرم تضمین کرد.

فرآیند ساخت برای اندروید ۸.۰

سیاست SELinux در اندروید ۸.۰ با ترکیب بخش‌هایی از /system و /vendor ایجاد می‌شود. منطق تنظیم مناسب این سیاست در /platform/system/sepolicy/Android.bp قرار دارد.

این خط‌مشی در مکان‌های زیر وجود دارد:

مکان شامل
system/sepolicy/public API سیاست پلتفرم
system/sepolicy/private جزئیات پیاده‌سازی پلتفرم (فروشندگان می‌توانند نادیده بگیرند)
system/sepolicy/vendor فایل‌های سیاست و زمینه‌ای که فروشندگان می‌توانند از آنها استفاده کنند (فروشندگان می‌توانند نادیده بگیرند)
BOARD_SEPOLICY_DIRS سیاست فروشنده
BOARD_ODM_SEPOLICY_DIRS (اندروید ۹ و بالاتر) سیاست ODM
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (اندروید ۱۱ و بالاتر) API مربوط به سیاست system_ext
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (اندروید ۱۱ و بالاتر) جزئیات پیاده‌سازی system_ext (فروشندگان می‌توانند نادیده بگیرند)
PRODUCT_PUBLIC_SEPOLICY_DIRS (اندروید ۱۱ و بالاتر) API مربوط به سیاست محصول
PRODUCT_PRIVATE_SEPOLICY_DIRS (اندروید ۱۱ و بالاتر) جزئیات پیاده‌سازی محصول (فروشندگان می‌توانند نادیده بگیرند)

سیستم ساخت این سیاست را می‌گیرد و اجزای سیاست system ، system_ext ، product ، vendor و odm را در پارتیشن مربوطه تولید می‌کند. مراحل شامل موارد زیر است:

  1. سیاست‌ها را به فرمت زبان میانی مشترک (CIL) در SELinux تبدیل کنید، به طور خاص:
    • سیاست پلتفرم عمومی ( system ، system_ext ، product )
    • سیاست‌گذاری ترکیبی خصوصی و عمومی
    • سیاست عمومی، فروشنده و BOARD_SEPOLICY_DIRS
  2. سیاست ارائه شده توسط بخش عمومی را به عنوان بخشی از سیاست فروشنده نسخه‌بندی کنید. از سیاست CIL عمومی تولید شده برای اطلاع‌رسانی به سیاست ترکیبی بخش عمومی و فروشنده و BOARD_SEPOLICY_DIRS استفاده کنید تا مشخص شود کدام بخش‌ها باید به ویژگی‌هایی تبدیل شوند که به سیاست پلتفرم مرتبط هستند.
  3. یک فایل نگاشت ایجاد کنید که بخش‌های پلتفرم و فروشنده را به هم پیوند دهد. در ابتدا، این فایل فقط انواع موجود در سیاست عمومی را با ویژگی‌های مربوطه در سیاست فروشنده پیوند می‌دهد؛ بعداً مبنایی برای فایل نگهداری شده در نسخه‌های آینده پلتفرم نیز فراهم می‌کند و سازگاری با سیاست فروشنده‌ای را که این نسخه پلتفرم را هدف قرار می‌دهد، امکان‌پذیر می‌سازد.
  4. فایل‌های سیاست را ترکیب کنید (راهکارهای درون دستگاهی و از پیش کامپایل شده را شرح دهید).
    1. نقشه‌برداری، پلتفرم و سیاست‌های فروشنده را با هم ترکیب کنید.
    2. فایل سیاست دودویی خروجی را کامپایل کنید.

سیاست عمومی پلتفرم

سیاست عمومی پلتفرم شامل هر چیزی است که در system/sepolicy/public تعریف شده است. پلتفرم می‌تواند فرض کند که انواع و ویژگی‌های تعریف شده در سیاست عمومی، APIهای پایدار برای یک نسخه پلتفرم مشخص هستند. این بخشی از سیاست عمومی را تشکیل می‌دهد که توسط پلتفرم صادر می‌شود و توسعه‌دهندگان سیاست‌های فروشنده (یعنی دستگاه) می‌توانند سیاست‌های اضافی مختص دستگاه را روی آن بنویسند.

انواع بر اساس نسخه‌ای از سیاست که فایل‌های فروشنده بر اساس آن نوشته شده‌اند، نسخه‌بندی می‌شوند که توسط متغیر ساخت PLATFORM_SEPOLICY_VERSION تعریف شده است. سپس سیاست عمومی نسخه‌بندی شده در سیاست فروشنده و (به شکل اصلی خود) در سیاست پلتفرم گنجانده می‌شود. بنابراین، سیاست نهایی شامل سیاست پلتفرم خصوصی، سیاست عمومی فعلی پلتفرم، سیاست خاص دستگاه و سیاست عمومی نسخه‌بندی شده مربوط به نسخه پلتفرمی است که سیاست دستگاه بر اساس آن نوشته شده است.

حریم خصوصی پلتفرم

بخش خصوصی پلتفرم شامل هر چیزی است که در /system/sepolicy/private تعریف شده است. این بخش از سیاست، انواع، مجوزها و ویژگی‌های فقط پلتفرم مورد نیاز برای عملکرد پلتفرم را تشکیل می‌دهد. این موارد به فروشندگان و نویسندگان سیاست‌های دستگاه صادر نمی‌شوند. نویسندگان سیاست‌های غیر پلتفرمی نباید افزونه‌های سیاست خود را بر اساس انواع، ویژگی‌ها و قوانین تعریف شده در بخش خصوصی پلتفرم بنویسند. علاوه بر این، این قوانین می‌توانند به عنوان بخشی از یک به‌روزرسانی فقط چارچوب، اصلاح شوند یا ممکن است ناپدید شوند.

نقشه برداری خصوصی پلتفرم

نگاشت خصوصی پلتفرم شامل بیانیه‌های سیاستی است که ویژگی‌های موجود در سیاست عمومی پلتفرم نسخه‌های قبلی پلتفرم را به انواع مشخص مورد استفاده در سیاست عمومی پلتفرم فعلی نگاشت می‌کند. این امر تضمین می‌کند که سیاست فروشنده که بر اساس ویژگی‌های عمومی پلتفرم از نسخه‌های قبلی سیاست عمومی پلتفرم نوشته شده است، همچنان به کار خود ادامه دهد. نسخه‌بندی بر اساس متغیر ساخت PLATFORM_SEPOLICY_VERSION تنظیم شده در AOSP برای یک نسخه پلتفرم مشخص است. یک فایل نگاشت جداگانه برای هر نسخه قبلی پلتفرم وجود دارد که انتظار می‌رود این پلتفرم سیاست فروشنده را از آن بپذیرد. برای جزئیات بیشتر، به سازگاری سیاست مراجعه کنید.

اندروید ۱۱ و بالاتر

این بخش نحوه‌ی ساخت سیاست SELinux در اندروید ۱۱ و بالاتر را پوشش می‌دهد.

system_ext و سیاست جداگانه محصول

در اندروید ۱۱، سیاست system_ext و سیاست product اضافه شده‌اند. مانند سیاست جداگانه پلتفرم، سیاست system_ext و سیاست product به دو بخش سیاست عمومی و سیاست خصوصی تقسیم شده‌اند.

سیاست عمومی به فروشنده صادر می‌شود. انواع و ویژگی‌ها به API پایدار تبدیل می‌شوند و سیاست فروشنده می‌تواند به انواع و ویژگی‌های موجود در سیاست عمومی اشاره کند. انواع بر اساس PLATFORM_SEPOLICY_VERSION نسخه‌بندی می‌شوند و سیاست نسخه‌بندی شده در سیاست فروشنده گنجانده می‌شود. سیاست اصلی در هر یک از پارتیشن‌های system_ext و product گنجانده می‌شود.

سیاست خصوصی شامل انواع، مجوزها و ویژگی‌های system_ext -only و product -only مورد نیاز برای عملکرد پارتیشن system_ext و product است. سیاست خصوصی برای فروشنده نامرئی است، به این معنی که این قوانین داخلی هستند و اجازه تغییر دارند.

system_ext و نگاشت محصول

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 ) جمع‌آوری کرده و آنها را به صورت binary policy کامپایل می‌کند، فرمتی که می‌تواند در هسته بارگذاری شود. از آنجایی که کامپایل زمان می‌برد (معمولاً ۱-۲ ثانیه)، فایل‌های CIL در زمان ساخت پیش‌کامپایل شده و در /vendor/etc/selinux/precompiled_sepolicy یا /odm/etc/selinux/precompiled_sepolicy ، همراه با هش‌های sha256 فایل‌های CIL ورودی قرار می‌گیرند. در زمان اجرا، init با مقایسه هش‌ها بررسی می‌کند که آیا هر یک از فایل‌های policy به‌روزرسانی شده است یا خیر. اگر چیزی تغییر نکرده باشد، init policy پیش‌کامپایل شده را بارگذاری می‌کند. در غیر این صورت، init درجا کامپایل می‌شود و از آن به جای precompiled استفاده می‌کند.

به طور خاص، اگر همه شرایط زیر برقرار باشد، از سیاست از پیش کامپایل شده استفاده می‌شود. در اینجا، {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 مراجعه کنید.