इस लेख में बताया गया है कि 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
: -
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
उत्पन्न करने के लिए संयोजित किया गया है:

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