Site icon IT Blog

Настройка open_basedir

Настоятельно рекомендую настраивать параметр open_basedir, в котором перечисляются директории за пределы которых нельзя будет выйти php скриптам, так как по умолчанию open_basedir не указан.
Если на веб сервере не указан open_basedir, то при наличии уязвимостей Path Traversal например, можно получить доступ ко всем файлам на сервере на которые есть права чтения «read by others», то есть к директории /etc/, /var/ и другим.

Посмотрим указан ли open_basedir:

php -i | grep open_basedir
open_basedir => no value => no value
<?php
var_dump(ini_get('open_basedir'));
?>

Я посмотрел текущую директорию для сессий:

php -i | grep session.save_path
session.save_path => /var/lib/php/sessions => /var/lib/php/sessions

Теперь откроем конфигурацию php-fpm и укажем нужные директории:

nano /etc/php/8.3/fpm/pool.d/www.conf
php_admin_value[open_basedir] = /var/www/:/var/lib/php/sessions:/tmp

Перезапустим php-fpm чтобы применить изменения:

systemctl restart nginx
systemctl restart php8.3-fpm

То есть я привел пример стандартного /var/www/ с веб файлами и директории для хранения сессий, если php скрипты обращаются еще к каким-то директориям, то об этом можно увидеть ошибки в логах веб сервера, потом их также указать в open_basedir.

Если используется Apache2, то можно указать через .htaccess:

php_value open_basedir "/var/www/:/var/lib/php/sessions:/tmp:/ixnfo/com"

Также есть еще более безопасный способ настроить chroot, или поместить веб сервер в docker и показывать через прокси nginx, а еще можно настроить open_basedir для каждого сайта по отдельности, чтобы уязвимость на одном сайте не позволила получить доступ к другим сайтам.

Смотрите также мою статью:
Настройка mTLS

Exit mobile version