این صفحه نحوه ساخت سیاست 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: -
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.
فایل sepolicy شامل چندین فایل منبع است:
- فایل متنی سادهی
policy.confبا الحاق فایلهایsecurity_classes،initial_sids،*.te،genfs_contextsوport_contextsبه ترتیب ایجاد میشود. - برای هر فایل (مانند
security_classes)، محتوای آن، مجموعهای از فایلهای با نام یکسان درsystem/sepolicy/وBOARDS_SEPOLICY_DIRSاست. - فایل
policy.confبرای بررسی سینتکس به کامپایلر SELinux ارسال شده و به صورتsepolicyدر دستگاه کامپایل میشود.
شکل ۲. فایل سیاست 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 را در پارتیشن مربوطه تولید میکند. مراحل شامل موارد زیر است:
- سیاستها را به فرمت زبان میانی مشترک (CIL) در SELinux تبدیل کنید، به طور خاص:
- سیاست پلتفرم عمومی (
system،system_ext،product) - سیاستگذاری ترکیبی خصوصی و عمومی
- سیاست عمومی، فروشنده و
BOARD_SEPOLICY_DIRS
- سیاست پلتفرم عمومی (
- سیاست ارائه شده توسط بخش عمومی را به عنوان بخشی از سیاست فروشنده نسخهبندی کنید. از سیاست CIL عمومی تولید شده برای اطلاعرسانی به سیاست ترکیبی بخش عمومی و فروشنده و
BOARD_SEPOLICY_DIRSاستفاده کنید تا مشخص شود کدام بخشها باید به ویژگیهایی تبدیل شوند که به سیاست پلتفرم مرتبط هستند. - یک فایل نگاشت ایجاد کنید که بخشهای پلتفرم و فروشنده را به هم پیوند دهد. در ابتدا، این فایل فقط انواع موجود در سیاست عمومی را با ویژگیهای مربوطه در سیاست فروشنده پیوند میدهد؛ بعداً مبنایی برای فایل نگهداری شده در نسخههای آینده پلتفرم نیز فراهم میکند و سازگاری با سیاست فروشندهای را که این نسخه پلتفرم را هدف قرار میدهد، امکانپذیر میسازد.
- فایلهای سیاست را ترکیب کنید (راهکارهای درون دستگاهی و از پیش کامپایل شده را شرح دهید).
- نقشهبرداری، پلتفرم و سیاستهای فروشنده را با هم ترکیب کنید.
- فایل سیاست دودویی خروجی را کامپایل کنید.
سیاست عمومی پلتفرم
سیاست عمومی پلتفرم شامل هر چیزی است که در 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 مراجعه کنید.