SELinux چیست؟
SELinux یا Security-Enhanced Linux، یک سیستم کنترل دسترسی است که ادمین های لینوکس به کمک آن می توانند سطح دسترسی موردنظر را برای کاربران، اپلیکیشن ها، سرویس ها، فرآیندها و فایل های سیستم تعریف کنند.
SELinux به طور پیش فرض در بعضی از توزیع های لینوکس مثل RHEL، CentOS و Fedora نصب است و آماده تنظیم و کنترل سطح دسترسی توسط شماست ولی توزیع های دیگری مثل اوبونتو و دبیان، به جای SELinux مجهز به AppArmor هستند که برای شروع پیکربندی سطح دسترسی، ابتدا باید SELinux را در آنها نصب کنید.
در صورت نیاز به یک سرور لینوکس امن و قدرتمند برای پیاده سازی پروژه های مخصوص خود می توانید به صفحه خرید سرور مجازی لینوکس مراجعه کنید و پلن ایده آل خود را سفارش دهید.
SELinux چگونه کار می کند؟
سیستم SELinux از سیاست ها یا خط مشی های امنیتی ذخیره شده در کش بردار دسترسی (AVC) برای ارائه مجوز یا رد درخواست دسترسی موردنظر استفاده می کند.
به عنوان مثال، اگر یک برنامه یا فرآیندی که به عنوان Subject شناخته می شود، درخواست دسترسی به یک Object مثل فایل را ارائه می دهد، Object Manager کش بردار دسترسی را بررسی می کند تا بر اساس مجوزهای تعریف شده در این بردار، تصمیم گیری کند.
اگر مجوز لازم برای درخواست موردنظر در این کش تعریف شده باشد که پاسخ گویی به درخواست از طریق این کش انجام می شود اما اگر حاوی تصمیم گیری درستی برای این درخواست نباشد، درخواست را به سرور امنیتی ارسال می کند تا این سرور با بررسی سیاست های امنیتی در مورد رد یا تایید درخواست تصمیم گیری کند و پاسخ آن به کش بردار دسترسی ارسال کند.
کش این پاسخ را ذخیره می کند تا در درخواست های بعدی دیگر نیازی به ارسال درخواست به سرور امنیتی نباشد.
با این اوصاف، با چنین معماری روبرو هستیم:
برچسب گذاری در SElinux
برخلاف مدل کنترل دسترسی اختیاری (DAC) [ با فرمتی مثل -rw-r–r–] که کاربران می توانند دسترسی ها را به شکل دلخواه خود تنظیم کنند، سطح دسترسی و مجوز ها در مدل کنترل دسترسی اجباری (MAC) به صورت سرسختانه تعریف می شود و قدرت و امنیت سیستم در مقابله با تهدیدات تا حد زیادی بالاتر می رود.
* SElinux برای تنظیم مجوز ها و دسترسی ها از مدل دسترسی اجباری استفاده می کند.
در مدل MAC هر فایل، دایرکتوری، فرآیند، پورت یا … که حکم منبع سیستم را دارد با یک برچسب امنیتی مشخص می شوند و شامل اطلاعاتی مثل نوع و سطح دسترسی هستند که SELinux از آن ها برای اعمال سیاست های امنیتی سرسخت تر استفاده می کند.
فرمت برچسب امنیتی SELinux به صورت زیر است:
user:role:type:level
user : شناسه یک کاربر SELinux
role: نقش اختصاص داده شده به کاربر SELinux برای دسترسی ها یا اقدامات خاص
type: نوع منبع یا object برای دسترسی توسط کاربر SELinux
Level: سطح امنیتی object موردنظر (اختیاری)
بیایید این فرمت را با یک مثال توضیح دهیم:
فرض کنید در سیستم شما یک فایل به اسم myfile.txt وجود داد که متعلق به کاربر user1 است و در مسیر home/user1/ ذخیره شده است.
برچسب این فایل می تواند به صورت زیر باشد:
user1_u:object_r:user_home_t:s0
User1_u شناسه کاربر SELinux است که با کاربر لینوکسی user1 مرتبط است.
Object_r نقش اختصاص یافته به کاربر User1_u است که به کاربر اجازه می دهد به فایل موردنظر دسترسی داشته باشد.
User_home_t نوع user_home_t که مخصوص فایل ها و دایکتوری های موجود در home است را به فایل اختصاص می دهد.
S0 هم سطح امنیتی پیش فرض object ها است که این برچسب هم همین سطح را برای این فایل لحاظ می کند.
این برچسب به معنی این است که فایل myfile.txt متعلق به کاربر user1 است و فقط کاربر user1 میتواند به آن دسترسی داشته باشد یا آن را تغییر دهد.
حالت ها یا mode های SELinux
SELinux دارای ۳ حالت مختلف است که ادمین ها به کمک آن می توانند امنیت سیستم خود را مدیریت کنند:
Enforcing mode
در این حالت، SELinux سیاست های تنظیم شده توسط sysadmin را اعمال می کند و کاربران اجازه تغییر یا لغو آن را ندارند. SELinux به صورت پیش فرض در این حالت قرار دارد و امن ترین حالت SELinux محسوب می شود.
Permissive mode
این حالت امنیت کمتری نسب به Enforcing دارد. به این صورت که مانع دسترسی های مسدودشده نمی شود ولی گزارشات مربوط به دسترسی های غیرمجاز را ثبت می کنند تا ادمین سیستم مسائل امنیتی موجود را نظارت کند.
Disabled
در این حالت، SELinux سیاست های کنترل دسترسی را اعمال نمی کند و هیچ محافظتی از منابع سیستم انجام نمی شود. حالت Disabled برای تست یا اشکال زدایی مفید است.
حالا که کمی با طرز کار و ساختار SELinux آشنا شدید، وقت آن است که کمی از مباحث تئوری فاصله بگیریم و وارد پروسه نصب و پیکربندی SELinux شویم تا کاربرد این سیستم برایتان قابل لمس تر باشد.
نصب SELinux در لینوکس
SELinux در برخی از توزیع های لینوکس به طور پیش فرض نصب و فعال است که RHEL ،CentOS و Fedora از این دسته توزیع ها هستند.
با اجرای دستور sestatus و مشاهده وضعیت SELinux می توانید از این قضیه مطمئن شوید.
اما اگر با اجرای sestatus در توزیع خود متوجه شدید که این مکانیزم کلاً در سیستم شما نصب نیست (مثل توزیع اوبونتو – دبیان) ، ابتدا باید SELinux را نصب کنید تا بتوانید وارد مراحل پیکربندی آن شوید.
نصب SELinux در اوبونتو – دبیان
- ابتدا ریپازیتوری سیستم را آپدیت و آپگرید کنید:
sudo apt update
sudo apt upgrade
- AppArmor را غیرفعال کنید:
sudo systemctl stop apparmor
sudo systemctl disable apparmor
- فولدرهای مربوط به AppArmor را حذف کنید:
sudo apt-get remove apparmor -y
- سیستم را ریستارت کنید.
sudo reboot
- پکیج های لازم برای SELinux را نصب کنید:
sudo apt install selinux-basics selinux-policy-default auditd
- SELinux را فعال کنید:
sudo selinux-activate
- در نهایت، سیستم خود را ریستارت کنید:
sudo reboot
برای اطمینان از فعال بودن SELinux در توزیع خود می توانید از دستور بررسی وضعیت SELinux استفاده کنید:
sudo sestatus
اگر SELinux به درستی پیکربندی شده باشد، با خروجی شبیه خروجی زیر مواجه خواهید شد:
اگر بعد از بررسی وضعیت SELinux در توزیع خود متوجه شدید که در این حالت disabled قرار دارد، کافیست فایل پیکربندی را باز کنید:
sudo vi /etc/selinux/config
- و SELINUX را به enforcing تغییر دهید و فایل را ذخیره کنید.
- در آخر هم سیستم را ریستارت کنید.
sudo reboot
پیکربندی SELinux در لینوکس
گزینه های کنترلی اصلی SELINUX در فایل پیکربندی etc/selinux/config/ قرار دارد که با استفاده از آن می توانید رفتار این سیستم را به شکل دلخواه تغییر دهید:
تغییر mode ماژول SELinux
اگر می خواهید حالت SELinux را به یکی از ۳ حالت enforcing ،permissive یا disabled تغییر دهید، کافیست فایل پیکربندی SELinux را با ویرایشگر دلخواه خود باز کنید:
sudo vim /etc/selinux/config
- سپس متغیر SELINUX را به حالت دلخواه خود تغییر دهید.
- فایل را ذخیره کرده و از آن خارج شوید.
- سیستم خود را ریستارت کنید.
- با اجرای دستور زیر، متغیر current mode را بررسی کنید تا از درست پیش رفتن تغییرات مطمئن شوید:
sudo sestatus
تغییر حالت SELinux به صورت موقت
اگر صرفاً می خواهید حالت session فعلی SELINUX را تغییر دهید و موقتی بودن این حالت برای شما مهم است، می توانید به جای تغییر در فایل پیکربندی که یک تغییر دائمی است از دستورات SELINUX استفاده کنید:
تغییر حالت به enforcing
sudo setenforce 1
تغییر حالت به permissive
sudo setenforce 0
برای بررسی حالت فعلی SELINUX هم می توانید از دستور زیر استفاده کنید:
getenforce
تغییر حالت SELINUX با دستور setenforce تا ریستارت مجدد سیستم معتبر است.
مشاهده لیست قوانین SELinux تنظیم شده در سیستم
sudo semanage fcontext -l
با اجرای این دستور با چنین خروجی مواجه خواهید شد:
با بررسی هر کدام از خطوط موجود در این خروجی، متوجه می شود که SELinux بر اساس چه قائده هایی کار می کند و فایل ها و دایرکتوری های موجود در مسیر فعلی خط فرمان از چه دسترسی هایی برخوردار هستند.
برای اضافه کردن قائده های جدید هم می توانید از دستور semanage fcontext استفاده کنید که برای کسب اطلاعات بیشتر در این زمینه می توانید به داکیومنتیشن SELinux مراجعه کنید.
غیرفعال سازی ماژول SELinux
- فایل پیکربندی SELinux را باز کنید:
sudo vim /etc/selinux/config
- متغیر SELinux را به disabled تغییر دهید:
- فایل را ذخیره کرده و آن را ببندید.
- سیستم را ریستارت کنید.
sudo reboot
- با استفاده از دستور زیر، حالت فعلی SELINUX را بررسی کنید:
sudo sestatus
فعال سازی مجدد SELinux
ابتدا دستور getenforce را اجرا کنید و بررسی کنید که SELINUX در حالت Permissive یا Disabled قرار دارد یا نه.
اگر در یکی از این دو حالت قرار داشت، دو راه برای فعال سازی مجدد آن دارید:
۱) با دستور زیر آن را در حالت enforcing قرار دهید تا SELINUX فعال شود (موقت).
sudo setenforce 1
۲) فایل پیکربندی SELINUX را ویرایش کنید (دائمی).
- فایل پیکربندی را باز کنید:
sudo vim /etc/selinux/config
- متغیر SELINUX را در حالت enforcing قرار دهید.
- فایل را ذخیره کرده و آن را ببندید.
- سیستم را ریستارت کنید.
sudo reboot
- با دستور زیر، وضعیت SELINUX را بررسی کنید:
sudo sestatus
مزایا و معایب SELinux در لینوکس
مزایا | معایب |
جلوگیری از دسترسی های غیرمجاز | مبهم بودن پیام های خطا و دشوار بودن عیب یابی آنها |
جلوگیری از سواستفاده از حقوق کاربران | نیاز به تخصص کافی برای نوشتن قوائد درست |
حفاظت از سیستم در برابر انواع حملات هکری | پیچیدگی پیکربندی |
امکان تعریف سیاست های امنیتی توسط ادمین ها | امکان تاثیر منفی روی عملکرد سیستم عامل |
افزایش سطح امنیت سیستم لینوکس | عدم سازگاری با برخی از برنامه ها و نرم افزارها |
اگر بعد از یک مدت استفاده از این ماژول متوجه شدید که اصلاً نیازی به آن ندارید یا پیچیدگی پیکربندی و تنظیمات آن برای شما دردسر ساز شده است، نگران نباشید! می توانید آن را به صورت موقت (دستور setenforce) یا دائمی (ویرایش فایل پیکربندی) غیرفعال کنید و بدون SELinux به راه خود ادامه دهید.
سخن آخر
ماژول SELinux برای کنترل سرسخت تر دسترسی های کاربران، فایل ها و … به کار می رود و نقش مهمی در ارتقا امنیت سیستم لینوکس دارد که البته، برای استفاده درست و به جا از این مکانیزم، بهتر است اطلاعات و دانش خود را در این زمینه افزایش دهید و سپس وارد عمل شوید چون نحوه تنظیم قوائد SELinux کمی پیچیده است.