پرش به محتوا

کار با SELinux به‌جای خاموش کردن آن

سه ابزار اصلی SELinux را بشناسید (برچسب فایل، boolean و برچسب پورت)، علت خطای Permission denied را پیدا کنید و درست رفعش کنید.

Rocky Linux 10سطح: متوسطبرای: Rocky Linux 10، AlmaLinux 10، CentOS Stream 10، Rocky Linux 9، AlmaLinux 9به‌روزرسانی: ۱۶ آبان ۱۴۰۵

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

۱. وضعیت

bash
getenforce
sestatus

۲. برچسب فایل‌ها

bash
ls -Z /var/www/html

اگر محتوای سایت را در مسیر غیرپیش‌فرض گذاشته‌اید، برچسب درست را به آن مسیر بدهید:

bash
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
sudo restorecon -Rv /data/www
chcon برچسب را موقتاً عوض می‌کند و با restorecon بعدی از بین می‌رود. همیشه semanage fcontext را ترجیح دهید.

۳. booleanها

برای رفتارهای رایج، کلیدهای آماده وجود دارد:

bash
getsebool -a | grep httpd
sudo setsebool -P httpd_can_network_connect on      # وب‌سرور به برنامه یا پایگاه داده وصل شود
sudo setsebool -P httpd_can_sendmail on             # وب‌سرور ایمیل بفرستد

-P تغییر را دائمی می‌کند.

۴. برچسب پورت

اگر سرویسی را روی پورت غیراستاندارد اجرا می‌کنید، مثلاً SSH روی 2222:

bash
sudo semanage port -l | grep ssh
sudo semanage port -a -t ssh_port_t -p tcp 2222

۵. پیدا کردن علت خطا

bash
sudo ausearch -m AVC -ts recent
sudo dnf install -y setroubleshoot-server
sudo sealert -a /var/log/audit/audit.log | less

sealert معمولاً دقیقاً می‌گوید کدام دستور مشکل را رفع می‌کند.

۶. حالت Permissive فقط برای یک سرویس

برای عیب‌یابی، به‌جای خاموش کردن کل SELinux، فقط دامنه‌ی یک سرویس را موقتاً Permissive کنید:

bash
sudo semanage permissive -a httpd_t
# ... عیب‌یابی ...
sudo semanage permissive -d httpd_t