ایجاد خط مشی SELinux

این مقاله نحوه ایجاد خط مشی 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 :
      • chkcon : تعیین کنید آیا یک زمینه امنیتی برای یک خط مشی باینری معین (قابل اجرا میزبان) معتبر است یا خیر.
      • libsepol : کتابخانه SELinux برای دستکاری سیاست های امنیتی باینری (میزبان استاتیک/کتابخانه اشتراکی، کتابخانه ایستا هدف).
    • 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 در دستگاه به هم متصل می‌شوند:

این تصویر منطق ساخت SELinux را برای اندروید 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 را از 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 و محصول فقط برای سیستم_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

    خط مشی 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 را در پارتیشن مربوطه تولید می کند. مراحل شامل:

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