selinux چیست؟ (بخش اول)
SELinux یا Security Enhance Linux
در حقیقت مکانیزمی است که یک لایه اضافی برای امنیت سیستم ایجاد میکند.
به طور کلی selinux به این سوال که : آیا subject میتواند action را روی object ی انجام دهد، پاسخ میدهد.
به طور مثال : آیا یک وب سرور به دایرکتوری های Home کاربران دسترسی دارد؟
اصطلاح DAC که از این به بعد بیشتر آنرا به کار میبریم همان Discretionary Access Control میباشد و در حقیقت به سطوح دسترسی user, group و permission ها است که روی فایل ها، فولدرها و … تعریف میکنیم، که باعث میشود admin سیستم پالیسی های امنیتی جامعی را روی فایل ها و دایرکتوری ها لحاظ کند.
اصطلاح MAC یا Mandatory Access Control در حقیقت سطوح امنیتی هستند که مستقیما توسط kernel کنترل میشوند.
در کرنل ماژولی به نام LSM (مخفف Linux Security Module) داریم که میتواند علاوه بر DAC یک لایه امنیتی بیشتر به process ها و اپلیکیشن های سیستم اضافه کند.
در این ماژول میتوانیم از مکانیزم های متفاوتی استفاده کنیم یکی از این ها SELinux است.
غیر از SELinux مکانیزم های متفاوت دیگری مانند Tomoyo وجود دارند
اما بین تمام اینها selinux از همه سخت تر، مطمئن تر و پیشرفته تر است.
ماژول های دیگر مانند تومویو به صورت profile کار میکنند و احتمال خطر تا حدی وجود دارد زیرا مثلا با عوض شدن نام فایل میتوان profile را دور زد اما در selinux اینطور نیست.
از آنجایی که selinux در خود مفهومی به نامCONTEXT دارد. context در حقیقت مجوزیست که به یک فایل assign میشود و با تغییر نام فایل و یا حتی جابجا کردن آن کانتکست فایل هیچ تغییری نمیکند و عملا دور زدن پالیسی و permission فایل بسیار سخت تر میشود.
CONTEXT در SELinux چیست
یک کانتکست selinux که گاها از آن با عنوان برچسب selinux (یا SELinux Lable) یاد میشود در حقیقت مشخصه ایست که روی ویژگی های امنیتی و پالیسی یک عنصر (process ها، file ها …) تمرکز میکند.
در حقیقت کانتکست ها مجوز های امنیتی هستند که یک شیوه دائمی برای دسترسی به هدف ها را در selinux فراهم میکند.
پالیسی های selinux این کانتکست ها را در یک سری قوانین استفاده میکند که چگونگی تعامل پروسس ها با یکدیگر و با ریسورس های گوناگون سیستم را تعریف میکند.
پالیسی پیش فرض به این صورت است که هیچ گونه دسترسی و تعاملی وجود ندارد مگر اینکه یک role دسترسی تعریف شده باشد.
نکته : زمانیکه یک process اجرا میشود در حقیقت یکسری system call به سمت kernel فرستاده میشود (در حقیقت سیستم کرنل را صدا میزند) و یک سری error check ها در کرنل صورت میگیرد.اگر error ی وجود داشته باشد خطا برگردانده میشود، در غیر اینصورت مفهوم DAC بررسی میشود اگر DAC اوکی بدهد این بار نوبت بررسی LSM یعنی همان SELinux مان میباشد.
دقت کنید در صورتیکه DAC خطای Access Denied بدهد دیگر selinux بررسی نمیشود، در نتیجه همیشه بررسی رول های DAC بر پالیسی های selinux اولویت دارد.
کانتکست شامل فیلدهای زیر میباشد :
- Role
- Type
- Level
- User
اطلاعات بالا در حقیقت مهم ترین نکاتی هستند که در پالیسی های selinux مورد استفاده قرار میگیرند. یک یوزر (User) یک رول (Role) به خودش اختصاص میدهد که با توجه به آن رول باید یک تیپ (Type) کارهای خاصی را انجام بدهد.
مثلا mohammad یوزری است که role آن در حقیقت مدیریت یک انجمن است و type کارهایی که انجام میدهد مدیریت کاربران، برقراری امنیت سایت و سرور، به روز رسانی اپلیکیشن ها و … میباشد. در کانتکست User را برای این تعریف میکنیم که یک Role به آن اختصاص بدهیم و با استفاده از آن Role یکسری 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 میباشد.
به طور مثال یک پالیسی وجود دارد که به آپاچی (که type آن در کانتکست httpd_t میباشد) اجازه دسترسی به فایل ها و دایرکتوری های موجود در /var/www/html/ (که type آنها در کانتکست httpd_sys_content_t) را میدهد.
هیچ گونه پالیسی برای فایل های موجود در /tmp/ و /var/tmp/ وجود ندارد در نتیجه وب سرور امکان دسترسی به فایل های موجود در این پوشه ها را نخواهد داشت.
در تصویر بالا، MariaDB (که type آن در کانتکست mysqld_t میباشد) اجازه دسترسی به فایل ها و دایرکتوری های موجود در /data/mysl (که type آنها در کانتکست mysqld_db_t میباشد) را میدهد.
همچنین آپاچی (که type آن در کانتکست httpd_t میباشد) اجازه دسترسی به فایل ها و دایرکتوری های موجود در /var/www/html/ (که type آنها در کانتکست httpd_sys_content_t) را دارد
اما هیچ گونه پالیسی برای دسترسی آپاچی به فایل های موجود در data/mysl وجود ندارد همچنین سرویس mariadb امکان دسترسی به فایل های موجود در /var/www/html را نیز ندارد.
Mode های SELinux
SELinux را در 3 مد (mode) میتوان اجرا کرد :
- disabled
- permissive
- enforcing
مد Disabled که در حقیقت در این mode هیچ پالیسی اجرا نمیشود و selinux کلا غیرفعال است.
مد permissive در این مد سیستم به نحوی رفتار میکند که تمام lable ها روی process ها، file ها و … قرار دارند و به هنگام دسترسی های متفاوت عدم دسترسی ها و غیره در log فایل ذخیره میشود اما در حقیقت هیچ گونه عملیاتی متوقف نمیشود.همانند حالت disabled است با این تفاوت که تمام عدم دسترسی ها و تاییدیه دسترسی ها log میشود. این مد برای مانیتورینگ و توسعه پالسی های selinux ی بسیار مفید است.
مد پیش فرض selinux مد enforcing میباشد که در حقیقت در این مد است که selinux فعال است و کل سیستم تحت نظر پالسی های selinux کنترل میشود.
با ابزار setenforce میتوانیم بین این mode ها جابجا شویم.
تغییراتی که با استفاده از این دستور اعمال میکنیم با reboot سیستم از بین میرود. برای اینکه به مد enforcing برویم با یوزر rootدستور setenforce 1 را اجرا میکنیم.
برای تغییر به مد permissive دستور setenforce 0 را وارد میکنیم. برای اینکه بدانیم در چه مدی از لینوکس هستیم دستور getenforce را اجرا میکنیم.
~]# getenforce
Enforcing
~]# setenforce 0
~]# getenforce
Permissive
~]# setenforce 1
~]# getenforce
Enforcing
برای دسترسی به مقاله ی selinux چیست؟ (بخش دوم) می توانید به این لینک مراجعه کنید