SELinux ধারণা

SELinux ধারণাগুলির সাথে পরিচিত হতে এই পৃষ্ঠাটি পর্যালোচনা করুন।

বাধ্যতামূলক প্রবেশাধিকার নিয়ন্ত্রণ

সিকিউরিটি এনহ্যান্সড লিনাক্স (SELinux), লিনাক্স অপারেটিং সিস্টেমের জন্য একটি বাধ্যতামূলক অ্যাক্সেস কন্ট্রোল (MAC) সিস্টেম। একটি MAC সিস্টেম হিসাবে, এটি লিনাক্সের পরিচিত ডিসক্রিশনারি অ্যাক্সেস কন্ট্রোল (DAC) সিস্টেম থেকে আলাদা। একটি DAC সিস্টেমে, মালিকানার একটি ধারণা বিদ্যমান, যার মাধ্যমে একটি নির্দিষ্ট রিসোর্সের মালিক এর সাথে সম্পর্কিত অ্যাক্সেস অনুমতিগুলি নিয়ন্ত্রণ করেন। এটি সাধারণত মোটা দানাদার এবং অনিচ্ছাকৃত বিশেষাধিকার বৃদ্ধির বিষয়। তবে, একটি MAC সিস্টেম সমস্ত অ্যাক্সেস প্রচেষ্টার সিদ্ধান্তের জন্য একটি কেন্দ্রীয় কর্তৃপক্ষের সাথে পরামর্শ করে।

SELinux লিনাক্স সিকিউরিটি মডিউল (LSM) ফ্রেমওয়ার্কের অংশ হিসেবে বাস্তবায়িত হয়েছে, যা বিভিন্ন কার্নেল অবজেক্ট এবং তাদের উপর সম্পাদিত সংবেদনশীল ক্রিয়াগুলিকে স্বীকৃতি দেয়। এই প্রতিটি ক্রিয়া সম্পাদনের সময়, একটি অস্বচ্ছ সুরক্ষা অবজেক্টে সংরক্ষিত তথ্যের উপর ভিত্তি করে ক্রিয়াটি অনুমোদিত কিনা তা নির্ধারণ করার জন্য একটি LSM হুক ফাংশন ডাকা হয়। SELinux এই হুকগুলির জন্য একটি বাস্তবায়ন এবং এই সুরক্ষা অবজেক্টগুলির পরিচালনা প্রদান করে, যা অ্যাক্সেস সিদ্ধান্ত নির্ধারণের জন্য তার নিজস্ব নীতির সাথে একত্রিত হয়।

অন্যান্য অ্যান্ড্রয়েড নিরাপত্তা ব্যবস্থার পাশাপাশি, অ্যান্ড্রয়েডের অ্যাক্সেস নিয়ন্ত্রণ নীতি ক্ষতিগ্রস্ত মেশিন এবং অ্যাকাউন্টের সম্ভাব্য ক্ষতিকে ব্যাপকভাবে সীমিত করে। অ্যান্ড্রয়েডের বিবেচনামূলক এবং বাধ্যতামূলক অ্যাক্সেস নিয়ন্ত্রণের মতো সরঞ্জামগুলি ব্যবহার করলে আপনি নিশ্চিত করতে পারবেন যে আপনার সফ্টওয়্যারটি কেবলমাত্র ন্যূনতম বিশেষাধিকার স্তরে চলছে। এটি আক্রমণের প্রভাব হ্রাস করে এবং ত্রুটিপূর্ণ প্রক্রিয়াগুলি ওভাররাইট করা বা এমনকি ডেটা প্রেরণের সম্ভাবনা হ্রাস করে।

অ্যান্ড্রয়েড ৪.৩ এবং উচ্চতর সংস্করণে, SELinux ঐতিহ্যবাহী ডিসক্রিশনারি অ্যাক্সেস কন্ট্রোল (DAC) পরিবেশের উপর একটি বাধ্যতামূলক অ্যাক্সেস কন্ট্রোল (MAC) ছাতা প্রদান করে। উদাহরণস্বরূপ, র ব্লক ডিভাইসে লেখার জন্য সফ্টওয়্যারটিকে সাধারণত রুট ব্যবহারকারী অ্যাকাউন্ট হিসাবে চালাতে হয়। একটি ঐতিহ্যবাহী DAC-ভিত্তিক লিনাক্স পরিবেশে, যদি রুট ব্যবহারকারীর সাথে আপোস করা হয় তবে ব্যবহারকারী প্রতিটি র ব্লক ডিভাইসে লিখতে পারেন। যাইহোক, SELinux এই ডিভাইসগুলিকে লেবেল করার জন্য ব্যবহার করা যেতে পারে যাতে রুট সুবিধা প্রদানকারী প্রক্রিয়াটি কেবলমাত্র সংশ্লিষ্ট নীতিতে নির্দিষ্ট করা ডিভাইসগুলিতে লিখতে পারে। এইভাবে, প্রক্রিয়াটি নির্দিষ্ট র ব্লক ডিভাইসের বাইরে ডেটা এবং সিস্টেম সেটিংস ওভাররাইট করতে পারে না।

SELinux ব্যবহার করে হুমকির আরও উদাহরণ এবং সেগুলি মোকাবেলার উপায়গুলির জন্য Use Cases দেখুন।

প্রয়োগের স্তর

SELinux বিভিন্ন মোডে প্রয়োগ করা যেতে পারে:

  • অনুমতিমূলক - SELinux নিরাপত্তা নীতি প্রয়োগ করা হয় না, শুধুমাত্র লগ করা হয়।
  • প্রয়োগ - নিরাপত্তা নীতি প্রয়োগ এবং লগ করা হয়েছে। ব্যর্থতাগুলি EPERM ত্রুটি হিসাবে প্রদর্শিত হয়।

এই পছন্দটি দ্বিমুখী এবং এটি নির্ধারণ করে যে আপনার নীতি পদক্ষেপ নেয় নাকি কেবল সম্ভাব্য ব্যর্থতা সংগ্রহ করার সুযোগ দেয়। বাস্তবায়নের সময় পারমিসিভ বিশেষভাবে কার্যকর।

প্রকার, বৈশিষ্ট্য এবং নিয়ম

অ্যান্ড্রয়েড তার নীতিমালার জন্য SELinux এর Type Enforcement (TE) উপাদানের উপর নির্ভর করে। এর অর্থ হল সমস্ত বস্তুর (যেমন, ফাইল, প্রক্রিয়া বা সকেট) সাথে একটি টাইপ যুক্ত থাকে। উদাহরণস্বরূপ, ডিফল্টরূপে, একটি অ্যাপের টাইপ untrusted_app থাকে। একটি প্রক্রিয়ার জন্য, এর টাইপটিকে এর ডোমেনও বলা হয়। এক বা একাধিক অ্যাট্রিবিউট দিয়ে একটি টাইপ টীকা করা সম্ভব। একই সময়ে একাধিক টাইপ উল্লেখ করার জন্য অ্যাট্রিবিউটগুলি কার্যকর।

অবজেক্টগুলিকে ক্লাসে ম্যাপ করা হয় (উদাহরণস্বরূপ, একটি ফাইল, একটি ডিরেক্টরি, একটি প্রতীকী লিঙ্ক, একটি সকেট) এবং প্রতিটি ক্লাসের জন্য বিভিন্ন ধরণের অ্যাক্সেস permissions দ্বারা প্রতিনিধিত্ব করা হয়। উদাহরণস্বরূপ, permission open ক্লাস file জন্য বিদ্যমান। যদিও Android 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 ফাইলগুলি দেখুন। সম্পর্কিত অনুমতি অস্বীকারের কারণে ব্যর্থতার সম্ভাবনা কমাতে যখনই সম্ভব ম্যাক্রো ব্যবহার করা উচিত।

একবার একটি টাইপ সংজ্ঞায়িত হয়ে গেলে, এটিকে সেই ফাইল বা প্রক্রিয়ার সাথে যুক্ত করতে হবে যা এটি প্রতিনিধিত্ব করে। এই সংযোগটি কীভাবে করা হয় সে সম্পর্কে আরও বিস্তারিত জানার জন্য SELinux বাস্তবায়ন দেখুন। নিয়ম সম্পর্কে আরও তথ্যের জন্য, SELinux Notebook দেখুন।

নিরাপত্তা প্রেক্ষাপট এবং বিভাগ

SELinux নীতিগুলি ডিবাগ করার সময় বা ফাইল লেবেল করার সময় ( file_contexts ব্যবহার করে অথবা ls -Z ing করার সময়), আপনি একটি নিরাপত্তা প্রেক্ষাপট (যাকে label ও বলা হয়) দেখতে পেতে পারেন। উদাহরণস্বরূপ: u:r:untrusted_app:s0:c15,c256,c513,c768 । একটি নিরাপত্তা প্রেক্ষাপটের ফর্ম্যাট থাকে: user:role:type:sensitivity[:categories] । আপনি সাধারণত একটি প্রেক্ষাপটের user , role এবং sensitivity ক্ষেত্রগুলি উপেক্ষা করতে পারেন ( স্পেসিফিকেশন দেখুন)। type ক্ষেত্রটি পূর্ববর্তী বিভাগে ব্যাখ্যা করা হয়েছে। categories SELinux-এ মাল্টি-লেভেল সিকিউরিটি (MLS) সমর্থনের অংশ। Android 12 এবং উচ্চতর সংস্করণে, বিভাগগুলি নিম্নলিখিত ক্ষেত্রে ব্যবহৃত হয়:

  • অন্য অ্যাপের অ্যাক্সেস থেকে অ্যাপ ডেটা আলাদা করুন,
  • একজন ভৌত ব্যবহারকারী থেকে অন্যজনে অ্যাপ ডেটা আলাদা করুন।

নির্দিষ্টতা

অ্যান্ড্রয়েড SELinux দ্বারা প্রদত্ত সমস্ত বৈশিষ্ট্য ব্যবহার করে না। বহিরাগত ডকুমেন্টেশন পড়ার সময়, এই বিষয়গুলি মনে রাখবেন:

  • AOSP-তে বেশিরভাগ নীতি কার্নেল পলিসি ভাষা ব্যবহার করে সংজ্ঞায়িত করা হয়। কমন ইন্টারমিডিয়েট ল্যাঙ্গুয়েজ (CIL) ব্যবহারের ক্ষেত্রে কিছু ব্যতিক্রম রয়েছে।
  • SELinux ব্যবহারকারীদের ব্যবহার করা হয় না। শুধুমাত্র u ব্যবহারকারী হিসেবে সংজ্ঞায়িত করা হয়। প্রয়োজনে, নিরাপত্তা প্রসঙ্গের বিভাগ ক্ষেত্র ব্যবহার করে প্রকৃত ব্যবহারকারীদের প্রতিনিধিত্ব করা হয়।
  • SELinux ভূমিকা এবং ভূমিকা-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ (RBAC) ব্যবহার করা হয় না। দুটি ডিফল্ট ভূমিকা সংজ্ঞায়িত এবং ব্যবহৃত হয়: বিষয়গুলির জন্য r এবং বস্তুর জন্য object_r
  • SELinux সংবেদনশীলতা ব্যবহার করা হয় না। ডিফল্ট s0 সংবেদনশীলতা সর্বদা সেট করা থাকে।
  • SELinux বুলিয়ান ব্যবহার করা হয় না। যখন কোনও ডিভাইসের জন্য নীতি তৈরি করা হয়, তখন এটি ডিভাইসের অবস্থার উপর নির্ভর করে না। এটি নীতিগুলির অডিটিং এবং ডিবাগিংকে সহজ করে তোলে।