دانشنامهسیستم عامللینوکس

آموزش SELinux

SELinux چیست؟

Security-Enhanced Linux یا SELinux یک معماری امنیتی برای سیستم های لینوکسی است که به مدیران شبکه این امکان را می دهد که کنترل بیشتری بر روی اینکه چه کسی می تواند دسترسی به سیستم و اجزای آن داشته باشد را می دهد. این معماری توسط سازمان امنیت ملی آمریکا توسعه پیدا کرد که در آن زمان بصورت patch بر روی لینوکس قرار می گرفت. در ادامه و در سال ۲۰۰۰ این محصول در سطح اپن سورس منتشر گردید و در سال ۲۰۰۳ در کرنل بیشتر نسخه های لینوکس قرار گرفت. 

برای بسیاری از لینوکس کاران، این معماری بسیار ناشناخته و گُنگ است، تا جایی که ترجیح می دهند از ابتدا آن را غیرفعال نمایند. در اکثر آموزش های نصب سرویس های مختلف نیز می بینیم که برای خلاص شدن از پیکربندی این سرویس، آموزش غیرفعال کردن آنرا در ابتدای آموزش می گذارند. اما باید بدانید که استفاده از این معماری می تواند تا حد زیادی ریسک های امنیتی سیستم عامل را بخصوص در مقابل بدافزارها و باج افزارها، کاهش دهد. 

پیش از شروع به آموزش selinux باید با دو مفهوم DAC و MAC آشنا شوید. طبق مفهوم DAC یا Discretionary Access Control که پیش فرض لینوکس نیز است، owner یک resource، کنترل کاملی بر روی آن دارد بصورتی که می تواند به سایرین دسترسی های مختلف بدهد و یا حتی مالک آن را تغییر دهد. این resource می تواند یک فایل باشد یا یک دایرکتوری و یا هر چیزی که می توان از طریق شبکه به آن دسترسی داشت. بطور کلی DAC یک روش کنترل دسترسی بسیار راحت و انعطاف پذیر است ولی در عین حال خیلی ایمن نیست. اما در مقابل مفهوم MAC یا Mandatory Access Control را داریم. در این روش دسترسی ها توسط سیستم تعیین می شوند و نه توسط owner. در این روش تمامی user ها و resource ها دارای یک label هستند که سطح اعتماد را تعیین می کند. برای دسترسی به یک resource، کاربر باید در سطحی مساوی و یا بالاتر از سطح آن resource باشد. عموما سیستم هایی که دارای دیتای بسیار مهمی هستند مانند سیستم های دولتی و نظامی، از روش MAC استفاده می کنند. SELinux روشی برای تنظیم دقیق الزامات کنترل چنین دسترسی هایی محسوب می شود. 

همچنین برای کسانی که با محیط دستوری راحت نیستند نیز یک رابط گرافیکی برای مدیریت SELinux نیز طراحی شده است.

انواع حالت های SELinux

سه حالت در SELinux وجود دارد: Enforcing – Permissive – Disabled

در حالت enforcing تمامی سیاست های تعیین شده بصورت الزام آور در لینوکس اعمال می گردد و دسترسی های غیرمجاز deny شده و log می گردند.

در حالت permissive هیچ سیاستی الزام نمی شود ولی تمامی دسترسی های غیرمجاز log می شوند. این حالت روشی بسیار عالی برای آزمایش سیاست ها قبل از اعمال آنها و رفتن به حالت enforcing است. زیرا اگر مستقیم به سراغ enforcing برویم ممکن است بعضی از پردازش ها به دلایلی در اصطلاح mislabeled شده و در نتیجه سیستم بوت نشود. بعد از فعال کردن حالت permissive باید سیستم را ریبوت نمایید تا تمامی فایل ها label های خود را دریافت کنند. تمامی گزارش های SELinux را می توان با استفاده از دستور زیر مشاهده کرد:

#cat /var/log/messages | grep “SELinux”

حالت disabled نیز همانطور که از نام آن بر می آید، SELinux را غیرفعال می کند.

با استفاده از دستورهای زیر می توانیم حالت کنونی در لینوکس را مشاهده نماییم:

#getenforce

#sestatus

نصب SELinux

پکیج های اصلی SELinux که می بایست نصب شوند در زیر لیست شده اند. ممکن است بعضی از آنها از قبل در سیستم عامل نصب شده باشند.

policycoreutils | policycoreutils-python | selinux-policy | selinux-policy-targeted | libselinux-utils | setroubleshoot-server | setools | setools-console | mcstrans

فعال کردن SELinux

برای پیکربندی آن از دستور زیر استفاده کرده و وارد فایل config می شویم:

#vim /etc/selinux/config

در اینجا می توانیم هر سه حالتی را که در بالا توضیح دادیم در قسمت SELINUX وارد نماییم. همچنین در قسمت SELINUXTYPE نیز باید نوع سیاست خود را تعیین نماییم. این سیاست می تواند در حالت targeted باشد که امکان سفارشی سازی و تنظیم دقیق مجوزهای کنترل دسترسی را ارائه می کند و یا در حالت MLS یا Multilevel security باشد که حالت بسیار پیشرفته ای برای حفاظت محسوب می شود و برای استفاده از آن پکیج های دیگری را نیز باید نصب کرد.

همانطور که گفته شد بهتر است ابتدا سیستم را در حالت permissive گذاشته تا یکبار همه موارد لیبل خورده و سپس به حالت enforcing برویم. همچنین برای اینکه سیستم را مجبور کنیم که مجدد کل فایل سیستم را relabel کند می توانیم یک فایل خالی با نام autorelabel. در root directory ایجاد نماییم.

نحوه عملکرد

SELinux بشکل یک سیستم labeling کار می کند که بدین معنی است که تمام فایل ها، پروسه ها و پورت ها در سیستم، یک label مربوط به خود را دارد که کرنل مدیریت آنرا در مرحله بوت به عهده دارد. Labeling یک روش منطقی برای گروه کردن اشیا با یکدیگر می باشد.

برای فهم صحیح SELinux ابتدا نیاز است که مفاهیم ابتدایی آنرا متوجه شوید:

Users:

SELinux دارای چندین نام کاربری از قبل ساخته شده (pre-built users) است که هر نام کاربری عادی در لینوکس می تواند به یک یا چند تا از آنها mapped شود.

Roles

Role به مانند یک gateway است که در بین user و process قرار گرفته و تعیین می کند که کدام کاربر به چه پردازشی می تواند دسترسی داشته باشد.

Subjects and Objects

در اینجا Subject برای Process ها بکار می رود و منظور از Object می تواند هر چیزی باشد که می توان بر روی آن کار کرد مثل فایل، دایرکتوری، پورت، سوکت و یا هر چیز دیگر. 

Domains

چارچوبی است که پروسه ها یا همان subject ها می توانند درون آن اجرا شوند. در واقع این domain است که به subject می گوید چکاری می تواند بکند و چکاری نمی تواند برای مثال تعیین می کند که چه فایل هایی برای یک subject قابل دسترس است.

Types

چارچوبی است که مشخص می کند نوع فایل چیست مثلا مشخص می کند که یک فایل web page است یا اینکه فایل متعلق به دایرکتور etc/ است.

 

خب حالا با توجه به تمامی مفاهیم بالا SELinux Policy چگونه کار می کند؟

SELinux Policy دسترسی user را به role، دسترسی role را به domain، و دسترسی domain را به type مشخص می کند.

یعنی ابتدا user برای ورود به یک role مجوز می گیرد، سپس role باید مجوز دسترسی به domain را پیدا کند و در نهایت domain محدود شده است به دسترسی به type های خاص.

عکس 218

حالا بر می گردیم به نوع پیاده سازی SELinux که اگر به یاد داشته باشید بصورت پیش فرض targeted است. این یعنی SELinux بطور پیش فرض تنها محدود به پردازش های خاصی در سیستم است و پردازش هایی که هدف گیری نشده اند در دامنه نامحدود (unconfined domains) فعالیت می کنند.

در مقابل روش بالا، روش deny by default است که در آن هر پردازشی deny می شود مگر اینکه approved شده باشد. این نوع از پیاده سازی بسیار ایمن ولی راه اندازی آن بسیار مشکل است.

رفتار SELinux

باید این قانون را در نظر داشته باشید که SELinux به هیچ وجه جایگزین روش امنیتی DAC نیست یعنی آنرا ignore نمی کند. اگر DAC دسترسی یک کاربر به یک فایل را محدود کرده باشد دیگر قوانین SELinux ارزیابی نمی شوند زیرا پیش از آن و در خط دفاعی اول دسترسی بلاک شده است.

زمانی که SELinux شروع به کار می کند، تمامی قوانین در حافظه RAM بارگذاری می شوند. این policy ها بصورت ماژولار هستند و بسیار شبیه ماژول های کرنل هستند که در زمان بوت شدن load می شوند و به مانند آنها نیز می توان اقدام به حذف و یا افزودن این سیاست ها در حافظه کرد. با استفاده از دستور زیر می توان لیست SELinux Policy Modules را که در حال حاضر در حافظه load شده اند را دید:

#semodule -l

از دستور semodule می تواند برای نصب، حذف، بارگذاری مجدد، ارتقا، فعال سازی و غیرفعال سازی ماژول ها نیز استفاده کرد. همچنین با استفاده از دستور زیر می توانید لیست فایل های ماژوهای مختلف را ببینید. از نام فایل ها که با پسوند pp. است می توانید متوجه شوید که هر کدام به یک برنامه خاص مربوط است:

#ls -l /etc/selinux/targeted/modules/active/modules/

طرز کار ماژول سازی SELinux چنین است که وقتی سیستم بوت می‌شود، ماژول سیاست در آنچه که به نام سیاست فعال (active policy) می‌نامیم ترکیب می‌شود. سپس این سیاست در حافظه بارگذاری می‌شود. نسخه باینری ترکیب شده از سیاست بارگذاری شده را می‌توانید در مسیر زیر مشاهده کنید:

#ls -l /etc/selinux/targeted/policy/

با این که نمی‌توان فایل‌های ماژول سیاست را خواند، اما روش آسانی برای تغییر دادن تنظیمات آن وجود دارد. این کار از طریق مقادیر بولی SELinux صورت می‌پذیرد. برای مشاهده طرز کار آن باید دستور زیر را اجرا کنید:

#semanage boolean -l

برای تغییر دادن هر یک از تنظیمات می‌توان از دستور setsebool استفاده کرد. به عنوان مثال فرض کنید، وضعیت دسترسی نوشتن FTP ناشناس را بررسی کنیم:

#getsebool ftpd_anon_write

این دستور نشان می‌دهد که سوئیچ در حال حاضر خاموش یا روشن است. حال اگر برای مثال بخواهیم آن را روشن کنیم:

#setsebool ftpd_anon_write on

مقادیر تغییر یافته دائمی نیستند و پس از ریبوت این تغییرات به حالت پیشین خود باز می‌گردند. برای این که تغییرات دائمی شوند، باید از سوئیچ P- در دستور setsebool استفاده کنید.

نمایش بیشتر

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا