У меня есть настройка со многими пользователями, которые могут разместить свою личную веб-страницу (обслуживаемую apache через mod_userdir
), расположенный под public_html
в своих домах. поддержка php также включена в apache.
На данный момент у меня есть следующая конфигурация в /etc/apache2/mods-enabled/userdir.conf
<IfModule mod_userdir.c>
UserDir <home basedir>/*/public_html
UserDir disabled root
<Directory <home basedir>/*/public_html>
AllowOverride FileInfo AuthConfig Limit Indexes Options
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
Require all granted
</Limit>
<LimitExcept GET POST OPTIONS>
Require all denied
</LimitExcept>
</Directory>
</IfModule>
Проблема в том, что, поскольку каждый php-скрипт запускается пользователем www-данные
, каждая пользовательская страница имеет права доступа к страницам всех остальных пользователей. public_html
. Например, я могу получить обратную оболочку php и проверить контент других пользователей.
я пытался добавить
php_admin_value open_basedir "."
внутри Каталог
тег выше. Это предотвращает дыру в безопасности, описанную выше, но на самом деле позволяет php-скрипту спускаться только вниз по иерархии каталогов. Например
<?php
chdir('assets');
echo getcwd();
chdir('..');
echo "<br>";
echo getcwd();
?>
производит
<home>/public_html/активы
<home>/public_html/активы
Проблема решена, если <дом>/public_html
путь жестко запрограммирован в open_basedir
переменная, но, конечно, мне нужно иметь возможность сделать это для всех пользователей через какую-то переменную.
Сохраняет ли apache подстановочный знак (<домашняя база>/*/public_html
) соответствует некоторой переменной, к которой я могу получить доступ внутри Каталог
тег? Или есть другие лучшие способы сделать это, например, запустить каждую пользовательскую страницу в среде, подобной chroot?