SELinux-এর ধারণাগুলোর সাথে পরিচিত হতে এই পৃষ্ঠাটি পর্যালোচনা করুন।
বাধ্যতামূলক প্রবেশাধিকার নিয়ন্ত্রণ
সিকিউরিটি এনহ্যান্সড লিনাক্স (SELinux) হলো লিনাক্স অপারেটিং সিস্টেমের জন্য একটি বাধ্যতামূলক অ্যাক্সেস কন্ট্রোল (MAC) সিস্টেম। একটি MAC সিস্টেম হিসেবে, এটি লিনাক্সের পরিচিত বিবেচনামূলক অ্যাক্সেস কন্ট্রোল (DAC) সিস্টেম থেকে ভিন্ন। একটি DAC সিস্টেমে মালিকানার একটি ধারণা বিদ্যমান, যার মাধ্যমে কোনো নির্দিষ্ট রিসোর্সের মালিক সেটির সাথে সম্পর্কিত অ্যাক্সেস পারমিশন নিয়ন্ত্রণ করে। এটি সাধারণত স্থূল-স্তরের এবং এতে অনিচ্ছাকৃত প্রিভিলেজ বৃদ্ধির ঝুঁকি থাকে। কিন্তু একটি MAC সিস্টেম, সমস্ত অ্যাক্সেস প্রচেষ্টার বিষয়ে সিদ্ধান্তের জন্য একটি কেন্দ্রীয় কর্তৃপক্ষের সাথে পরামর্শ করে।
SELinux-কে লিনাক্স সিকিউরিটি মডিউল (LSM) ফ্রেমওয়ার্কের একটি অংশ হিসেবে বাস্তবায়ন করা হয়েছে, যা বিভিন্ন কার্নেল অবজেক্ট এবং সেগুলোর উপর সম্পাদিত সংবেদনশীল কার্যকলাপ শনাক্ত করে। এই কার্যকলাপগুলোর প্রত্যেকটি যখন সম্পাদিত হয়, তখন একটি অস্বচ্ছ নিরাপত্তা অবজেক্টে সংরক্ষিত তথ্যের উপর ভিত্তি করে কাজটি অনুমোদিত হবে কি না, তা নির্ধারণ করার জন্য একটি LSM হুক ফাংশন কল করা হয়। SELinux এই হুকগুলো এবং এই নিরাপত্তা অবজেক্টগুলোর ব্যবস্থাপনার জন্য একটি বাস্তবায়ন ব্যবস্থা প্রদান করে, যা এর নিজস্ব পলিসির সাথে মিলিত হয়ে অ্যাক্সেসের সিদ্ধান্ত নির্ধারণ করে।
অন্যান্য অ্যান্ড্রয়েড নিরাপত্তা ব্যবস্থার পাশাপাশি, অ্যান্ড্রয়েডের অ্যাক্সেস কন্ট্রোল পলিসি হ্যাক হওয়া মেশিন এবং অ্যাকাউন্টের সম্ভাব্য ক্ষতিকে অনেকাংশে সীমিত করে। অ্যান্ড্রয়েডের ডিসক্রেশনারি এবং ম্যান্ডেটরি অ্যাক্সেস কন্ট্রোলের মতো টুল ব্যবহার করে আপনি এমন একটি কাঠামো পান যা নিশ্চিত করে যে আপনার সফটওয়্যার শুধুমাত্র সর্বনিম্ন প্রিভিলেজ লেভেলে চলে। এটি আক্রমণের প্রভাব প্রশমিত করে এবং ত্রুটিপূর্ণ প্রসেস দ্বারা ডেটা ওভাররাইট বা এমনকি ট্রান্সমিট করার সম্ভাবনা কমিয়ে দেয়।
অ্যান্ড্রয়েড ৪.৩ এবং তার পরবর্তী সংস্করণগুলোতে, SELinux প্রচলিত ডিসক্রেশনারি অ্যাক্সেস কন্ট্রোল (DAC) পরিবেশের উপর একটি ম্যান্ডেটরি অ্যাক্সেস কন্ট্রোল (MAC) সুরক্ষা প্রদান করে। উদাহরণস্বরূপ, র ব্লক ডিভাইসে লেখার জন্য সফটওয়্যারকে সাধারণত রুট ইউজার অ্যাকাউন্ট হিসেবে চালাতে হয়। একটি প্রচলিত DAC-ভিত্তিক লিনাক্স পরিবেশে, যদি রুট ইউজারের অ্যাক্সেস হ্যাক হয়, তবে সেই ইউজার প্রতিটি র ব্লক ডিভাইসে লিখতে পারে। তবে, SELinux ব্যবহার করে এই ডিভাইসগুলোকে লেবেল করা যায়, যাতে রুট প্রিভিলেজ প্রাপ্ত প্রসেসটি শুধুমাত্র সংশ্লিষ্ট পলিসিতে উল্লেখিত ডিভাইসগুলোতেই লিখতে পারে। এইভাবে, প্রসেসটি নির্দিষ্ট র ব্লক ডিভাইসের বাইরের ডেটা এবং সিস্টেম সেটিংস ওভাররাইট করতে পারে না।
বিভিন্ন হুমকির আরও উদাহরণ এবং SELinux ব্যবহার করে সেগুলো মোকাবেলা করার উপায় জানতে ইউজ কেসেস (Use Cases) দেখুন।
প্রয়োগের স্তর
SELinux বিভিন্ন মোডে প্রয়োগ করা যেতে পারে:
- অনুমতিমূলক - SELinux নিরাপত্তা নীতি প্রয়োগ করা হয় না, শুধু লগ করা হয়।
- প্রয়োগ করা হচ্ছে - নিরাপত্তা নীতি প্রয়োগ করা হয় এবং তা নথিভুক্ত করা হয়। ব্যর্থতাগুলো EPERM ত্রুটি হিসেবে প্রদর্শিত হয়।
এই পছন্দটি দ্বিমুখী এবং এটি নির্ধারণ করে যে আপনার নীতি কোনো পদক্ষেপ নেবে, নাকি কেবল আপনাকে সম্ভাব্য ব্যর্থতাগুলো সংগ্রহ করার সুযোগ দেবে। বাস্তবায়নের সময় শিথিল বিকল্পটি বিশেষভাবে উপযোগী।
প্রকার, বৈশিষ্ট্য এবং নিয়ম
অ্যান্ড্রয়েড তার পলিসির জন্য SELinux-এর টাইপ এনফোর্সমেন্ট (TE) কম্পোনেন্টের উপর নির্ভর করে। এর মানে হলো, সমস্ত অবজেক্টের (যেমন, ফাইল, প্রসেস বা সকেট) সাথে একটি টাইপ যুক্ত থাকে। উদাহরণস্বরূপ, ডিফল্টরূপে, একটি অ্যাপের টাইপ হলো untrusted_app । একটি প্রসেসের ক্ষেত্রে, এর টাইপটি এর ডোমেইন নামেও পরিচিত। একটি টাইপকে এক বা একাধিক অ্যাট্রিবিউট দিয়ে চিহ্নিত করা সম্ভব। একই সময়ে একাধিক টাইপকে নির্দেশ করার জন্য অ্যাট্রিবিউটগুলো কার্যকর।
অবজেক্টগুলোকে ক্লাসের সাথে ম্যাপ করা হয় (যেমন, একটি ফাইল, একটি ডিরেক্টরি, একটি সিম্বলিক লিঙ্ক, একটি সকেট) এবং প্রতিটি ক্লাসের বিভিন্ন ধরনের অ্যাক্সেস পারমিশন দ্বারা প্রকাশ করা হয়। উদাহরণস্বরূপ, ` file ক্লাসের জন্য open পারমিশনটি বিদ্যমান। অ্যান্ড্রয়েড SELinux পলিসির অংশ হিসেবে টাইপ এবং অ্যাট্রিবিউটগুলো নিয়মিত আপডেট করা হলেও, পারমিশন এবং ক্লাসগুলো স্ট্যাটিক্যালি সংজ্ঞায়িত থাকে এবং নতুন লিনাক্স রিলিজের অংশ হিসেবে খুব কমই আপডেট করা হয়।
একটি পলিসি রুল এই আকারে আসে: allow source target : class permissions ; যেখানে:
- উৎস - নিয়মটির বিষয়ের ধরণ (বা বৈশিষ্ট্য)। কে অ্যাক্সেসের জন্য অনুরোধ করছে?
- টার্গেট - অবজেক্টটির ধরন (বা অ্যাট্রিবিউট)। কিসের অ্যাক্সেস চাওয়া হচ্ছে?
- ক্লাস - যে ধরনের অবজেক্ট (যেমন, ফাইল, সকেট) অ্যাক্সেস করা হচ্ছে।
- অনুমতি - যে কাজটি (বা একাধিক কাজ) (যেমন, পড়া, লেখা) করা হচ্ছে।
নিয়মের একটি উদাহরণ হলো:
allow untrusted_app app_data_file:file { read write };
এর মানে হলো, অ্যাপগুলোকে app_data_file লেবেলযুক্ত ফাইল পড়তে ও লিখতে অনুমতি দেওয়া হয়েছে। অ্যাপের আরও অন্যান্য প্রকারভেদও রয়েছে। উদাহরণস্বরূপ, isolated_app সেইসব অ্যাপ সার্ভিসের জন্য ব্যবহৃত হয়, যাদের ম্যানিফেস্টে isolatedProcess=true থাকে। উভয় প্রকারের জন্য নিয়মটির পুনরাবৃত্তি না করে, অ্যান্ড্রয়েড অ্যাপ-সম্পর্কিত সমস্ত প্রকারের জন্য appdomain নামের একটি অ্যাট্রিবিউট ব্যবহার করে:
# Associate the attribute appdomain with the type untrusted_app.
typeattribute untrusted_app appdomain;
# Associate the attribute appdomain with the type isolated_app.
typeattribute isolated_app appdomain;
allow appdomain app_data_file:file { read write };
যখন কোনো নিয়মে একটি অ্যাট্রিবিউটের নাম উল্লেখ করে লেখা হয়, তখন সেই নামটি স্বয়ংক্রিয়ভাবে অ্যাট্রিবিউটটির সাথে সম্পর্কিত ডোমেইন বা টাইপের তালিকায় প্রসারিত হয়। কয়েকটি উল্লেখযোগ্য অ্যাট্রিবিউট হলো:
-
domain- সকল প্রক্রিয়া প্রকারের সাথে সম্পর্কিত বৈশিষ্ট্য, -
file_type- সকল ফাইল টাইপের সাথে যুক্ত অ্যাট্রিবিউট।
ম্যাক্রো
বিশেষ করে ফাইল অ্যাক্সেসের ক্ষেত্রে, অনেক ধরনের পারমিশন বিবেচনা করতে হয়। উদাহরণস্বরূপ, ফাইলটি খোলার জন্য বা সেটির উপর stat কমান্ড চালানোর জন্য read পারমিশন যথেষ্ট নয়। রুল বা নিয়মের সংজ্ঞা সহজ করার জন্য, অ্যান্ড্রয়েড সবচেয়ে সাধারণ ক্ষেত্রগুলো সামলানোর জন্য এক সেট ম্যাক্রো প্রদান করে। উদাহরণস্বরূপ, open এর মতো অনুপস্থিত পারমিশনগুলো অন্তর্ভুক্ত করার জন্য, উপরের রুলটিকে এভাবে নতুন করে লেখা যেতে পারে:
allow appdomain app_data_file:file rw_file_perms;
আরও দরকারি ম্যাক্রোর উদাহরণের জন্য global_macros এবং te_macros ফাইলগুলো দেখুন। সংশ্লিষ্ট অনুমতির অস্বীকৃতির কারণে ব্যর্থতার সম্ভাবনা কমাতে যথাসম্ভব ম্যাক্রো ব্যবহার করা উচিত।
একবার কোনো টাইপ সংজ্ঞায়িত হয়ে গেলে, সেটিকে তার প্রতিনিধিত্বকারী ফাইল বা প্রসেসের সাথে যুক্ত করতে হয়। এই সংযোগটি কীভাবে করা হয় সে সম্পর্কে আরও বিস্তারিত জানতে Implementing SELinux দেখুন। রুলস সম্পর্কে আরও তথ্যের জন্য, SELinux নোটবুকটি দেখুন।
নিরাপত্তা প্রেক্ষাপট এবং বিভাগসমূহ
SELinux পলিসি ডিবাগ করার সময় বা ফাইল লেবেল করার সময় ( file_contexts বা ls -Z ব্যবহার করে), আপনি একটি সিকিউরিটি কনটেক্সট (যা লেবেল নামেও পরিচিত) দেখতে পারেন। উদাহরণস্বরূপ: u:r:untrusted_app:s0:c15,c256,c513,c768 । একটি সিকিউরিটি কনটেক্সটের ফরম্যাট হলো: user:role:type:sensitivity[:categories] । আপনি সাধারণত একটি কনটেক্সটের user , role এবং sensitivity ফিল্ডগুলো উপেক্ষা করতে পারেন ( Specificity দেখুন)। type ফিল্ডটি পূর্ববর্তী বিভাগে ব্যাখ্যা করা হয়েছে। categories SELinux-এর মাল্টি-লেভেল সিকিউরিটি (MLS) সাপোর্টের একটি অংশ। Android 12 এবং তার পরবর্তী সংস্করণগুলোতে, ক্যাটাগরিগুলো নিম্নলিখিত কাজে ব্যবহৃত হয়:
- অ্যাপের ডেটাকে অন্য কোনো অ্যাপের অ্যাক্সেস থেকে বিচ্ছিন্ন করুন।
- অ্যাপের ডেটা একজন ব্যবহারকারী থেকে অন্য ব্যবহারকারীর কাছে পৃথক করুন।
নির্দিষ্টতা
অ্যান্ড্রয়েড SELinux-এর দেওয়া সমস্ত বৈশিষ্ট্য ব্যবহার করে না। বাহ্যিক ডকুমেন্টেশন পড়ার সময় এই বিষয়গুলো মনে রাখবেন:
- AOSP-এর অধিকাংশ পলিসি কার্নেল পলিসি ল্যাঙ্গুয়েজ (Kernel Policy Language) ব্যবহার করে সংজ্ঞায়িত করা হয়। কমন ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ (CIL) ব্যবহারের ক্ষেত্রে কিছু ব্যতিক্রম রয়েছে।
- SELinux ব্যবহারকারী ব্যবহৃত হয় না। একমাত্র সংজ্ঞায়িত ব্যবহারকারী হলো
u। প্রয়োজনে, একটি সিকিউরিটি কনটেক্সট-এর 'ক্যাটাগরি' ফিল্ড ব্যবহার করে বাস্তব ব্যবহারকারীদের উপস্থাপন করা হয়। - SELinux রোল এবং রোল-বেসড অ্যাক্সেস কন্ট্রোল (RBAC) ব্যবহার করা হয় না। দুটি ডিফল্ট রোল সংজ্ঞায়িত ও ব্যবহৃত হয়: সাবজেক্টের জন্য
rএবং অবজেক্টের জন্যobject_r। - SELinux সেনসিটিভিটি ব্যবহার করা হয় না। ডিফল্ট
s0সেনসিটিভিটি সর্বদা সেট করা থাকে। - SELinux বুলিয়ান ব্যবহার করা হয় না। যখন কোনো ডিভাইসের জন্য পলিসি তৈরি করা হয়, তখন তা ডিভাইসটির অবস্থার উপর নির্ভর করে না। এটি পলিসির নিরীক্ষা এবং ডিবাগিংকে সহজ করে তোলে।