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