اگر همهٔ سایت‌ها با یک کاربر PHP اجرا شوند، compromise یک سایت می‌تواند دادهٔ سایت دیگر را هم در دسترس بگذارد. امشب حساب runtime WordPress و socket مستقل آن را آماده می‌کنیم.

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

محیط: FPM سالم شب سی‌وچهارم یا سی‌وپنجم؛ هنوز WordPress منتشر نشده است. نام حساب این lab برابر wordpress است.

هویت اجرا با مالک کد فرق دارد#

sudo useradd --system --home-dir /var/lib/wordpress --shell /usr/sbin/nologin wordpress
sudo install -d -m 755 /var/www/wordpress/public
sudo install -d -o wordpress -g wordpress -m 750 /var/lib/wordpress

کد را حساب انتشار یا root می‌نویسد؛ runtime فقط پوشه‌های لازم مانند upload را می‌نویسد. فایل راز مثل wp-config.php بعداً با مالک root:wordpress و حالت 640 قرار می‌گیرد. secret سایت‌های دیگر نیز نباید برای این حساب خواندنی باشد.

یک pool جدید کنار lab بساز. نمونهٔ Debian/Ubuntu در pool.d/wordpress.conf:

[wordpress]
user = wordpress
group = wordpress
listen = /run/php/wordpress.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 4
pm.process_idle_timeout = 10s
pm.max_requests = 300
clear_env = yes
security.limit_extensions = .php
php_admin_value[cgi.fix_pathinfo] = 0
php_admin_flag[display_errors] = off
php_admin_flag[log_errors] = on

در Alma/Rocky فایل زیر /etc/php-fpm.d/، socket زیر /run/php-fpm/ و owner/group سوکت apache است. user/group کارگر همچنان wordpress می‌ماند. ACL ناسازگار را از pool کپی‌شده بردار.

اثبات هویت#

بعد از FPM configtest و restart، socket را بررسی کن. چون pm=ondemand است، تا اولین درخواست کارگری برای pool دیده نمی‌شود. یک میزبان آزمایشی با همان کد check.php و handler socket WordPress بساز؛ سپس با ps -eo user,pid,args کارگر pool را پیدا کن. انتظار داریم user آن wordpress باشد، نه کاربر Apache.

در RHEL برچسب کد را با restorecon اصلاح کن؛ فقط مسیر نوشتنی upload بعداً httpd_sys_rw_content_t می‌گیرد. راز و کد نباید همین برچسب نوشتنی را بگیرند.

تمرین و بازگشت: یک فایل ساختگی با مالک سایت دیگر و حالت 640 بساز و sudo -u wordpress test -r FILE را، پس از جایگزینی مسیر، آزمایش کن؛ باید رد شود. pool مستقل مرز کامل container نیست و بعضی منابع FPM/OPcache مشترک‌اند. برای برگشت، میزبان آزمایشی را ببند و pool اضافه را حذف و restart کن.

منبع: پارامترهای pool و socket در PHP ، مجوزهای WordPress .