এই নিবন্ধটি SELinux নীতি কীভাবে তৈরি করা হয় তা কভার করে। SELinux নীতিটি মূল AOSP নীতি (প্ল্যাটফর্ম) এবং ডিভাইস-নির্দিষ্ট নীতি (বিক্রেতা) এর সমন্বয় থেকে তৈরি করা হয়েছে। Android 7.0 এর মাধ্যমে Android 4.4-এর জন্য SELinux পলিসি বিল্ড ফ্লো সমস্ত সেপলিসি ফ্র্যাগমেন্ট একত্রিত করে তারপর রুট ডিরেক্টরিতে মনোলিথিক ফাইল তৈরি করে। এর মানে হল যে SoC বিক্রেতারা এবং ODM নির্মাতারা boot.img
(নন-A/B ডিভাইসের জন্য) বা system.img
(A/B ডিভাইসের জন্য) প্রতিবার নীতি পরিবর্তন করেছে।
অ্যান্ড্রয়েড 8.0 এবং উচ্চতর, প্ল্যাটফর্ম এবং বিক্রেতা নীতি আলাদাভাবে তৈরি করা হয়েছে। SOCs এবং OEMগুলি তাদের নীতির অংশগুলি আপডেট করতে পারে, তাদের ছবিগুলি তৈরি করতে পারে (যেমন, vendor.img
এবং boot.img
), তারপর সেই ছবিগুলিকে প্ল্যাটফর্ম আপডেটগুলি ছাড়াই আপডেট করতে পারে৷
যাইহোক, যেহেতু মডুলারাইজড SELinux পলিসি ফাইলগুলি /vendor
পার্টিশনে সংরক্ষণ করা হয়, তাই init
প্রক্রিয়াটি অবশ্যই সিস্টেম এবং ভেন্ডর পার্টিশনগুলিকে আগে মাউন্ট করতে হবে যাতে এটি সেই পার্টিশনগুলি থেকে SELinux ফাইলগুলি পড়তে পারে এবং সেগুলিকে সিস্টেম ডিরেক্টরিতে মূল SELinux ফাইলগুলির সাথে মার্জ করতে পারে (সেগুলি লোড করার আগে কার্নেল)।
সোর্স ফাইল
SELinux নির্মাণের যুক্তি এই ফাইলগুলিতে রয়েছে:
-
external/selinux
: এক্সটার্নাল SELinux প্রোজেক্ট, SELinux পলিসি এবং লেবেল কম্পাইল করার জন্য HOST কমান্ড লাইন ইউটিলিটি তৈরি করতে ব্যবহৃত হয়।-
external/selinux/libselinux
: Android কিছু Android-নির্দিষ্ট কাস্টমাইজেশন সহ বাহ্যিকlibselinux
প্রকল্পের একটি উপসেট ব্যবহার করে। বিস্তারিত জানার জন্য,external/selinux/README.android
দেখুন। -
external/selinux/libsepol
: -
external/selinux/checkpolicy
: SELinux পলিসি কম্পাইলার (হোস্ট এক্সিকিউটেবল:checkpolicy
,checkmodule
এবংdispol
)।libsepol
উপর নির্ভর করে।
-
-
system/sepolicy
: মূল Android SELinux নীতি কনফিগারেশন, প্রসঙ্গ এবং নীতি ফাইল সহ। প্রধান সেপলিসি বিল্ড লজিক এখানেও রয়েছে (system/sepolicy/Android.mk
)।
system/sepolicy
ইমপ্লিমেন্টিং SELinux- এ ফাইলগুলির উপর আরো বিস্তারিত জানার জন্য।
Android 7.0 এবং তার আগের
এই বিভাগে SELinux পলিসি কীভাবে Android 7.x এবং তার আগের সংস্করণে তৈরি করা হয়েছে তা কভার করে।
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.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
- sepolicy: পলিসি ফাইলগুলিকে একত্রিত করার পরে বাইনারি আউটপুট (যেমন,
security_classes
,initial_sids
, এবং*.te
) -
file_contexts
-
property_contexts
-
seapp_contexts
-
service_contexts
-
system/etc/mac_permissions.xml
আরো বিস্তারিত জানার জন্য, SELinux বাস্তবায়ন দেখুন।
SELinux আরম্ভ
সিস্টেম বুট আপ হলে, SELinux পারমিসিভ মোডে থাকে (এবং এনফোর্সিং মোডে নয়)। init প্রক্রিয়া নিম্নলিখিত কাজগুলি সম্পাদন করে:
- ramdisk থেকে
/sys/fs/selinux/load
এর মাধ্যমে কার্নেলের মধ্যেsepolicy
ফাইল লোড করা হয়। - এনফোর্সিং মোডে SELinux স্যুইচ করে।
- SELinux ডোমেইন নিয়ম নিজের উপর প্রয়োগ করতে
re-exec()
চালায়।
বুট সময় সংক্ষিপ্ত করতে, যত তাড়াতাড়ি সম্ভব init
প্রক্রিয়ায় re-exec()
সম্পাদন করুন।
Android 8.0 এবং উচ্চতর
অ্যান্ড্রয়েড 8.0-এ, সামঞ্জস্য বজায় রেখে স্বাধীন প্ল্যাটফর্ম/বিক্রেতা নীতি আপডেট করার অনুমতি দেওয়ার জন্য SELinux নীতি প্ল্যাটফর্ম এবং বিক্রেতা উপাদানগুলিতে বিভক্ত।
প্ল্যাটফর্ম সেপলিসিকে আরও বিভক্ত করা হয়েছে প্ল্যাটফর্ম প্রাইভেট এবং প্ল্যাটফর্ম পাবলিক পার্টস-এ বিভক্ত করা হয়েছে নির্দিষ্ট ধরন এবং গুণাবলী বিক্রেতা নীতি লেখকদের কাছে রপ্তানি করার জন্য। প্ল্যাটফর্ম পাবলিক প্রকার/গুণাবলী একটি প্রদত্ত প্ল্যাটফর্ম সংস্করণের জন্য স্থিতিশীল API হিসাবে রক্ষণাবেক্ষণের গ্যারান্টিযুক্ত। প্ল্যাটফর্ম ম্যাপিং ফাইলগুলি ব্যবহার করে বিভিন্ন সংস্করণের জন্য পূর্ববর্তী প্ল্যাটফর্মের পাবলিক টাইপ/অ্যাট্রিবিউটগুলির সাথে সামঞ্জস্যতা নিশ্চিত করা যেতে পারে।
প্ল্যাটফর্ম পাবলিক সেপলিসি
প্ল্যাটফর্ম পাবলিক সেপলিসি system/sepolicy/public
অধীনে সংজ্ঞায়িত সবকিছু অন্তর্ভুক্ত করে। প্ল্যাটফর্ম অনুমান করতে পারে যে ধরনের এবং গুণাবলী পাবলিক নীতির অধীনে সংজ্ঞায়িত একটি প্রদত্ত প্ল্যাটফর্ম সংস্করণের জন্য স্থিতিশীল API। এটি সেপলিসির একটি অংশ গঠন করে যা প্ল্যাটফর্ম দ্বারা রপ্তানি করা হয় যেখানে বিক্রেতা (যেমন ডিভাইস) নীতি বিকাশকারীরা অতিরিক্ত ডিভাইস-নির্দিষ্ট নীতি লিখতে পারে।
PLATFORM_SEPOLICY_VERSION
বিল্ড ভেরিয়েবল দ্বারা সংজ্ঞায়িত নীতির যে সংস্করণের বিরুদ্ধে বিক্রেতা ফাইলগুলি লেখা হয় তার অনুসারে প্রকারগুলি সংস্করণ করা হয়৷ ভার্সনড পাবলিক পলিসি তারপর ভেন্ডর পলিসির সাথে এবং (এর আসল আকারে) প্লাটফর্ম পলিসিতে অন্তর্ভুক্ত করা হয়। এইভাবে, চূড়ান্ত নীতিতে প্রাইভেট প্ল্যাটফর্ম নীতি, বর্তমান প্ল্যাটফর্মের পাবলিক সেপলিসি, ডিভাইস-নির্দিষ্ট নীতি এবং প্ল্যাটফর্মের সংস্করণের সাথে সংশ্লিষ্ট সংস্করণযুক্ত পাবলিক নীতি অন্তর্ভুক্ত রয়েছে যার বিরুদ্ধে ডিভাইস নীতি লেখা হয়েছিল।
প্ল্যাটফর্ম ব্যক্তিগত সেপলিসি
প্ল্যাটফর্ম প্রাইভেট সেপলিসিতে /system/sepolicy/private
এর অধীনে সংজ্ঞায়িত সবকিছু অন্তর্ভুক্ত করে। নীতির এই অংশটি শুধুমাত্র প্ল্যাটফর্মের প্রকার, অনুমতি এবং প্ল্যাটফর্ম কার্যকারিতার জন্য প্রয়োজনীয় বৈশিষ্ট্যগুলি গঠন করে। এগুলি vendor/device
নীতি লেখকদের কাছে রপ্তানি করা হয় না। নন-প্ল্যাটফর্ম নীতি লেখকদের অবশ্যই প্ল্যাটফর্ম প্রাইভেট সিপলিসিতে সংজ্ঞায়িত প্রকার/গুণ/বিধির উপর ভিত্তি করে তাদের নীতির এক্সটেনশন লিখতে হবে না। তদুপরি, এই নিয়মগুলিকে সংশোধন করার অনুমতি দেওয়া হয়েছে বা শুধুমাত্র ফ্রেমওয়ার্ক আপডেটের অংশ হিসাবে অদৃশ্য হতে পারে৷
প্ল্যাটফর্ম ব্যক্তিগত ম্যাপিং
প্ল্যাটফর্ম প্রাইভেট ম্যাপিং-এর মধ্যে নীতি বিবৃতি রয়েছে যা প্ল্যাটফর্মের পাবলিক পলিসিতে পূর্ববর্তী প্ল্যাটফর্ম সংস্করণগুলির প্রকাশ করা বৈশিষ্ট্যগুলিকে বর্তমান প্ল্যাটফর্ম পাবলিক সেপলিসিতে ব্যবহৃত কংক্রিট প্রকারের সাথে ম্যাপ করে। এটি পূর্ববর্তী প্ল্যাটফর্ম পাবলিক সেপলিসি সংস্করণ(গুলি) থেকে প্ল্যাটফর্ম পাবলিক অ্যাট্রিবিউটের উপর ভিত্তি করে লিখিত বিক্রেতা নীতিটি কাজ চালিয়ে যাওয়া নিশ্চিত করে। সংস্করণটি একটি প্রদত্ত প্ল্যাটফর্ম সংস্করণের জন্য AOSP-এ PLATFORM_SEPOLICY_VERSION
বিল্ড ভেরিয়েবল সেটের উপর ভিত্তি করে। প্রতিটি পূর্ববর্তী প্ল্যাটফর্ম সংস্করণের জন্য একটি পৃথক ম্যাপিং ফাইল বিদ্যমান যা থেকে এই প্ল্যাটফর্মটি বিক্রেতা নীতি গ্রহণ করবে বলে আশা করা হচ্ছে৷ আরো বিস্তারিত জানার জন্য, সামঞ্জস্যতা দেখুন।
Android 11 এবং উচ্চতর
system_ext এবং পণ্যের সেপলিসি
Android 11 এ, system_ext নীতি এবং পণ্য নীতি যোগ করা হয়েছে। প্ল্যাটফর্ম সেপলিসির মতো, system_ext নীতি এবং পণ্য নীতি পাবলিক নীতি এবং ব্যক্তিগত নীতিতে বিভক্ত।
পাবলিক নীতি বিক্রেতা রপ্তানি করা হয়. প্রকার এবং গুণাবলী স্থিতিশীল API হয়ে যায়, এবং বিক্রেতা নীতি পাবলিক নীতিতে প্রকার এবং গুণাবলী উল্লেখ করতে পারে। প্রকারগুলিকে PLATFORM_SEPOLICY_VERSION
অনুযায়ী সংস্করণ করা হয় এবং সংস্করণের নীতি বিক্রেতা নীতিতে অন্তর্ভুক্ত করা হয়৷ মূল নীতি প্রতিটি system_ext এবং পণ্য পার্টিশনে অন্তর্ভুক্ত করা হয়েছে।
ব্যক্তিগত নীতিতে system_ext-শুধুমাত্র এবং পণ্য-শুধুমাত্র প্রকার, অনুমতি, এবং সিস্টেম_এক্সট এবং পণ্য পার্টিশনের কার্যকারিতার জন্য প্রয়োজনীয় বৈশিষ্ট্য রয়েছে। ব্যক্তিগত নীতি বিক্রেতার কাছে অদৃশ্য, এই নিয়মগুলি অভ্যন্তরীণ এবং সংশোধন করার অনুমতি দেয়।
system_ext এবং পণ্য ম্যাপিং
system_ext এবং পণ্যকে তাদের মনোনীত পাবলিক ধরনের বিক্রেতার কাছে রপ্তানির অনুমতি দেওয়া হয়। যাইহোক, সামঞ্জস্য বজায় রাখার দায়িত্ব প্রতিটি অংশীদারের নিজের। সামঞ্জস্যের জন্য, অংশীদাররা তাদের নিজস্ব ম্যাপিং ফাইলগুলি সরবরাহ করতে পারে যা বর্তমান পাবলিক সিপলিসিতে ব্যবহৃত কংক্রিট ধরণের পূর্ববর্তী সংস্করণগুলির সংস্করণযুক্ত বৈশিষ্ট্যগুলিকে ম্যাপ করে।
- system_ext-এর জন্য একটি ম্যাপিং ফাইল ইনস্টল করতে,
{SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
এ পছন্দসই ম্যাপিং তথ্য ধারণকারী একটি cil ফাইল রাখুন এবং তারপরPRODUCT_PACKAGES
এsystem_ext_{ver}.cil
যোগ করুন। - পণ্যের জন্য একটি ম্যাপিং ফাইল ইনস্টল করতে, পছন্দসই ম্যাপিং তথ্য সম্বলিত একটি cil ফাইল
{PRODUCT_PRIVATE_SEPOLICY_DIRS}/compat/{ver}/{ver}.cil
রাখুন এবং তারপরPRODUCT_PACKAGES
এproduct_{ver}.cil
যোগ করুন। একটি উদাহরণ পড়ুন যা রেডবুল ডিভাইসের পণ্য পার্টিশনের একটি ম্যাপিং ফাইল যোগ করে। - নীতিগুলিকে SELinux কমন ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ (CIL) বিন্যাসে রূপান্তর করা, বিশেষ করে:
- পাবলিক প্ল্যাটফর্ম নীতি (সিস্টেম + সিস্টেম_এক্সট + পণ্য)
- সম্মিলিত ব্যক্তিগত + পাবলিক নীতি
- সর্বজনীন + বিক্রেতা এবং
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 নীতি তৈরি করা
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 এর sepolicy API |
SYSTEM_EXT_PRIVATE_SEPOLICY_DIRS (Android 11 এবং উচ্চতর) | System_ext বাস্তবায়নের বিবরণ (বিক্রেতারা উপেক্ষা করতে পারেন) |
PRODUCT_PUBLIC_SEPOLICY_DIRS (Android 11 এবং উচ্চতর) | পণ্যের সেপলিসি API |
PRODUCT_PRIVATE_SEPOLICY_DIRS (Android 11 এবং উচ্চতর) | পণ্য বাস্তবায়নের বিবরণ (বিক্রেতারা উপেক্ষা করতে পারেন) |
বিল্ড সিস্টেম এই নীতি গ্রহণ করে এবং সংশ্লিষ্ট পার্টিশনে সিস্টেম, system_ext, পণ্য, বিক্রেতা এবং odm নীতি উপাদান তৈরি করে। পদক্ষেপ অন্তর্ভুক্ত:
প্রি-কম্পাইল করা SELinux নীতি
init
SELinux চালু করার আগে, init
পার্টিশন ( system
, system_ext
, product
, vendor
এবং odm
) থেকে সমস্ত CIL ফাইল সংগ্রহ করে এবং সেগুলিকে বাইনারি নীতিতে কম্পাইল করে, যে বিন্যাসে কার্নেলে লোড করা যেতে পারে। যেহেতু কম্পাইলেশনে সময় লাগে (সাধারণত 1-2 সেকেন্ড), CIL ফাইলগুলি বিল্ড টাইমে আগে থেকে কম্পাইল করা হয় এবং sha256 হ্যাশের সাথে /vendor/etc/selinux/precompiled_sepolicy
বা /odm/etc/selinux/precompiled_sepolicy
এ স্থাপন করা হয়। ইনপুট CIL ফাইলগুলির। রানটাইমে, init
চেক করে যে কোনো পলিসি ফাইল হ্যাশের তুলনা করে আপডেট করা হয়েছে কিনা। যদি কিছুই পরিবর্তিত না হয়, init
প্রি-কম্পাইল করা নীতি লোড করে। যদি না হয়, তাহলে init
ফ্লাইতে কম্পাইল করে এবং প্রি-কম্পাইলডের পরিবর্তে এটি ব্যবহার করে।
আরও নির্দিষ্টভাবে, পূর্বনির্ধারিত নীতি ব্যবহার করা হয় যদি নিম্নলিখিত সমস্ত শর্ত পূরণ করা হয়। এখানে, {partition}
সেই পার্টিশনের প্রতিনিধিত্ব করে যেখানে প্রি-কম্পাইল করা নীতি বিদ্যমান: হয় vendor
বা odm
।
যদি তাদের মধ্যে কোনো পার্থক্য থাকে, তাহলে init
ডিভাইসের সংকলন পাথে ফিরে আসে। আরো বিস্তারিত জানার জন্য system/core/init/selinux.cpp
দেখুন।