این مقاله نحوه ایجاد خط مشی SELinux را پوشش می دهد. خط مشی SELinux از ترکیب خط مشی اصلی AOSP (پلتفرم) و خط مشی دستگاه خاص (فروشنده) ساخته شده است. جریان ساخت خط مشی SELinux برای Android 4.4 تا Android 7.0 همه بخشهای sepolicy را ادغام کرد و سپس فایلهای یکپارچه را در فهرست اصلی ایجاد کرد. این بدان معناست که فروشندگان SoC و سازندگان ODM هر بار که خطمشی اصلاح میشد boot.img
(برای دستگاههای غیر A/B) یا system.img
(برای دستگاههای A/B) را اصلاح میکردند.
در اندروید 8.0 و بالاتر، خط مشی پلتفرم و فروشنده به طور جداگانه ساخته شده است. SOCها و OEMها میتوانند بخشهای خطمشی خود را بهروزرسانی کنند، تصاویر خود را بسازند (مانند vendor.img
و boot.img
)، سپس آن تصاویر را مستقل از بهروزرسانیهای پلتفرم بهروزرسانی کنند.
با این حال، از آنجایی که فایلهای سیاست SELinux مدولار شده در پارتیشنهای /vendor
ذخیره میشوند، فرآیند init
باید پارتیشنهای سیستم و فروشنده را زودتر نصب کند تا بتواند فایلهای SELinux را از آن پارتیشنها بخواند و آنها را با فایلهای اصلی SELinux در فهرست سیستم ادغام کند (قبل از بارگیری آنها در هسته).
فایل های منبع
منطق ساخت 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
: پیکربندی های اصلی سیاست Android SELinux، از جمله زمینه ها و فایل های خط مشی. منطق ساخت سیاست اصلی نیز اینجاست (system/sepolicy/Android.mk
).
برای جزئیات بیشتر در مورد فایل های system/sepolicy
پیاده سازی SELinux .
اندروید 7.0 و بالاتر
این بخش نحوه ایجاد خط مشی SELinux در اندروید 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
روی دستگاه کامپایل میشود.
فایل های 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 از طریق/sys/fs/selinux/load
به هسته بارگیری میکند. - SELinux را به حالت اعمال تغییر می دهد.
-
re-exec()
را اجرا می کند تا قانون دامنه SELinux را روی خودش اعمال کند.
برای کوتاهتر کردن زمان بوت، re-exec()
در فرآیند init
در اسرع وقت انجام دهید.
اندروید 8.0 و بالاتر
در Android 8.0، خطمشی SELinux به اجزای پلتفرم و فروشنده تقسیم میشود تا ضمن حفظ سازگاری، امکان بهروزرسانی خطمشی پلتفرم/فروشنده مستقل را فراهم کند.
سیاست پلت فرم بیشتر به بخش خصوصی پلت فرم و بخش عمومی پلت فرم تقسیم می شود تا انواع و ویژگی های خاص را به نویسندگان خط مشی فروشنده صادر کند. انواع/ویژگیهای عمومی پلتفرم تضمین میشوند که بهعنوان APIهای پایدار برای یک نسخه پلتفرم معین حفظ شوند. سازگاری با انواع/ویژگی های عمومی پلتفرم قبلی را می توان برای چندین نسخه با استفاده از فایل های نقشه پلت فرم تضمین کرد.
سیاست عمومی پلت فرم
سیاست عمومی پلتفرم شامل همه چیزهایی است که در زیر system/sepolicy/public
تعریف شده است. پلتفرم میتواند انواع و ویژگیهای تعریفشده در خطمشی عمومی را APIهای پایدار برای یک نسخه پلتفرم معین فرض کند. این بخشی از خطمشی را تشکیل میدهد که توسط پلتفرم صادر میشود که توسعهدهندگان خطمشی فروشنده (به عنوان مثال دستگاه) ممکن است خطمشی اضافی مخصوص دستگاه را بنویسند.
انواع بر اساس نسخه خط مشی ای که فایل های فروشنده بر اساس آن نوشته شده اند، نسخه بندی می شوند، که توسط متغیر ساخت PLATFORM_SEPOLICY_VERSION
تعریف شده است. خطمشی عمومی نسخهشده سپس با خطمشی فروشنده و (در شکل اصلی آن) در خطمشی پلت فرم گنجانده میشود. بنابراین، خطمشی نهایی شامل خطمشی پلتفرم خصوصی، سیاست عمومی پلتفرم فعلی، خطمشی خاص دستگاه، و خطمشی عمومی نسخهشده مربوط به نسخه پلتفرمی است که خطمشی دستگاه بر اساس آن نوشته شده است.
سکوی سیاست خصوصی
سیاست خصوصی پلتفرم شامل هر چیزی است که در زیر /system/sepolicy/private
تعریف شده است. این بخش از خطمشی انواع، مجوزها و ویژگیهای فقط پلتفرم را تشکیل میدهد که برای عملکرد پلتفرم لازم است. این موارد به نویسندگان خطمشی vendor/device
صادر نمیشوند. خطمشینویسان غیرپلتفرمی نباید برنامههای افزودنی خطمشی خود را بر اساس انواع/ویژگیها/قوانین تعریفشده در سیاست خصوصی پلتفرم بنویسند. علاوه بر این، این قوانین مجاز به تغییر هستند یا ممکن است به عنوان بخشی از یک به روز رسانی فقط چارچوب ناپدید شوند.
نقشه برداری خصوصی پلتفرم
نقشهبرداری خصوصی پلتفرم شامل بیانیههای خطمشی است که ویژگیهای ارائهشده در خطمشی عمومی پلتفرم نسخههای پلتفرم قبلی را با انواع بتن مورد استفاده در سیاست عمومی پلتفرم فعلی ترسیم میکند. این تضمین میکند که خطمشی فروشنده که بر اساس ویژگیهای عمومی پلتفرم از نسخه(های) سیاست عمومی پلتفرم قبلی نوشته شده است، همچنان به کار خود ادامه میدهد. نسخه سازی بر اساس مجموعه متغیر ساخت PLATFORM_SEPOLICY_VERSION
در AOSP برای یک نسخه پلتفرم معین است. یک فایل نگاشت جداگانه برای هر نسخه پلتفرم قبلی وجود دارد که انتظار می رود این پلتفرم خط مشی فروشنده را بپذیرد. برای جزئیات بیشتر، به سازگاری مراجعه کنید.
اندروید 11 و بالاتر
system_ext و سیاست محصول
در اندروید 11، سیاست system_ext و خط مشی محصول اضافه شده است. مانند سیاست پلتفرم، خط مشی system_ext و خط مشی محصول به خط مشی عمومی و خط مشی خصوصی تقسیم می شوند.
سیاست عمومی به فروشنده صادر می شود. انواع و ویژگیها به API پایدار تبدیل میشوند و خطمشی فروشنده میتواند به انواع و ویژگیهای خطمشی عمومی اشاره کند. انواع مطابق با PLATFORM_SEPOLICY_VERSION
نسخهبندی شدهاند و خطمشی نسخهشده در خطمشی فروشنده گنجانده شده است. خط مشی اصلی برای هر یک از پارتیشن های system_ext و محصول گنجانده شده است.
خط مشی خصوصی شامل انواع، مجوزها و ویژگی های فقط system_ext و محصول فقط برای عملکرد system_ext و محصول پارتیشن است. خط مشی خصوصی برای فروشنده نامرئی است، به این معنی که این قوانین داخلی هستند و مجاز به تغییر هستند.
system_ext و نقشه برداری محصول
system_ext و product مجازند انواع عمومی تعیین شده خود را به فروشنده صادر کنند. با این حال، مسئولیت حفظ سازگاری به عهده هر شریک است. برای سازگاری، شرکا میتوانند فایلهای نقشهبرداری خود را ارائه کنند که ویژگیهای نسخهشده نسخههای قبلی را به انواع بتن مورد استفاده در سیاست عمومی فعلی ترسیم کند.
- برای نصب یک فایل نگاشت برای 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 در اندروید 8.0 با ترکیب قطعاتی از /system
و /vendor
ایجاد می شود. منطق تنظیم مناسب این مورد در /platform/system/sepolicy/Android.mk
است.
خطمشی در مکانهای زیر وجود دارد:
محل | حاوی |
---|---|
system/sepolicy/public | API sepolicy پلت فرم |
system/sepolicy/private | جزئیات پیاده سازی پلت فرم (فروشندگان می توانند نادیده بگیرند) |
system/sepolicy/vendor | فایلهای خطمشی و زمینهای که فروشندگان میتوانند استفاده کنند (فروشندگان در صورت تمایل میتوانند نادیده بگیرند) |
BOARD_SEPOLICY_DIRS | سیاست فروشنده |
BOARD_ODM_SEPOLICY_DIRS (اندروید 9 و بالاتر) | سیاست ODM |
SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (اندروید 11 و بالاتر) | API sepolicy System_ext |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (اندروید 11 و بالاتر) | جزئیات پیاده سازی System_ext (فروشندگان می توانند نادیده بگیرند) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (اندروید 11 و بالاتر) | API سیاست گذاری محصول |
PRODUCT_PRIVATE_SEPOLICY_DIRS (اندروید 11 و بالاتر) | جزئیات اجرای محصول (فروشندگان می توانند نادیده بگیرند) |
سیستم ساخت این سیاست را می گیرد و اجزای system، system_ext، product، vendor و odm Policy را در پارتیشن مربوطه تولید می کند. مراحل شامل:
خط مشی SELinux از پیش کامپایل شده است
قبل از اینکه init
SELinux را روشن کند، init
تمام فایلهای CIL را از پارتیشنها ( system
، system_ext
، product
، vendor
و odm
) جمعآوری میکند و آنها را در خط مشی باینری کامپایل میکند، قالبی که میتواند در هسته بارگذاری شود. از آنجایی که کامپایل زمان می برد (معمولاً 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
مراجعه کنید.