آپاچی؛ شب ۴۵: سختسازی با SELinux، AppArmor و systemd
فهرست نوشته
مجوز فایل تنها مرز اجرای برنامه نیست. امشب کنترل اجباری سیستمعامل و محدودیت واحد سرویس را بررسی میکنیم، با آزمونهایی که خرابی ناشی از policy را آشکار کنند.
این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نامها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.
محیط: Clone سالم از WordPress/FPM و app؛ دسترسی کنسول و Snapshot. قبل از enforcement تازه، ورود، upload و proxy باید آزمون پایه داشته باشند.
SELinux در Alma/Rocky#
getenforce
sudo semanage fcontext -l
sudo getsebool httpd_can_network_connect httpd_can_network_connect_db httpd_enable_cgi
sudo ausearch -m AVC -ts recent
ls -Zd /var/www/wordpress/public /var/www/wordpress/public/wp-content/uploads
کد باید type خواندنی، upload type نوشتنی و اسکریپت CGI فقط در شاخهٔ لازم type اجراشدنی داشته باشد. boolean پراکسی دسترسی خروجی را گسترش میدهد؛ حالت لازم برای این نقش را ثبت کن. audit2allow خروجی policy را بدون تحلیل علت نصب نکن؛ مسیر و label اشتباه اغلب علت واقعیاند.
AppArmor در Debian/Ubuntu#
AppArmor دسترسی را با profile مبتنی بر مسیر محدود میکند. sudo aa-status نشان میدهد چه profileهایی واقعاً enforce میشوند؛ فعال بودن AppArmor بهتنهایی محصور بودن apache2 را اثبات نمیکند. ابزارهای apparmor-utils را در Clone نصب کن و اگر profile پشتیبانیشدهٔ Apache داری، از همان شروع کن.
برای ساخت profile آزمایشگاهی با sudo aa-genprof /usr/sbin/apache2، تمام workloadهای شناختهشده را اجرا، پیشنهادهای rule را بازبینی و فقط نیاز واقعی را مجاز کن. خواندن config/TLS، نوشتن logs/runtime و اتصال socket/network باید جدا تحلیل شوند. یادگیری ناقص، policy کامل امنیتی نیست؛ پس از enforce همان ماتریس آزمون را تکرار کن. FPM سرویس جداست و profile Apache خودکار آن را محدود نمیکند.
drop-in برای سرویس#
با sudo systemctl edit "$APACHE_SERVICE" یک drop-in بساز؛ unit بسته را مستقیم ویرایش نکن:
[Service]
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=full
فایلهای فعلی دوره بیرون از home هستند. اگر CGI نیازمند suexec یا برنامهای نیازمند privilege transition داری، اثر NoNewPrivileges را پیش از تعمیم بررسی کن. PrivateTmp فضای موقت unit را جدا میکند؛ ارتباط برنامه با فایل موقت مشترک ممکن است عوض شود.
آزمون و بازگشت: daemon-reload، بررسی unit و restart را انجام بده؛ TLS، proxy، upload و reload را دوباره آزمایش کن. برای برگشت، فقط drop-in خودت را بردار و profile اضافه را در Clone به وضعیت ثبتشدهٔ قبلی برگردان. خاموش کردن کلی SELinux/AppArmor راه بازیابی یک تنظیم کوچک نیست.
منبع: AppArmor در Ubuntu ، systemd.exec ، SELinux در RHEL 9 .