خطای 403 می‌تواند از policy Apache، مجوز لینوکس یا SELinux بیاید. امشب این سه علت را جدا می‌کنیم تا رفع مشکل به باز کردن بی‌حساب دسترسی تبدیل نشود.

این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نام‌ها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.

محیط: سایت ثابت شب پنجم؛ در RHEL، SELinux در حالت Enforcing باقی می‌ماند.

وب‌سرور چه دسترسی‌ای لازم دارد؟#

namei -l /var/www/apache-lab/public/index.html
sudo -u "$APACHE_USER" test -r /var/www/apache-lab/public/index.html
sudo "$APACHE_CTL" -t

فرمان دوم در موفقیت چیزی چاپ نمی‌کند؛ کد خروج را با echo $? ببین. خواندن فایل به مجوز خواندن خود فایل و عبور از همهٔ پوشه‌های والد نیاز دارد. برای محتوای ثابت، مالک root با پوشهٔ 755 و فایل 644 در این lab کافی است؛ فرایند Apache نباید حق تغییر کد داشته باشد.

در Alma/Rocky:

ls -Zd /var/www/apache-lab/public
ls -Z /var/www/apache-lab/public/index.html
sudo restorecon -Rv /var/www/apache-lab
sudo ausearch -m AVC -ts recent

restorecon برچسب را به مقدار policy برمی‌گرداند. مسیر زیر /var/www معمولاً policy مناسب دارد. اگر عمداً DocumentRoot را به /srv/apache-lab/public منتقل کردی، نگاشت پایدار بساز:

sudo semanage fcontext -a -t httpd_sys_content_t '/srv/apache-lab/public(/.*)?'
sudo restorecon -Rv /srv/apache-lab/public

اگر نگاشت قبلاً وجود دارد، با semanage fcontext -l بررسی و آگاهانه ویرایش کن. chcon تغییر موقت است و جای نگاشت پایدار را نمی‌گیرد.

آزمایش محدود#

روی فایل آزمایشگاهی، مجوز خواندن را موقتاً بردار و درخواست بفرست؛ باید خطا و شاهد مرتبط در error log داشته باشی. مجوز را به 644 برگردان و دوباره پاسخ موفق را ببین. این کار را روی صفحهٔ کاری انجام نده.

تمرین: چرا دادن مالکیت کل سایت به www-data خطای مجوز را ظاهراً حل می‌کند ولی خطر تغییر کد را زیاد می‌کند؟ برای پوشهٔ upload بعداً حق نوشتن محدود می‌دهیم؛ کد برنامه همچنان با حساب انتشار مدیریت می‌شود.

منبع: SELinux و Apache در RHEL ، نکات امنیتی Apache .