آپاچی؛ شب ۳۶: pool مستقل و حساب کماختیار برای WordPress
فهرست نوشته
اگر همهٔ سایتها با یک کاربر 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 کن.