SELinux یا لینوکس با بهبودهای امنیتی (Security Enhanced Linux) یک مکانیزم کنترل دسترسی پیشرفته‌ای است که در اکثر توزیع‌های جدید لینوکس تعبیه شده است.

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

 

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

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

توجه داشته باشید که اگرچه دستورات، بسته‌ها و فایل‌های نشان داده شده در این آموزش برروی CentOS 7 آزمایش شده است؛ با این حال، این مفاهیم برای سایر توزیع‌ها نیز به همین صورت است.

در این آموزش، اکثر دستورات با حساب کاربری root اجرا شده است، مگر اینکه خلاف آن بیان شده باشد. اگر به حساب کاربری root دسترسی ندارید و از حساب دیگری با امتیازات sudo استفاده می‌کنید، باید قبل از دستورات از کلمه کلیدی sudo استفاده نمایید.

 

چرا SELinux؟

قبل از شروع، اجازه دهید چند مفهوم را شرح دهیم.

SELinux، مفهومی به نام MAC (کنترل دسترسی اجباری) را پیاده سازی می‌کند. این مفهوم، بر مبنای آنچه در حال حاضر در هر توزیع Linux وجود دارد، یعنی DAC (کنترل دسترسی اختیاری) اجرا می‌شود.

برای درک DAC، ابتدا بیایید نحوه عملکرد امنیت کلاسیک فایل لینوکس را بررسی نماییم.

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

اکنون نیازی به تنظیم کاربر jo نیست؛ چرا که در ادامه آموزش تعداد زیادی کاربر راه‌اندازی خواهیم کرد.

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

ls -l /home/jo/

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

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

 

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

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

به سناریویی فکر کنید که می‌خواهید، کاربران را از اجرای اسکریپت‌های پوسته در دایرکتوری home محدود نمایید. این مورد می‌تواند زمانی اتفاق بیفتد که شما توسعه دهندگانی داشته باشید که روی سیستم کار می‌کنند؛ درحالی‌که شما می‌خواهید، آن‌ها بتوانند فایل‌های گزارش را مشاهده کنند، اما نمی‌خواهید از دستورات su یا sudo استفاده نمایند و همچنین نمی‌خواهید هیچ اسکریپتی از دایرکتوری home آن‌ها اجرا شود.

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

 

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

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

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

 

نصب سرویس‌های Apache و 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، وب سرور 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 برروی آن بارگذاری شده باشد. همچنین سرورهای Apache و SFTP را نیز با تنظیمات پیش فرض دارید. علاوه بر این، چهار حساب کاربری معمولی علاوه بر حساب کاربری root، برای آزمایش در این سیستم آماده هستند.

 

حالت‌های SELinux

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

  • Enforcing
  • Permissive
  • Disabled

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

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

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

 

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

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

getenforce

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

Disabled

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

sestatus

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

SELinux status:        disabled

 

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

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

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 که حالت SELinux را مشخص می‌کند و همانطور که قبلاً بحث کردیم، می‌تواند سه مقدار ممکن را داشته باشد. دستورالعمل SELINUXTYPE که سیاست مورد استفاده را تعیین می‌نماید و مقدار پیش فرض آن به صورت targeted است. SELinux، در سیاست targeted به شما امکان می‌دهد، مجوزهای کنترل دسترسی را شخصی‌سازی و تنظیم کنید. مقدار ممکن دیگر، "MLS" (امنیت چند سطحی) است که یک حالت پیشرفته‌ای برای محافظت به حساب می‌آید. علاوه‌براین با سیاست MLS، شما باید یک بسته اضافی نیز نصب نمایید.

 

فعال کردن و غیرفعال کردن SELinux

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

به عنوان اولین قدم، باید فایل /etc/selinux/config را ویرایش کنید تا دستورالعمل SELINUX به حالت Permissive تغییر یابد.

vi /etc/sysconfig/selinux
...
SELINUX=permissive
...

تنظیم SELinux برروی حالت Permissive ضروری است؛ زیرا قبل از آن که از حالت enforced در SELinux استفاده نمایید، هر فایل در سیستم باید متن خود را برچسب گذاری کند. تا زمانی که همه فایل‌ها به درستی برچسب گذاری نشده باشند، فرآیندهایی که در دامنه‌های محدود اجرا می‌شوند، ممکن است از کار بیفتند؛ زیرا آن‌ها نمی‌توانند به فایل‌ها با چارچوب صحیح دسترسی داشته باشند. این می‌تواند باعث شود، روند بوت شدن خراب شده یا با خطا آغاز گردد. مفاهیم چارچوب و دامنه در ادامه شرح داده شده است.

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

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 تغییر وضعیت دهید. توجه داشته باشید که نمی‌توانید setenforce را هنگام غیرفعال کردن SELinux اجرا کنید.

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

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، سیاست آن است. منظور از سیاست، مجموعه قوانینی است که حقوق امنیتی و دسترسی را برای همه چیز در سیستم تعریف می‌نماید. منظور از همه چیز، کاربران، نقش‌ها، فرایندها و فایل‌ها است. این سیاست است که نحوه ارتباط هر یک از این نهادها را با یکدیگر مشخص می‌کند.

 

برخی اصطلاحات اساسی

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

 

کاربران

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

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

 

نقش‌ها

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

 

subject و اشیا

Subject، یک فرایند است و به طور بالقوه می‌تواند روی یک شی یا object تأثیر بگذارد.

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

 

دامنه‌ها برای Subjects

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

 

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

یک نوع (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 بصورت مدولار ارائه می‌شود که دقیقاً مانند ماژول‌های هسته بارگیری شده در زمان راه‌اندازی است. از طرف دیگر درست مانند ماژول‌های هسته می‌توان آن‌ها را به صورت پویا در زمان اجرا به حافظه اضافه و از آن حذف کرد. مجموعه سیاست‌های مورد استفاده توسط 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/target/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
...
...  

می‌توان مشاهده کرد که اولین گزینه به FTP daemon اجازه می‌دهد تا به دایرکتوری‌های اصلی کاربران دسترسی پیدا کند. این تنظیمات در حال حاضر خاموش است.

 

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

getsebool ftpd_anon_write

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

ftpd_anon_write --> off

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

setsebool ftpd_anon_write on

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

ftpd_anon_write --> on

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

 

 

 

منبع:

digitalocean