در ابتدا باید اشاره کرد که SELinux کوتاه شده عبار Security Enhance Linux است و درواقع فرآیندی است که امنیت سیستم را بهبود می بخشد. این ارتقاء در امنیت به این صورت فراهم می گردد که selinux یک لایه اضافی در سیستم به منظور افزایش امنیت آن، قرار می دهد. در selinux این مفهوم بررسی می شود که آیا فاعل اجازه انجام فعل مشخصی را بر روی مفعول دارد یا خیر، مثلاً آیا dbUser اجازه edit در table را دارد یا خیر.
شاید عبارت DAC را شنیده باشید و یا با آن برخورد داشته اید، این اصلاح که به Discretionary Access Control اشاره دارد، تعریف کننده سطوح دسترسی بر روی فولدر ها، فایل ها و غیره است. همین اعطاء سطح دسترسی است که ادمین را قادر می سازد تا permission را برای user تعریف کند تا دسترسی او را روی فایل ها و دایرکتوری ها کنترل نماید.
در کنار DAC ما MAC را نیز داریم یعنی Mandatory Access Control، این مورد سطح امنیتی است که کنترل آن به طور مستقیم از سمت هسته سیستم ( kernel ) صورت می گیرد. ماژول موجود در کرنل به نام Linux Security Module این امکان را دارد تا یک لایه امنیتی بیشتر نیز به فرآیند ها و برنامه های فعال در سیستم اضافه کند، در همین ماژول است که مکانیزم SELinux نیز قرار دارد.
البته SELinux تنها مکانیزم موجود نیست اما به نوعی مطمئن ترین، سخت گیر ترین و پیشرفته ترین مکانیزم موجود است. اما به هرحال از مکانیزم های دیگری مثل Tomoyo نیز می توان نام برد. کارکرد Tomoyo پروفایل محور است یعنی درصورتی که نام پروفایل تغییر کند، ماژول تومویو متوجه آن نمی شود و بدین صورت سیستم در معرض خطر قرار خواهد گرفت، اما چنین نواقصی در Selinux وجود ندارد. مجوز به فایل پیوست می شود و در صورت جابجایی یا حتی تغییر نام نیز دیگر این CONTEXT تغییر نمی کند، در این شرایط است که رد کردن Permission و پالیسی اعمال شده بسیار سخت خواهد بود.
Context در Selinux
برچسب سلینوکس Selinux label یا همان کانکست مؤلفه ای است که توجه آن بر روی پالیسی و ویژگی های امنیتی یک فرآیند است. در حقیقت کانتکست ها مجوز های امنیتی هستند که یک شیوه دائمی برای دسترسی به هدف ها را در selinux فراهم میکند.
پالیسی های selinux این کانتکست ها را در یک سری قوانین استفاده میکنند که چگونگی تعامل پروسس ها با یکدیگر و با منابع گوناگون سیستم را تعریف میکند. پالیسی پیش فرض به این صورت است که هیچ گونه دسترسی و تعاملی وجود ندارد مگر آنکه یک role دسترسی تعریف شده باشد.
توجه داشته باشید زمانیکه یک process اجرا میشود در حقیقت یکسری فراخوانی سیستم به سمت kernel فرستاده میشود و یک سری بررسی خطاها در کرنل صورت میگیرد. اگر error ی وجود داشته باشد خطا برگردانده میشود، در غیر اینصورت مفهوم DAC بررسی میشود اگر DAC تأیید را صادر کند حال نوبت به بررسی LSM یعنی همان SELinux میرسد. دقت کنید در صورتیکه DAC خطای Access Denied بدهد دیگر selinux بررسی نمیشود، در نتیجه همیشه بررسی رول های DAC بر پالیسی های selinux اولویت دارد.
کانتکست های موجود شامل: یوزر، نقش، نوع، سطح دسترسی هستند اینها مهم ترین مواردی هستند که در پالیسی های selinux مورد استفاده قرار میگیرند. یک یوزر (User) ، یک رول (Role) به خودش اختصاص میدهد که با توجه به آن رول باید یک نوع (Type) کارهای خاصی را انجام دهد. مثلاً Parsdata یوزری است که role آن در حقیقت مدیریت پورتال است و type کارهایی که انجام میدهد مدیریت کاربران، برقراری امنیت سایت و سرور، به روز رسانی اپلیکیشن ها و غیره میباشد. در کانتکست یوزر را تعریف کرده تا یک نقش به آن اختصاص داده شود و با استفاده از آن نقش، یکسری Type کارهای خاصی را به آن اختصاص دهیم.
در context عبارتی که با _u تمام شود در حقیقت مشخص کننده User میباشد، عبارتی که با _r تمام شود مشخص کننده Role میباشد همچنین عبارتی که با _t تمام شود مشخص کننده Type میباشد. مثلاً type name مربوط به وب سرور httpd_t میباشد همچنین نام type مربوط به فایل ها و دایرکتوری های موجود در /var/www/html/ در حقیقت httpd_sys_content_t میباشد. نام type مربوط به فایل ها و دایرکتوری هایی که در پوشه /tmp/ هستند tmp_t میباشد. همچنین نام type در کانتکست مربوط به پورت های وب سرور http_port_t میباشد.
SELinux در 3 حالت یا مود اجرا می شود:
• disabled
• permissive
• enforcing
حالت Disabled که در حقیقت در این شرایط هیچ پالیسی اجرا نمیشود و selinux عملاً غیرفعال است.
حالت دیگر انتخاب permissive است که در این حالت سیستم به گونه ای عمل میکند که تمام برچسب ها روی فرآیند ها، فایل ها و غیره قرار دارند و در زمان دسترسی های متفاوت عدم دسترسی ها و غیره در فایل لاگ سیستم ذخیره میشود در این حالت هیچ عملیاتی حتی در صورت داشتن خطا متوقف نخواهد شد. و اما مد آخر یعنی Enforcing مشابه مد disabled است با این تفاوت که تمام عدم دسترسی ها و تأییدیه دسترسی ها log میشود. این مد برای مانیتورینگ و توسعه پالیسی های selinux بسیار مفید است.
در Selinux مد پایه همین حالت Enforcing است که تمام درخواست ها و تأییدیه ها بررسی می شود و سخت گیری کامل اجرا می شود. با ابزار setenforce میتوانیم بین این حالات سوییچ کنیم. تغییراتی که با استفاده از این دستور اعمال میکنیم با reboot سیستم از بین میرود. برای اینکه به مد enforcing برویم با یوزر root دستور setenforce 1 را اجرا میکنیم. برای تغییر به مد permissive دستور setenforce 0 را وارد میکنیم. برای اینکه بدانیم در چه حالتی از لینوکس هستیم دستور getenforce را اجرا میکنیم.