ایجاد خط مشی 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 و محصول فقط برای عملکرد 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

    خط مشی 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 مراجعه کنید.