SELinux नीति का निर्माण

यह आलेख बताता है कि SELinux नीति कैसे बनाई जाती है। SELinux नीति कोर AOSP नीति (प्लेटफ़ॉर्म) और डिवाइस-विशिष्ट नीति (विक्रेता) के संयोजन से बनाई गई है। एंड्रॉइड 4.4 से लेकर एंड्रॉइड 7.0 तक के लिए SELinux नीति निर्माण प्रवाह ने सभी सेपॉलिसी अंशों को मर्ज कर दिया और फिर रूट निर्देशिका में मोनोलिथिक फ़ाइलें उत्पन्न कीं। इसका मतलब यह था कि SoC विक्रेताओं और ODM निर्माताओं ने हर बार नीति में संशोधन के बाद boot.img (गैर-A/B उपकरणों के लिए) या system.img (A/B उपकरणों के लिए) को संशोधित किया।

एंड्रॉइड 8.0 और उच्चतर में, प्लेटफ़ॉर्म और विक्रेता नीति अलग से बनाई गई है। एसओसी और ओईएम नीति के अपने हिस्सों को अपडेट कर सकते हैं, अपनी छवियां (जैसे, vendor.img और boot.img ) बना सकते हैं, फिर उन छवियों को प्लेटफ़ॉर्म अपडेट से स्वतंत्र रूप से अपडेट कर सकते हैं।

हालाँकि, चूंकि मॉड्यूलर SELinux नीति फ़ाइलें /vendor विभाजन पर संग्रहीत होती हैं, init प्रक्रिया को सिस्टम और विक्रेता विभाजन को पहले माउंट करना होगा ताकि यह उन विभाजनों से SELinux फ़ाइलों को पढ़ सके और उन्हें सिस्टम निर्देशिका में कोर SELinux फ़ाइलों के साथ मर्ज कर सके (उन्हें लोड करने से पहले) कर्नेल)।

स्रोत फ़ाइलें

SELinux के निर्माण का तर्क इन फ़ाइलों में है:

  • external/selinux : बाहरी SELinux प्रोजेक्ट, SELinux नीति और लेबल को संकलित करने के लिए HOST कमांड लाइन उपयोगिताओं का निर्माण करने के लिए उपयोग किया जाता है।
    • 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 नीति कॉन्फ़िगरेशन, जिसमें संदर्भ और नीति फ़ाइलें शामिल हैं। प्रमुख सेपॉलिसी बिल्ड लॉजिक भी यहां है ( system/sepolicy/Android.mk )।

system/sepolicy कार्यान्वयन SELinux में फ़ाइलों के बारे में अधिक जानकारी के लिए।

एंड्रॉइड 7.0 और इससे पहले का संस्करण

यह अनुभाग बताता है कि एंड्रॉइड 7.x और इससे पहले के संस्करण में SELinux नीति कैसे बनाई गई है।

SELinux नीति का निर्माण

SELinux नीति मुख्य AOSP नीति को डिवाइस-विशिष्ट अनुकूलन के साथ जोड़कर बनाई गई है। फिर संयुक्त पॉलिसी को पॉलिसी कंपाइलर और विभिन्न चेकर्स को भेज दिया जाता है। डिवाइस-विशिष्ट अनुकूलन डिवाइस-विशिष्ट Boardconfig.mk फ़ाइल में परिभाषित BOARD_SEPOLICY_DIRS वेरिएबल के माध्यम से किया जाता है। इस वैश्विक बिल्ड वैरिएबल में निर्देशिकाओं की एक सूची होती है जो अतिरिक्त नीति फ़ाइलों की खोज करने के क्रम को निर्दिष्ट करती है।

उदाहरण के लिए, एक SoC विक्रेता और एक ODM प्रत्येक एक निर्देशिका जोड़ सकते हैं, एक SoC-विशिष्ट सेटिंग्स के लिए और दूसरी डिवाइस-विशिष्ट सेटिंग्स के लिए, किसी दिए गए डिवाइस के लिए अंतिम SELinux कॉन्फ़िगरेशन उत्पन्न करने के लिए:

  • BOARD_SEPOLICY_DIRS += device/ SOC /common/sepolicy
  • BOARD_SEPOLICY_DIRS += device/ SoC / DEVICE /sepolicy

system/sepolicy और BOARD_SEPOLICY_DIRS में file_contexts फ़ाइलों की सामग्री को डिवाइस पर file_contexts.bin उत्पन्न करने के लिए संयोजित किया जाता है:

यह छवि Android 7.x के लिए SELinux बिल्ड लॉजिक दिखाती है।
आकृति 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 के रूप में बाइनरी प्रारूप में संकलित किया जाता है।
    यह छवि उन फ़ाइलों को दिखाती है जो Android 7.x के लिए SELinux नीति फ़ाइल उत्पन्न करती हैं।
    चित्र 2 । SELinux नीति फ़ाइल

SELinux फ़ाइलें

संकलन के बाद, 7.x और इससे पहले के संस्करण चलाने वाले Android उपकरणों में आमतौर पर निम्नलिखित SELinux-संबंधित फ़ाइलें होती हैं:

  • selinux_version
  • सेपॉलिसी: पॉलिसी फ़ाइलों (जैसे कि, security_classes , initial_sids और *.te ) के संयोजन के बाद बाइनरी आउटपुट
  • file_contexts
  • property_contexts
  • seapp_contexts
  • service_contexts
  • system/etc/mac_permissions.xml

अधिक विवरण के लिए, SELinux का कार्यान्वयन देखें।

SELinux आरंभीकरण

जब सिस्टम बूट होता है, तो SELinux अनुमेय मोड में होता है (और एनफोर्सिंग मोड में नहीं)। Init प्रक्रिया निम्नलिखित कार्य करती है:

  • रैमडिस्क से sepolicy फ़ाइलों को /sys/fs/selinux/load के माध्यम से कर्नेल में लोड करता है।
  • SELinux को एनफोर्सिंग मोड में स्विच करता है।
  • SELinux डोमेन नियम को स्वयं पर लागू करने के लिए re-exec() चलाता है।

बूट समय को कम करने के लिए, यथाशीघ्र init प्रक्रिया पर re-exec() निष्पादित करें।

एंड्रॉइड 8.0 और उच्चतर

एंड्रॉइड 8.0 में, संगतता बनाए रखते हुए स्वतंत्र प्लेटफ़ॉर्म/विक्रेता नीति अपडेट की अनुमति देने के लिए SELinux नीति को प्लेटफ़ॉर्म और विक्रेता घटकों में विभाजित किया गया है।

विक्रेता नीति लेखकों को विशिष्ट प्रकार और विशेषताओं को निर्यात करने के लिए प्लेटफ़ॉर्म सेपॉलिसी को प्लेटफ़ॉर्म निजी और प्लेटफ़ॉर्म सार्वजनिक भागों में विभाजित किया गया है। प्लेटफ़ॉर्म सार्वजनिक प्रकार/विशेषताओं को किसी दिए गए प्लेटफ़ॉर्म संस्करण के लिए स्थिर एपीआई के रूप में बनाए रखने की गारंटी दी जाती है। प्लेटफ़ॉर्म मैपिंग फ़ाइलों का उपयोग करके कई संस्करणों के लिए पिछले प्लेटफ़ॉर्म सार्वजनिक प्रकारों/विशेषताओं के साथ संगतता की गारंटी दी जा सकती है।

प्लेटफ़ॉर्म सार्वजनिक सेपॉलिसी

प्लेटफ़ॉर्म पब्लिक सेपॉलिसी system/sepolicy/public के अंतर्गत परिभाषित सभी चीज़ें शामिल हैं। प्लेटफ़ॉर्म मान सकता है कि सार्वजनिक नीति के तहत परिभाषित प्रकार और विशेषताएँ किसी दिए गए प्लेटफ़ॉर्म संस्करण के लिए स्थिर एपीआई हैं। यह सेपॉलिसी का हिस्सा बनता है जो प्लेटफ़ॉर्म द्वारा निर्यात किया जाता है जिस पर विक्रेता (यानी डिवाइस) नीति डेवलपर्स अतिरिक्त डिवाइस-विशिष्ट नीति लिख सकते हैं।

PLATFORM_SEPOLICY_VERSION बिल्ड वैरिएबल द्वारा परिभाषित नीति के संस्करण के अनुसार प्रकारों का संस्करण किया जाता है जिसके विरुद्ध विक्रेता फ़ाइलें लिखी जाती हैं। संस्करणित सार्वजनिक नीति को फिर विक्रेता नीति के साथ और (अपने मूल रूप में) प्लेटफ़ॉर्म नीति में शामिल किया जाता है। इस प्रकार, अंतिम नीति में निजी प्लेटफ़ॉर्म नीति, वर्तमान प्लेटफ़ॉर्म की सार्वजनिक सेपॉलिसी, डिवाइस-विशिष्ट नीति और प्लेटफ़ॉर्म संस्करण के अनुरूप संस्करण वाली सार्वजनिक नीति शामिल है जिसके विरुद्ध डिवाइस नीति लिखी गई थी।

प्लेटफ़ॉर्म निजी सेपॉलिसी

प्लेटफ़ॉर्म प्राइवेट सेपॉलिसी में /system/sepolicy/private के अंतर्गत परिभाषित सभी चीज़ें शामिल हैं। नीति का यह भाग प्लेटफ़ॉर्म-केवल प्रकार, अनुमतियाँ और प्लेटफ़ॉर्म कार्यक्षमता के लिए आवश्यक विशेषताएँ बनाता है। इन्हें vendor/device नीति लेखकों को निर्यात नहीं किया जाता है। गैर-प्लेटफ़ॉर्म नीति लेखकों को प्लेटफ़ॉर्म प्राइवेट सेपॉलिसी में परिभाषित प्रकारों/विशेषताओं/नियमों के आधार पर अपने नीति विस्तार नहीं लिखने चाहिए। इसके अलावा, इन नियमों को संशोधित करने की अनुमति है या केवल-फ्रेमवर्क अपडेट के हिस्से के रूप में गायब हो सकते हैं।

प्लेटफ़ॉर्म निजी मानचित्रण

प्लेटफ़ॉर्म प्राइवेट मैपिंग में नीति कथन शामिल होते हैं जो पिछले प्लेटफ़ॉर्म संस्करणों की प्लेटफ़ॉर्म सार्वजनिक नीति में उजागर विशेषताओं को वर्तमान प्लेटफ़ॉर्म सार्वजनिक सेपॉलिसी में उपयोग किए जाने वाले ठोस प्रकारों से मैप करते हैं। यह सुनिश्चित करता है कि पिछले प्लेटफ़ॉर्म सार्वजनिक सेपॉलिसी संस्करण से प्लेटफ़ॉर्म सार्वजनिक विशेषताओं के आधार पर लिखी गई विक्रेता नीति काम करना जारी रखे। संस्करण किसी दिए गए प्लेटफ़ॉर्म संस्करण के लिए AOSP में PLATFORM_SEPOLICY_VERSION बिल्ड वेरिएबल सेट पर आधारित है। प्रत्येक पिछले प्लेटफ़ॉर्म संस्करण के लिए एक अलग मैपिंग फ़ाइल मौजूद है जिससे इस प्लेटफ़ॉर्म को विक्रेता नीति स्वीकार करने की उम्मीद है। अधिक विवरण के लिए, संगतता देखें।

एंड्रॉइड 11 और उच्चतर

system_ext और उत्पाद sepolicy

Android 11 में system_ext नीति और उत्पाद नीति जोड़ी गई है। प्लेटफ़ॉर्म sepolicy की तरह, system_ext नीति और उत्पाद नीति को सार्वजनिक नीति और निजी नीति में विभाजित किया गया है।

सार्वजनिक नीति विक्रेता को निर्यात की जाती है। प्रकार और विशेषताएँ स्थिर एपीआई बन जाती हैं, और विक्रेता नीति सार्वजनिक नीति में प्रकारों और विशेषताओं को संदर्भित कर सकती है। प्रकारों को PLATFORM_SEPOLICY_VERSION के अनुसार संस्करणित किया जाता है, और संस्करणित नीति को विक्रेता नीति में शामिल किया जाता है। मूल नीति प्रत्येक system_ext और उत्पाद विभाजन में शामिल है।

निजी नीति में system_ext-only और product-only प्रकार, अनुमतियाँ और system_ext और उत्पाद विभाजन की कार्यक्षमता के लिए आवश्यक विशेषताएँ शामिल हैं। निजी नीति विक्रेता के लिए अदृश्य है, जिसका अर्थ है कि ये नियम आंतरिक हैं और इन्हें संशोधित करने की अनुमति है।

system_ext और उत्पाद मैपिंग

system_ext और उत्पाद को विक्रेता को उनके निर्दिष्ट सार्वजनिक प्रकार निर्यात करने की अनुमति है। हालाँकि, अनुकूलता बनाए रखने की जिम्मेदारी प्रत्येक भागीदार की अपनी होती है। अनुकूलता के लिए, भागीदार अपनी स्वयं की मैपिंग फ़ाइलें प्रदान कर सकते हैं जो पिछले संस्करणों की संस्करणित विशेषताओं को वर्तमान सार्वजनिक सेपॉलिसी में उपयोग किए जाने वाले ठोस प्रकारों से मैप करती हैं।

  • System_ext के लिए मैपिंग फ़ाइल स्थापित करने के लिए, वांछित मैपिंग जानकारी वाली एक sil फ़ाइल को {SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil में रखें, और फिर system_ext_{ver}.cil को PRODUCT_PACKAGES में जोड़ें।
  • उत्पाद के लिए मैपिंग फ़ाइल स्थापित करने के लिए, वांछित मैपिंग जानकारी वाली एक sil फ़ाइल को {PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil रखें, और फिर product_{ver}.cil को PRODUCT_PACKAGES में जोड़ें।
  • एक उदाहरण देखें जो रेडबुल डिवाइस के उत्पाद विभाजन की मैपिंग फ़ाइल जोड़ता है।

    SELinux नीति का निर्माण

    एंड्रॉइड 8.0 में SELinux नीति /system और /vendor के टुकड़ों को मिलाकर बनाई गई है। इसे उचित रूप से स्थापित करने का तर्क /platform/system/sepolicy/Android.mk में है।

    नीति निम्नलिखित स्थानों पर मौजूद है:

    जगह रोकना
    system/sepolicy/public प्लेटफ़ॉर्म की सेपॉलिसी एपीआई
    system/sepolicy/private प्लेटफ़ॉर्म कार्यान्वयन विवरण (विक्रेता अनदेखा कर सकते हैं)
    system/sepolicy/vendor नीति और संदर्भ फ़ाइलें जिनका विक्रेता उपयोग कर सकते हैं (विक्रेता चाहें तो अनदेखा कर सकते हैं)
    BOARD_SEPOLICY_DIRS विक्रेता सेपॉलिसी
    BOARD_ODM_SEPOLICY_DIRS (एंड्रॉइड 9 और उच्चतर) ओडीएम सेपॉलिसी
    SYSTEM_EXT_PUBLIC_SEPOLICY_DIRS (Android 11 और उच्चतर) System_ext की सेपॉलिसी एपीआई
    SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 और उच्चतर) System_ext कार्यान्वयन विवरण (विक्रेता अनदेखा कर सकते हैं)
    PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 और उच्चतर) उत्पाद की सेपॉलिसी एपीआई
    PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 और उच्चतर) उत्पाद कार्यान्वयन विवरण (विक्रेता अनदेखा कर सकते हैं)

    बिल्ड सिस्टम इस नीति को लेता है और संबंधित विभाजन पर सिस्टम, सिस्टम_एक्स्ट, उत्पाद, विक्रेता और ओडीएम नीति घटकों का उत्पादन करता है। चरणों में शामिल हैं:

    1. नीतियों को विशेष रूप से SELinux कॉमन इंटरमीडिएट लैंग्वेज (CIL) प्रारूप में परिवर्तित करना:
      1. सार्वजनिक मंच नीति (सिस्टम + system_ext + उत्पाद)
      2. संयुक्त निजी+सार्वजनिक नीति
      3. सार्वजनिक + विक्रेता और BOARD_SEPOLICY_DIRS नीति
    2. विक्रेता नीति के भाग के रूप में जनता द्वारा प्रदान की गई नीति का संस्करण बनाना। संयुक्त सार्वजनिक + विक्रेता + BOARD_SEPOLICY_DIRS नीति को सूचित करने के लिए उत्पादित सार्वजनिक सीआईएल नीति का उपयोग करके किया गया कि किन हिस्सों को उन विशेषताओं में बदला जाना चाहिए जिन्हें प्लेटफ़ॉर्म नीति से जोड़ा जाएगा।
    3. प्लेटफ़ॉर्म और विक्रेता भागों को जोड़ने वाली एक मैपिंग फ़ाइल बनाना। प्रारंभ में, यह केवल सार्वजनिक नीति के प्रकारों को विक्रेता नीति में संबंधित विशेषताओं के साथ जोड़ता है; बाद में यह भविष्य के प्लेटफ़ॉर्म संस्करणों में रखी गई फ़ाइल के लिए आधार भी प्रदान करेगा, जिससे इस प्लेटफ़ॉर्म संस्करण को लक्षित करने वाली विक्रेता नीति के साथ अनुकूलता सक्षम होगी।
    4. नीति फ़ाइलों का संयोजन (ऑन-डिवाइस और पूर्व-संकलित समाधान दोनों का वर्णन करें)।
      1. मैपिंग, प्लेटफ़ॉर्म और विक्रेता नीति को मिलाएं।
      2. आउटपुट बाइनरी पॉलिसी फ़ाइल संकलित करें।

    पूर्वसंकलित SELinux नीति

    init SELinux को चालू करने से पहले, init सभी CIL फ़ाइलों को विभाजन ( system , system_ext , product , vendor और odm ) से इकट्ठा करता है और उन्हें बाइनरी पॉलिसी में संकलित करता है, प्रारूप जिसे कर्नेल में लोड किया जा सकता है। चूँकि संकलन में समय लगता है (आमतौर पर 1-2 सेकंड), CIL फ़ाइलें निर्माण समय पर पूर्व-संकलित होती हैं और sha256 हैश के साथ या तो /vendor/etc/selinux/precompiled_sepolicy या /odm/etc/selinux/precompiled_sepolicy पर रखी जाती हैं इनपुट सीआईएल फाइलों की। रनटाइम के दौरान, 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 देखें।