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

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

Android 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 : कोर Android SELinux नीति विन्यास, जिसमें संदर्भ और नीति फाइलें शामिल हैं। मेजर सेपॉलिसी बिल्ड लॉजिक भी यहाँ है ( system/sepolicy/Android.mk )।

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

Android 7.0 और पुराने संस्करण

यह खंड बताता है कि Android 7.x और इससे पहले के संस्करण में SELinux नीति कैसे बनाई जाती है।

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

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

उदाहरण के लिए, एक एसओसी विक्रेता और एक ओडीएम प्रत्येक एक निर्देशिका जोड़ सकते हैं, एक एसओसी-विशिष्ट सेटिंग्स के लिए और दूसरा डिवाइस-विशिष्ट सेटिंग्स के लिए, किसी दिए गए डिवाइस के लिए अंतिम 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 initial_sids , 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
  • sepolicy: नीति फ़ाइलों के संयोजन के बाद बाइनरी आउटपुट (जैसे, security_classes , Initial_sids , और *.te initial_sids
  • file_contexts
  • property_contexts
  • seapp_contexts
  • service_contexts
  • system/etc/mac_permissions.xml

अधिक जानकारी के लिए, SELinux को लागू करना देखें।

SELinux आरंभीकरण

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

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

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

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

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

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

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

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

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

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

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

प्लेटफार्म निजी मैपिंग

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

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

system_ext और उत्पाद sepolicy

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

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

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

system_ext और उत्पाद मानचित्रण

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

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

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

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

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

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

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

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