آموزش SELinux در CentOS 7 – بخش اول: مفاهیم پایه

آخرین به‌روزرسانی: ۲۷ آبان ۱۳۹۷
زمان مطالعه: ۱۶ دقیقه

SELinux یا «لینوکس با بهبودهای امنیتی» (Security Enhanced Linux) سازوکار کنترل دسترسی پیشرفته‌ای است که در اغلب توزیع‌های مدرن لینوکس تعبیه شده است. این ساز و کار در ابتدا از سوی سازمان امنیت ملی ایالات‌متحده برای حفاظت از سیستم‌های رایانه‌ای در برابر نفوذ بدافزارها و دستکاری داده‌ها طراحی شد. در طی زمان، SELinux در سطح عمومی نیز منتشر شده است و توزیع‌های مختلف لینوکس آن را در کد خود استفاده می‌کنند.

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

دقت کنید که دستورها، بسته‌ها و فایل‌های نمایش یافته در این راهنما روی توزیع CentOS 7 تست شده‌اند. این مفاهیم روی توزیع‌های دیگر نیز به همین ترتیب هستند. در این راهنما دستورها را با حساب کاربری root اجرا می‌کنیم؛ مگر این که خلاف آن ذکر شده باشد. اگر به حساب کاربری root روی سیستم خود دسترسی ندارید و از حساب دیگری با دسترسی‌های sudo استفاده می‌کنید، باید در ابتدای دستورها از کلیدواژه sudo استفاده کنید.

چرا باید از SELinux استفاده کنیم؟

پیش از آغاز توضیحات، ابتدا می‌بایست چند مفهوم را درک کنیم. SELinux مفهومی به نام MAC یعنی «کنترل دسترسی اجباری» (Mandatory Access Control) را پیاده‌سازی کرده است. این مفهوم بر مبنای آن چه از قبل در هر توزیع لینوکس دیگر وجود دارد، یعنی DAC، «کنترل دسترسی اختیاری» (Mandatory Access Control) پیاده‌سازی شده است. برای درک DAC ابتدا باید با شیوه عملکرد امنیت فایل در لینوکس آشنا باشیم.

در مدل کلاسیک امنیت ما سه نهاد داریم: کاربر (User)، گروه (Group) و دیگران (Other) که به ترتیب با حروف u، g و o نمایش می‌یابند. این سه نهاد می‌توانند ترکیبی از مجوزهای خواندن، نوشتن و اجرا (به ترتیب با حروف اختصاری r، w و x) را روی یک فایل یا دایرکتوری داشته باشند. اگر کاربر به نام jo فایلی را در دایرکتوری home ایجاد کند، دسترسی خواندن/نوشتن را به آن فایل دارد و از این رو جزو گروه jo است. نهاد «Other» احتمالاً به این فایل دسترسی نخواهد داشت. در قطعه کد زیر می‌توانیم محتوای فرضی دایرکتوری home را برای کاربر jo ببینیم. لازم نیست این کاربر را ایجاد کنید، چون ما تعداد زیادی از کاربران را در ادامه این راهنما ایجاد خواهیم کرد.

دستوری را مانند زیر اجرا کنید:

ls -l /home/jo/

دستور فوق خروجی مانند زیر خواهد داشت:

total 4
-rwxrw-r--. 1 jo jo 41 Aug 6 22:45 myscript.sh

اینک jo می‌تواند این دسترسی را تغییر دهید. jo می‌تواند دسترسی به این فایل را به کاربران و گروه‌های دیگر اعطا کرده (یا محدود سازد) و یا مالک فایل را تغییر دهد. این اقدامات می‌توانند باعث شوند که فایل در معرض دستکاری حساب‌هایی قرار گیرد که نباید به آن دسترسی داشته باشند. Jo می‌تواند دسترسی فایل را محدود سازد تا امنیت بیشتری ایجاد شود؛ اما این کار اختیاری است. هیچ روشی برای مدیر سیستم وجود ندارد که این رویه را برای همه فایل‌های روی سیستم الزامی کند.

مثال دیگری را در نظر بگیرید: وقتی یک پردازش لینوکس اجرا می‌شود، ممکن است به صورت کاربر root یا حساب دیگری با دسترسی‌های superuser اجرا شود. این بدان معنی است که اگر یک هکر کلاه‌سیاه (بدکار) کنترل اپلیکیشن را به دست گیرد، می‌تواند از این اپلیکیشن برای دسترسی به همه منابعی که حساب کاربری دسترسی دارد استفاده کند. از آنجا که پردازش‌ها با دسترسی حساب root فعالیت می‌کنند، یعنی می‌توان به همه چیز روی سیستم لینوکس دسترسی داشت.

مثلاً حالتی را تصور کنید که می‌خواهید کاربران را از اجرای شل اسکریپت در دایرکتوری home باز دارید. این وضعیت در مواردی که توسعه‌دهندگان روی یک سیستم production مشغول کار هستند، پیش می‌آید. شما ممکن است بخواهید آن‌ها بتوانند فایل‌های log را ببینند؛ اما نمی‌خواهید از دستورهای su یا sudo استفاده کنند و همچنین نمی‌بایست هیچ اسکریپتی را از دایرکتوری‌های home خود اجرا کنند. این کار به چه روشی میسر است؟

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

راه‌اندازی یک سیستم تست

برای این که مفاهیم مطرح شده را بهتر درک کنیم، باید یک سرور تست بسازیم که هم به عنوان یک وب‌سرور و هم سرور SFTP عمل می‌کند. کار خود را با نصب CentOS 7 به صورت بسته کمینه (minimal package) آغاز می‌کنیم و سپس آپاچی و vsftp را روی سرور نصب می‌کنیم. با این وجود، هیچ یک از این اپلیکیشن‌ها را پیکربندی نمی‌کنیم.

همچنین چند حساب کاربری تست در سرور کلود خود ایجاد می‌کنیم. از این حساب‌ها در موقعیت‌های مختلف در سراسر این راهنما استفاده خواهیم کرد. در نهایت بسته‌های مرتبط با SELinux را نصب خواهیم کرد. این امر جهت تضمین این نکته است که می‌توانیم با جدیدترین دستورهای SELinux کار کنیم.

نصب سرویس‌های آپاچی و SFTP

ابتدا به صورت کاربر root وارد سرور می‌شویم و دستور زیر را برای نصب Apache اجرا می‌کنیم:

yum install httpd

خروجی دستور فوق نشان می‌دهد که این بسته دانلود شده و اجازه نصب از شما می‌خواهد:

Loaded plugins: fastestmirror, langpacks
...
...
================================================================================
 Package       Arch           Version                     Repository       Size
================================================================================
Installing:
 httpd         x86_64         2.4.6-18.el7.centos         updates         2.7 M

Transaction Summary
================================================================================
Install  1 Package

Total download size: 2.7 M
Installed size: 9.3 M
Is this ok [y/d/N]:

با زدن دکمه y می‌توانیم daemon را برای Apache نصب کنیم:

Downloading packages:
httpd-2.4.6-18.el7.centos.x86_64.rpm                       | 2.7 MB   00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : httpd-2.4.6-18.el7.centos.x86_64                             1/1
  Verifying  : httpd-2.4.6-18.el7.centos.x86_64                             1/1

Installed:
  httpd.x86_64 0:2.4.6-18.el7.centos

Complete!

Daemon را به صورت دستی آغاز می‌کنیم:

service httpd start

با اجرای دستور service httpd status می‌بینیم که سرویس در حال اجرا است:

Redirecting to /bin/systemctl status  httpd.service
httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
   Active: active (running) since Tue 2014-08-19 13:39:48 EST; 1min 40s ago
 Main PID: 339 (httpd)
...
...

سپس اقدام به نصب vsftp می‌کنیم:

yum install vsftpd

خروجی دستور فوق چیزی شبیه زیر است:

Loaded plugins: fastestmirror, langpacks
...
...
==============================================================================================================
 Package                  Arch                     Version                       Repository              Size
==============================================================================================================
Installing:
 vsftpd                   x86_64                   3.0.2-9.el7                   base                   165 k

Transaction Summary
==============================================================================================================
Install  1 Package

Total download size: 165 k
Installed size: 343 k
Is this ok [y/d/N]:

با زدن دکمه y بسته نصب می‌شود.

سپس از دستور service vsftpd start برای آغاز daemon مربوط به vsftpd استفاده می‌کنیم. خروجی دستور فوق چیزی شبیه زیر خواهد بود:

Redirecting to /bin/systemctl status  vsftpd.service
vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled)
   Active: active (running) since Tue 2014-08-19 13:48:57 EST; 4s ago
  Process: 599 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
 Main PID: 600 (vsftpd)
...
...

نصب بسته‌های SELinux

چند بسته از سوی SELinux مورد استفاده قرار می‌گیرند. برخی از آن‌ها به طور پیش‌فرض نصب می‌شوند. در ادامه فهرستی از توزیع‌های مبتنی بر Red Hat را می‌بینید:

  • policycoreutils: ابزارهایی برای مدیریت SELinux ارائه می‌کند.
  • policycoreutils-python: ابزارهایی برای مدیریت SELinux ارائه می‌کند.
  • selinux-policy: سیاست ارجاع SELinux را ارائه می‌کند.
  • selinux-policy-targeted: سیاست هدف‌گیری SELinux را ارائه می‌کند.
  • libselinux-utils: ابزارهایی برای مدیریت SELinux ارائه می‌کند.
  • setroubleshoot-server: ابزارهایی برای توصیف پیام‌های گزارش حسابرسی ارائه می‌کند.
  • setools: ابزارهایی برای نظارت بر گزارش حسابرسی، کوئری زدن به سیاست‌ها و مدیریت چارچوب فایل ارائه می‌کند.
  • setools-console: ابزارهایی برای نظارت بر گزارش حسابرسی، کوئری زدن به سیاست‌ها و مدیریت چارچوب فایل ارائه می‌کند.
  • mcstrans: ابزارهای برای ترجمه سطوح مختلف قالب از آسان به دشوار ارائه می‌کند.

برخی از این موارد از قبل روی سیستم نصب شده‌اند. برای بررسی این که کدام بسته‌های SELinux روی سیستم CentOS 7 نصب هستند، می‌توانید چند دستور مانند دستور زیر اجرا کنید. پس از عبارت grep باید کلمات جستجوی مختلفی را با حساب کاربری root وارد کنید:

rpm -qa | grep selinux

خروجی دستور فوق چیزی شبیه زیر است:

libselinux-utils-2.2.2-6.el7.x86_64
libselinux-2.2.2-6.el7.x86_64
selinux-policy-targeted-3.12.1-153.el7.noarch
selinux-policy-3.12.1-153.el7.noarch
libselinux-python-2.2.2-6.el7.x86_64

اینک می‌توانیم اقدام به نصب بسته‌ها با دستور زیر بکنیم. دقت کنید که yum بسته‌هایی که از قبل داشته باشید را به‌روزرسانی می‌کند. برای این که چنین کاری صورت نگیرد، می‌توانید صرفاً بسته‌هایی که روی سیستم خود ندارید را نصب کنید:

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

اکنون سیستمی داریم که همه بسته‌های SELinux روی آن بارگذاری شده است. همچنین سرورهای Aapche و SFTP را نیز با پیکربندی‌های پیش‌فرض در حال اجرا داریم. ضمناً چهار حساب کاربری معمولی برای تست کردن علاوه بر حساب کاربری root ایجاد کرده‌ایم.

حالت‌های SELinux

اینک نوبت کار با SELinux رسیده است و از این رو کار خود را با بررسی حالت‌های SELinux آغاز می‌کنیم. در هر زمان SELinux می‌تواند در یکی از حالت‌های ممکن زیر باشد:

  • Enforcing
  • Permissive
  • Disabled

SELinux در حالت Enforcing، سیاست‌های خود را روی سیستم لینوکس الزام می‌کند تا مطمئن شود که همه تلاش‌های دسترسی غیرمجاز از سوی کاربران و پردازش‌ها انکار می‌شود. انکار دسترسی در فایل‌های گزارش مربوطه نیز نوشته می‌شود. در ادامه به بررسی بیشتر سیاست‌های SELinux و گزارش‌های حسابرسی خواهیم پرداخت.

حالت Permissive را می‌توان نوعی حالت نیمه فعال دانست. در این حالت، SELinux سیاست‌های خود را الزام نمی‌کند و بنابراین هیچ نوع دسترسی انکار نمی‌شود. با این وجود، هر گونه تخطی از سیاست‌ها در گزارش‌های حسابرسی ثبت خواهد شد. این روشی عالی برای تست SELinux پیش از بردن آن به حالت الزامی است. حالت disabled از نامش مشخص است که باعث می‌شود، سیستم از وضعیت امنیتِ بهبود یافته خارج شود.

بررسی حالت‌ها و وضعیت‌های SELinux

می‌توان با اجرای دستور getenforce به بررسی حالت کنونی SELinux پرداخت:

Getenforce

SELinux در حال حاضر باید غیر فعال باشد و از این رو خروجی مانند زیر خواهد بود:

Disabled

همچنین می‌توان دستور sestatus را اجرا کرد:

Sestatus

زمانی که SELinux غیر فعال باشد، خروجی به صورت زیر خواهد بود:

SELinux status: disabled

فایل پیکربندی SELinux

فایل پیکربندی اصلی برای SELinux در مسیر /etc/selinux/config قرار دارد. می‌توان دستور زیر را برای نمایش محتوای آن اجرا کرد:

cat /etc/selinux/config

خروجی دستور فوق به صورت زیر خواهد بود:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

در این فایل دو دایرکتیو وجود دارند. دایرکتیو SELinux که حالت آن را مشخص می‌کند و سه مقدار ممکن دارد که قبلاً بررسی کردیم.

دایرکتیو SELINUXTYPE سیاستی که استفاده خواهد شد را تعیین می‌کند. مقدار پیش‌فرض به صورت targeted است. SELinux در سیاست targeted، امکان سفارشی‌سازی و تنظیم دقیق مجوزهای کنترل دسترسی را ارائه می‌کند. مقدار ممکن دیگر «MLS» یا همان «امنیت چند سطحی» (multilevel security) است که حالت پیشرفته‌ای برای حفاظت محسوب می‌شود. ضمناً در نوع MLS باید بسته‌های دیگری را نیز نصب کرد.

فعال‌سازی و غیر فعال‌سازی SELinux

فعال‌سازی SELinux نسبتاً ساده است؛ اما غیر فعال‌سازی آن چنین نیست و باید در فرایندی دومرحله‌ای صورت بگیرد. ما فرض می‌کنیم که SELinux در حال حاضر غیر فعال است و شما همه بسته‌های آن را در مراحل قبل نصب کرده‌اید.

در گام نخست باید فایل etc/selinux/config/ را ویرایش کنیم تا دایرکتیو SELinux به حالت Permissive برود.

vi /etc/sysconfig/selinux

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

...
SELINUX=permissive
...

تنظیم SELinux در حالت Permissive در ابتدا امری ضروری است، زیرا پیش از آن که از حالت enforced در SELinux استفاده کنیم، هر فایل در سیستم باید برچسب زمینه‌ای خاص خود را داشته باشد. در صورتی که همه فایل‌ها دارای برچسب مناسب نباشند، ممکن است پردازش‌هایی که در دامنه‌های محدودشده اجرا می‌شوند، از کار بیفتند، زیرا نمی‌توانند به فایل‌ها در چارچوب (context) صحیح دسترسی یابند. این مسئله می‌تواند منجر به مشکلات boot شود و سیستم نتواند آغاز به کار بکند یا با خطاهایی همراه باشد. دو مفهوم چارچوب (context) و دامنه را در ادامه توضیح خواهیم داد.

اینک دستور ریبوت را اجرا می‌کنیم:

Reboot

در فرایند ریبوت همه فایل‌های موجود در سرور با چارچوب SELinux برچسب‌گذاری می‌شوند. از آنجا که سیستم در حالت permissive است، SELinux خطاها و انکار دسترسی‌ها را گزارش می‌کند؛ اما آن‌ها را متوقف نمی‌سازد.

بار دیگر به عنوان کاربر root وارد سیستم شوید. سپس در محتوای فایل var/log/messages/ به دنبال رشته «SELinux is preventing» بگردید.

cat /var/log/messages | grep "SELinux is preventing"

اگر خطایی گزارش نشده باشد، می‌توانیم با امنیت به مرحله بعد برویم. با این وجود، جستجو در فایل /var/log/messages به دنبال عبارت «SELinux» نیز ایده خوبی محسوب می‌شود. ما در سیستم خود دستور زیر را اجرا کردیم:

cat /var/log/messages | grep "SELinux"

این دستور پیام‌های خطای مرتبط با دسکتاپ GNOME را نشان می‌دهد که در حال اجرا است. این امر زمانی رخ می‌دهد که SELinux یا در حالت غیر فعال و یا permissive باشد:

Aug 20 11:31:14 localhost kernel: SELinux:  Initializing.
Aug 20 11:31:16 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:31:21 localhost journal: Unable to lookup SELinux process context: Invalid argument
Aug 20 11:33:20 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.

Aug 20 11:37:15 localhost kernel: SELinux:  Initializing.
Aug 20 11:37:17 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:37:23 localhost journal: Unable to lookup SELinux process context: Invalid argument
Aug 20 11:37:44 localhost gnome-session: SELinux Troubleshooter: Applet requires SELinux be enabled to run.

Aug 20 11:39:42 localhost kernel: SELinux:  Initializing.
Aug 20 11:39:44 localhost kernel: SELinux:  Disabled at runtime.
Aug 20 11:39:50 localhost journal: Unable to lookup SELinux process context: Invalid argument

این نوع خطاها ایرادی ندارند.

در مرحله دوم، باید فایل پیکربندی را ویرایش کنیم تا دایرکتیو SELINUX را در فایل /etc/sysconfig/selinux از حالت permissive به enforcing تغییر دهیم:

...
SELINUX=enforcing
...

سپس سرور را بار دیگر ریبوت می‌کنیم:

Reboot

زمانی که سرور دوباره روشن شد، می‌توانیم با اجرای دستور sestatus وضعیت SELinux را بررسی کنیم. اینک باید جزییات در مورد سرور مشاهده کنیم:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          error (Success)
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

فایل var/log/messages/ را بررسی کنید:

cat /var/log/messages | grep "SELinux"

باید خطایی وجود نداشته باشد. خروجی چیزی شبیه زیر خواهد بود:

Aug 20 11:42:06 localhost kernel: SELinux: Initializing.

Aug 20 11:42:09 localhost systemd[1]: Successfully loaded SELinux policy in 183.302ms.

Aug 20 11:44:25 localhost kernel: SELinux: Initializing.

Aug 20 11:44:28 localhost systemd[1]: Successfully loaded SELinux policy in 169.039ms.

بررسی حالت‌ها و وضعیت‌های SELinux (بار دیگر)

می‌توانید دستور getenforce را برای بررسی حالت کنونی SELinux اجرا کنید:

Getenforce

اگر سیستم در حالت enforcing باشد، خروجی به صورت زیر خواهد بود:

Enforcing

در صورتی که SELinux غیر فعال شده باشد، با خروجی زیر مواجه خواهید شد:

Disabled

می‌توانیم با اجرای دستور sestatus تصویر بهتری از سیستم داشته باشیم:

Sestatus

اگر SELinux غیر فعال نشده باشد، خروجی وضعیت‌های کنونی، حالت کنونی، حالت تعریف شده در فایل پیکربندی و نوع سیاست را نشان می‌دهد:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

وقتی SELinux غیر فعال باشد، خروجی به صورت زیر است:

SELinux status: disabled

همچنین می‌توان با استفاده از دستور setenforce به طور موقت بین حالت‌های enforcing و permissive سوئیچ کرد (دقت کنید که وقتی SELinux غیر فعال باشد، نمی‌توانیم دستور setenforce را اجرا کنیم.

ابتدا حالت SELinux را در سیستم CentOS 7 از حالت enforcing به permissive تغییر می‌دهیم:

setenforce permissive

با اجرای دستور sestatus مشخص می‌شود که حالت کنونی از حالت تعریف شده در فایل پیکربندی متفاوت است:

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

با دستور زیر به حالت enforcing بازگردید:

setenforce enforcing

سیاست SELinux

مهم‌ترین بخش موتور امنیت SELinux، سیاست (policy) آن است. منظور از سیاست چنان که از نامش مشخص است، مجموعه‌ای از قواعد است که امنیت و دسترسی‌ها به همه چیز را روی سیستم تعیین می‌کنند. زمانی که می‌گوییم «همه چیز»، منظور ما کاربران، نقش‌ها، پردازش‌ها و فایل‌ها است. این سیاست است که شیوه ارتباط هر یک از این نهادها با همدیگر را تعیین می‌کند.

برخی اصطلاحات پایه

برای درک سیاست باید برخی اصطلاحات پایه را یاد بگیریم. در ادامه وارد جزییات خواهیم شد؛ اما در این بخش مقدمه کوتاهی ارائه می‌کنیم. سیاست SELinux دسترسی کاربر به نقش‌ها، دسترسی نقش به دامنه‌ها و دسترسی دامنه‌ها به نوع‌ها را تعیین می‌کند.

کاربران (Users)

SELinux مجموعه‌ای از کاربران پیش‌ساخته دارد. هر کاربر معمولی لینوکس به یکی از کاربران SELinux نگاشت می‌شود.

در لینوکس این کاربر است که یک پردازش را اجرا می‌کند. این وضعیت می‌تواند به این صورت باشد که کاربری به نام jo یک سند را در ویرایشگر vi باز کند یا یک حسابِ سرویس اقدام به اجرای daemon مربوط به httpd بکند. در دنیای SELinux هر پردازش (یک daemon یا برنامه اجرایی) به نام «فاعل» (subject) نامیده می‌شود.

نقش‌ها (Roles)

نقش مانند دروازه‌ای است که بین کاربر و پردازش قرار می‌گیرد. نقش تعریف می‌کند که کدام کاربران می‌توانند به یک پردازش دسترسی داشته باشند. نقش‌ها مانند گروه‌ها نیستند؛ بلکه شبیه فیلتر هستند. یعنی یک کاربر می‌تواند در هر زمان یک نقش را بر عهده بگیرد و یا نقشی به وی اعطا شود. تعریف نقش در سیاست SELinux مشخص می‌کند که کدام کاربران به آن نقش دسترسی داشته باشند. همچنین مشخص می‌سازد که کدام دامنه‌های پردازش به خود نقش دسترسی دارند. نقش‌ها به این دلیل تعریف شده‌اند که SELinux مفهومی به نام «کنترل دسترسی مبتنی بر نقش» (Role Based Access Control) یا RBAC را پیاده‌سازی کند.

فاعل‌ها و اشیا

یک فاعل (subject) پردازشی است که می‌تواند به طور بالقوه روی یک شیء یا مفعول (object) تأثیر بگذارد.

منظور از شیء در SELinux هر چیزی است که می‌توان روی آن کاری انجام داد. این چیز می‌تواند یک فایل، دایرکتوری، یک پورت یا سوکت tcp، کرسر، یا شاید یک سرور X باشد. این اقدام‌ها که فاعل می‌تواند روی یک شیء انجام دهد، مجوزهای فاعل (permissions) نام دارند.

دامنه‌ها برای فاعل‌ها

دامنه (domain) چارچوبی است که یک فاعل SELinux درون آن می‌تواند اجرا شود. این چارچوب (context) مانند یک پوششی پیرامون فاعل را احاطه کرده است. این چارچوب است که تعیین می‌کند هر پردازش چه کار می‌تواند انجام بدهد یا ندهد. برای نمونه، دامنه تعریف می‌کند که چه فایل‌ها، دایرکتوری‌ها، لینک‌ها، دستگاه‌ها یا پورت‌هایی در دسترس فاعل هستند.

انواع مختلف برای اشیا

یک نوع (type) چارچوبی برای زمینه فایل است که مقصود فایل را تعیین می‌کند. برای مثال، چارچوب یک فایل می‌تواند تعیین کند که یک صفحه وب است یا این که به دایرکتوری /etc تعلق دارد و یا این که مالک فایل یک کاربر SELinux خاص است. چارچوب فایل، به زبان SELinux، نوعِ آن خوانده می‌شود.

سیاست SELinux چیست؟

سیاست SELinux دسترسی کاربر به نقش‌ها، دسترسی نقش‌ها به دامنه‌ها و دسترسی دامنه‌ها به نوع‌ها را تعیین می‌کند. ابتدا کاربر برای ورود به یک نقش، مجوز می‌یابد و سپس نقش باید اجازه دسترسی به دامنه‌ای را پیدا کند. دامنه به نوبه خود محدود شده است تا تنها به نوع‌های خاصی از فایل‌ها دسترسی داشته باشد.

خود سیاست شاخه‌ای از قواعدی است که تعیین می‌کند کدام کاربران می‌توانند کدام نقش‌ها را انتخاب کنند و این نقش‌ها مجوز دسترسی به کدام دامنه‌ها را دارند. این دامنه به نوبه خود می‌تواند به نوع‌های خاصی دسترسی داشته باشد. در تصویر زیر این مفهوم نمایش یافته است:

نکته‌ای که در خصوص اصطلاحات مطرح شده باید اشاره بکنیم این است که یک پردازش که در دامنه خاصی اجرا می‌شود، می‌تواند تنها عملیات خاصی را روی انواع خاصی از شیءها انجام دهد که این وضعیت Type Enforcement یا به اختصار TE نامیده می‌شود.

اگر به موضوع سیاست‌ها بازگردیم، پیاده‌سازی سیاست SELinux نیز به طور پیش‌فرض به صورت targeted است. اگر به خاطر داشته باشید در فایل پیکربندی SELinux که قبلاً دیدیم، دایرکتیو SELINUXTYPE باید به صورت targeted تعیین شده باشد. معنی این حرف آن است که SELinux به طور پیش‌فرض تنها محدود به پردازش‌های خاصی در سیستم است (یعنی تنها پردازش‌هایی که هدف‌گیری شده‌اند). پردازش‌هایی که هدف‌گیری نشده‌اند، در دامنه‌های نامحدود فعالیت می‌کنند.

جایگزین حالت فوق مدل «انکار به طور پیش‌فرض» است که در آن هر پردازشی انکار می‌شود؛ مگر این که از سوی سیاست خاصی تأیید شده باشد. چنین حالتی بسیار امن خواهد بود؛ اما همزمان به این معنی است که توسعه‌دهنده‌ها باید همه مجوزهایی احتمالی که هر پردازشی ممکن است زمانی روی هر شیء احتمالی ممکن است نیاز داشته باشد را از قبل پیش‌بینی کرده باشند. رفتار پیش‌فرض SELinux تنها به پردازش‌های خاصی مربوط است.

رفتار سیاست SELinux

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

زمانی که یک سیستم با SELinux فعال آغاز به کار می‌کند، این سیاست در حافظه بارگذاری می‌شود. سیاست SELinux در قالب ماژولار است و بسیار شبیه ماژول‌های کرنل است که در زمان بوت شدن بارگذاری می‌شوند. از طرفی نیز همانند ماژول‌های کرنل می‌توانند به صورت دینامیک در زمان اجرا به حافظه اضافه یا حذف شوند. انباره سیاست (policy store) که از سوی SELinux استفاده می‌شود، ماژول‌هایی که بارگذاری شده‌اند را ردگیری می‌کند. دستور sestatus نام انبار سیاست را نشان می‌دهد. دستور semodule –l ماژول‌های سیاست SELinux را که در حال حاضر در حافظه بارگذاری شده‌اند نشان می‌دهد.

برای درک عملی، دستور semodule را اجرا می‌کنیم:

semodule -l | less

خروجی چیزی شبیه زیر خواهد بود:

abrt    1.2.0
accountsd       1.0.6
acct    1.5.1
afs     1.8.2
aiccu   1.0.2
aide    1.6.1
ajaxterm        1.0.0
alsa    1.11.4
amanda  1.14.2
amtu    1.2.3
anaconda        1.6.1
antivirus       1.0.0
apache  2.4.0
...
...

دستور semodule می‌تواند در تعدادی از وظایف دیگر مانند نصب، حذف، بارگذاری مجدد، ارتقا، فعال‌سازی و غیر فعال‌سازی ماژول‌های سیاست SELinux مورد استفاده قرار گیرد.

احتمالاً اکنون علاقه‌مند هستید که بدانید فایل‌های ماژول در کجا قرار می‌گیرند. اغلب توزیع‌های مدرن شامل نسخه‌های باینری ماژول‌ها به عنوان بخشی از بسته‌های SELinux هستند. فایل سیاست دارای پسوند.pp است. در CentOS 7 می‌توانیم دستور زیر را اجرا کنیم:

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

فهرستی که در خروجی نمایش می‌یابد تعدادی از فایل‌های با پسوند.pp را نشان می‌دهد. اگر به دقت نگاه کنید متوجه می‌شوید که به اپلیکیشن‌های مختلف تعلق دارند:

...
-rw-r--r--. 1 root root 10692 Aug 20 11:41 anaconda.pp
-rw-r--r--. 1 root root 11680 Aug 20 11:41 antivirus.pp
-rw-r--r--. 1 root root 24190 Aug 20 11:41 apache.pp
-rw-r--r--. 1 root root 11043 Aug 20 11:41 apcupsd.pp
...

با این وجود، فایل‌های pp. از سوی انسان قابل خواندن نیستند.

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

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

بدین ترتیب سیاست فعال دیده می‌شود:

total 3428

-rw-r--r--. 1 root root 3510001 Aug 20 11:41 policy.29

تغییر تنظیمات بولی SELinux

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

برای مشاهده طرز کار آن باید دستور semanage boolean –l را اجرا کنید:

semanage boolean -l | less

این دستور سوئیچ‌های مختلفی که می‌توان روش یا خاموش کرد را نشان می‌دهد و همچنین کار هر یک و وضعیت کنونی‌شان نمایش می‌یابد:

ftp_home_dir                   (off  ,  off)  Allow ftp to home dir
smartmon_3ware                 (off  ,  off)  Allow smartmon to 3ware
mpd_enable_homedirs            (off  ,  off)  Allow mpd to enable homedirs
xdm_sysadm_login               (off  ,  off)  Allow xdm to sysadm login
xen_use_nfs                    (off  ,  off)  Allow xen to use nfs
mozilla_read_content           (off  ,  off)  Allow mozilla to read content
ssh_chroot_rw_homedirs         (off  ,  off)  Allow ssh to chroot rw homedirs
mount_anyfile                  (on   ,   on)  Allow mount to anyfile
...
...

می‌توان دید که گزینه نخست به daemon FTP امکان می‌دهد که به دایرکتوری‌های home کاربر دسترسی داشته باشند. این تنظیمات در زمان کنونی خاموش هستند.

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

getsebool ftpd_anon_write

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

ftpd_anon_write --> off

سپس مقدار بولی را تغییر می‌دهیم تا فعال شود:

setsebool ftpd_anon_write on

اگر یک بار دیگر این مقدار را بررسی کنیم، تغییر را مشاهده می‌کنیم:

ftpd_anon_write --> on

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

نتیجه‌گیری

در این بخش از راهنمای SELinux تلاش کردیم تا برخی مفاهیم پایه آن را توضیح دهیم. دیدیم که SELinux می‌تواند باعث امنیت سیستم شود. در ادامه با روش فعال‌سازی آن و حالت‌های اجرایی‌اش آشنا شدیم. همچنین موضوع سیاست‌های SELinux را نیز بررسی کردیم.

اگر این مطلب برایتان مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۵ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
digitalocean

نظر شما چیست؟

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