امنیت در دیدگاه سنتی شامل محدود کردن کاربران یا فایلها با تکیه بر مجوزها و راهاندازی فایروالها برای نظارت بر ارتباطات شبکه است. آیا بهتر نیست یک سیستم سطوح دسترسی نرم افزارها و فایل ها را کنترل یا تغییر دهد بجای اینکه دستی کنترل شوند ؟ اگر در نتیجه خطای انسانی کاربری بتواند فایل های امنیتی سطح بالا را بخواند چه اتفاقی می افتد؟ اینجاست که SELinux جهت کنترل سطوح دسترسی وارد عمل می شود.
SELinux چیست ؟
SELinux کوتاه شده عبارت Security-Enhanced Linux و یک ماژول امنیتی بسیار مهم و پرکاربرد در لینوکس می باشد که به موجب آن ما توانایی پیاده سازی Policy های مختلف همچون Access Control Policy را پیدا خواهیم کرد. آژانس امنیت ملی ایالات متحده این ماژول را تحت مجوز GPL در ۲۲ دسامبر ۲۰۰۰ با هدف بهبود امنیت کلی سیستم عامل لینوکس توسعه داد. سیستم مانیتورینگ این ماژول از نوع MAC است که مخفف عبارت Mandatory Access Control است. در این ماژول، سیستم عامل به دسترسی ها نظارت می کند و در صورت به خطر افتادن امنیت، محدودیت هایی را اعمال می کند.
به طور ساده SELinux وظیفه پیاده سازی MAC ( مخفف Mandatory Access Control ) و DAC ( مخفف Discretionary Access Control ) را دارد. پیاده سازی MAC به مدیران شبکه امکان ایجاد Access Control Policy را بر روی کاربران به منظور محدود سازی دسترسی آن ها به دیوایس ها، شبکه ها، برنامه ها و Process های مختلف در سیستم را می دهد. برای مثال می خواهیم یک کاربر به تمام قسمت های سیستم دسترسی داشته باشد اما به قسمت های مهمی همچون SSH-Key ها دسترسی نداشته باشد و نتواند آنها را مشاهده کند. با استفاده از این سیستم توانایی متمایز سازی دسترسی آن کاربر به فایل های SSH-Key را پیدا می کنیم.
اصطلاح Security-Enhanced یا «امنیت تقویتشده» به چه معناست؟
گروههای غیرانتفاعی و داوطلبان و شرکتهای مختلف برای بهبود کدهای هسته لینوکس تلاش بسیار زیادی کرده اند، می کنند و خواهند کرد. برای این منظور، SELinux نیز به عنوان ماژول امنیتی مستقلی که در مقام توسعهدهنده هسته لینوکس کار میکند، در کرنل گنجانده شده است. برخی از توزیعهای لینوکس SELinux را به عنوان فیچر پیشفرض در خود قرار دادهاند. در صورت تمایل به راحتی می توانید این فیچر را غیرفعال کنید.
SELinux به مدیران سیستم ها امکان کنترل برنامههای روی سیستمهایشان را میدهد. با این فیچر و در مواقع اضطراری، تمامی فرایندهایی که بهصورت Necessary یا حیاتی برچسبگذاری شدهاند، مسدود میشوند. بدینترتیب، خطرهای مرتبط با آسیبپذیری امنیتی در برنامههای کاربر کاهش چشمگیری خواهد یافت.
توجه به این نکته نیز لازم است که اگرچه شما به نرمافزارهایتان اعتماد دارید، اما محدودکردن مجوزهای دسترسی آنها کاری منطقی و امن بهنظر میرسد. اگر فردی نرمافزارهای مورد اعتماد شما را هک کند، ممکن است به عنوان روزنه نفوذ عمل کنند و عواقب جبرانناپذیری برایتان به همراه داشته باشد. همچنین، درصورتیکه نرمافزارهایی که آلوده به بدافزارها هستند به فرایندها و دادههای سیستم شما دسترسی کامل داشته باشند، میتوانند موجب آسیب شوند. SELinux اما با محدودسازی دسترسی ها، میتواند خطرات آسیب ها را بسیار کاهش بدهد.
کنترل دسترسی ها با SELinux
مدیران بصورت پیشفرض و بدون SELinux هیچ کنترلی بر کاربران ندارند. وضعیتی را در نظر بگیرید که در آن کاربران به فایل های حساس سیستمی مانند کلیدهای SSH یا پوشه های امنیتی، دسترسی دارند. این دسترسی صد در صد مشکلات امنیتی زیادی را به وجود خواهد آورد. SELinux نیز برای کنترل همین دسترسی ها به وجود آمده است. اولین توزیع لینوکسی که به طور پیش فرض از SELinux استفاده کرد RedHat نسخه ۴ بود. لازم به ذکر است فایل کانفیگ SELinux نیز در آدرس زیر قرار دارد.
/etc/selinux/config
برای استفاده حداکثری از SELinux، باید بدانید که چگونه آن را مدیریت کنید. از آنجایی که مدیران سرور هیچ دانشی در این زمینه ندارند، ترجیح می دهند آن را غیرفعال کنند که راحت ترین گزینه است. البته در موارد نادری امکان غیرفعال کردن آن بدون ریسک وجود دارد که طبیعتاً نیاز به دانش و اشراف مدیر سرور دارد. به خصوص در سرویس های VPS لینوکس که به آنها از راه دور دسترسی دارند. آنها به راحتی آلوده می شوند، در نتیجه سرویس SELinux باید فعال باشد.
SELinux چگونه کار می کند؟
SELinux قوانین دسترسی را برای برنامه ها، فرآیندها و فایل های یک سیستم تعریف می کند. از سیاست های امنیتی استفاده میکند، که مجموعهای از قوانین هستند که به SELinux میگویند کدام برنامه ها و کاربران به چه چیزهایی میتوانند یا نمیتوانند دسترسی داشته باشند.
هنگامی که یک برنامه یا فرآیند، که به عنوان Subject نیز شناخته میشود، درخواستی برای دسترسی به یک شئ، مانند یک فایل، ارائه میکند، SELinux قوانین و سیاست ها را چک میکند که آیا این برنامه امکان دسترسی به آن شئ را دارد یا خیر. اگر SELinux نتواند بر اساس مجوزها و سیاست های ذخیره شده در مورد دسترسی یا عدم دسترسی تصمیم بگیرد، درخواست را به یک سرور امنیتی ارسال می کند. سرور امنیتی سابقه امنیتی برنامه یا فرآیند و فایل را بررسی می کند. سابقه امنیتی از پایگاه داده سیاست SELinux اعمال می شود. سپس درخواست دسترسی تایید یا رد می شود. اگر درخواست رد شود، پیام “avc: denied” در /var/log.messages ثبت خواهد بود.
وضعیت های مختلف SELinux
با استفاده از دستور sestatus میتوانید وضعیت فعلی سرویس SELinux را مشاهده کنید. SELinux دارای سه وضعیت مختلف است که به شرح زیر می باشند.
- Disable: حالتی که این ماژول بصورت کامل خاموش است و هیچگونه نظارتی بر دسترسی ها و دیگر موارد ندارد.
- Permissive: در این حالت سیاست های selinux فقط به کاربر اخطار داده می شود اما از دسترسی جلوگیری نمیکند. یعنی اگر برنامه ای برای نصب نیاز به تغییرات در کرنل داشته باشه selinux اجازه نصب می دهد اما برای آگاهی به کاربر هشداری می دهد و این مورد را در لاگ ها ذخیره می کند.
- Enforcing: در این حالت تمامی سیاست های selinux پابرجاست و در صورت بروز هر مشکلی دسترسی را محدود می کند و اجازه نصب برنامه های که نیاز به تغییر کرنل دارند را نمی دهد چون بر این باور است که شاید برنامه مخرب باشد.
در وضعیت Disabled هیچ پالیسی اجرا نمیشود و selinux کلا غیرفعال است.
در وضعیت permissive سیستم به نحوی رفتار میکند که تمام lable ها روی process ها، file ها و … قرار دارند و به هنگام دسترسی های متفاوت گزارشات عدم دسترسی ها و غیره در فایل log ذخیره میشود اما در حقیقت هیچ گونه عملیاتی متوقف نمیشود. این حالت همانند حالت disabled است با این تفاوت که گزارش تمام عدم دسترسی ها و تاییدیه دسترسی ها log میشود. این حالت برای مانیتورینگ و توسعه پالیسی های selinux بسیار مفید است.
حالت پیش فرض selinux حالت enforcing میباشد که در حقیقت در این وضعیت است که این ماژول فعال است و کل سیستم تحت نظر پالیسی های selinux کنترل میشود. در این حالت در صورت نیاز جلوی برخی عملیات ها گرفته و برخی تایید میشوند.
تغییر وضعیت SELinux
جهت تغییر وضعیت این ماژول و خاموش و یا روشن کردن آن، ابتدا کامند زیر را وارد کنید.
nano /etc/sysconfig/selinux
پس از وارد شدن به فایل مذکور در حالت ویرایش، خط زیر را پیدا کنید.
SELINUX=enforcing
مقدار این خط را بر اساس دانش و شرایط خود، می توانید به enforcing، permissive و یا disabled تغییر دهید. سپس فایل را سیو و یکبار SELinux را ریستارت کنید. لازم به ذکر است در صورت خرید سرور مجازی لینوکس از زویپ سرور، نصب و کانفیگ SELinux توسط کارشناسان زویپ سرور انجام خواهد شد.