مجوز فایل درست است، Apache هم اجرا می‌شود، اما درخواست رد می‌شود. این بار یک نگهبان دیگر تصمیم می‌گیرد: SELinux. امشب مدل label و type enforcement را می‌فهمیم و یک پوشهٔ وب را با برچسب پایدار معرفی می‌کنیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: VM mac با Rocky Linux 9؛ SELinux در enforcing؛ httpd و policycoreutils-python-utils؛ sudo.

جایگاه در دوره: هدف‌های 333.2 آزمون 303-300.

نگهبانی مستقل از مالک#

MAC یعنی کنترل دسترسی اجباری؛ policy مرکزی اجازهٔ فرآیندها را محدود می‌کند، حتی اگر DAC اجازه داده باشد. در SELinux، context معمولاً بخش‌های user، role، type و level دارد. برای سرویس‌ها، type فایل و domain فرآیند محور مهم تصمیم‌اند. httpd_t با httpd_sys_content_t یک چیز نیست: یکی domain فرآیند و دیگری type محتوای وب است.

getenforce
sestatus
id -Z
ps -eZ
ls -Zd /var/www/html

Enforcing تصمیم را اعمال می‌کند؛ permissive رویداد منع را ثبت می‌کند ولی معمولاً آن منع SELinux را اعمال نمی‌کند. disabled یعنی سازوکار فعال نیست. setenforce 0 را درمان خطای سرویس نکن؛ با آن ممکن است فقط شاهد علت را از رفتار قابل مشاهده جدا کنی.

محتوا در مسیر تازه#

از Snapshot قبل از درس شروع کن. پوشهٔ اختصاصی بساز و محتوای آزمایشگاهی بده:

sudo install -d -m 755 /srv/lpic303-web
printf 'LPIC303 library\n' | sudo tee /srv/lpic303-web/index.html >/dev/null
sudo chmod 644 /srv/lpic303-web/index.html
ls -Z /srv/lpic303-web/index.html

در /etc/httpd/conf.d/lpic303.conf:

<VirtualHost *:80>
    ServerName library.example.test
    DocumentRoot /srv/lpic303-web
    <Directory /srv/lpic303-web>
        Require all granted
    </Directory>
</VirtualHost>

بعد از httpd -t، httpd را start یا reload کن. از داخل خود mac درخواست بده؛ در این مرحله فایروال شبکه را وارد مسئله نکن:

curl -H 'Host: library.example.test' http://127.0.0.1/
sudo ausearch -m AVC -ts recent

اگر label عمومی مانع خواندن است، AVC را ثبت کن؛ شکل رفتار ابتدایی به context واقعی بستگی دارد. حالا rule پایدار:

sudo semanage fcontext -a -t httpd_sys_content_t '/srv/lpic303-web(/.*)?'
sudo restorecon -Rv /srv/lpic303-web
ls -Z /srv/lpic303-web/index.html
curl -H 'Host: library.example.test' http://127.0.0.1/

اکنون باید محتوای وب خوانده شود. semanage fcontext rule مسیر را نگه می‌دارد؛ restorecon برچسب‌ها را مطابق policy اعمال می‌کند. chcon تغییر موردی است و می‌تواند با relabel بعدی از بین برود.

تمرین پایان#

فایل تازه‌ای در پوشه بساز و label آن را بررسی کن؛ وراثت و قاعدهٔ مسیر را با هم ببین. برای برگشت، VirtualHost آزمایشگاهی و rule مربوط به همین مسیر را کنار بگذار؛ policy عمومی سیستم را حذف نکن. پرسش: چرا chmod 777 AVC را لزوماً رفع نمی‌کند؟ چون تصمیم MAC جدا از بیت‌های DAC است.

مرجع: Using SELinux در RHEL 9 .