لینوکس ۳۰۳؛ شب ۱۹: SELinux؛ صاحب فایل بودن همهٔ ماجرا نیست
فهرست نوشته
مجوز فایل درست است، 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 .