Я работаю с системным администратором в университете и просто наткнулся на что-то, что, вероятно, распространено, но было для меня шоком.
Все каталоги public_html и веб-области хранятся в afs с разрешениями на чтение для веб-серверов. Поскольку пользователям разрешено иметь php-скрипты в своем public_html, это означает, что они могут обращаться к файлам друг друга изнутри php (и основных веб-файлов!).
Это не только делает бесполезной любую защиту паролем .htaccess, но также позволяет пользователям читать исходные файлы php, содержащие пароли базы данных mysql и аналогичную конфиденциальную информацию. Или, если они обнаружат, что у других людей есть каталоги, к которым веб-серверы имеют доступ для записи (например, для личных журналов или для сохранения отправленных данных формы), они могут хранить файлы в этих учетных записях.
Простой пример:
<?
header("Content-type: text/plain");
print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd");
?>
Это общая проблема? И как вы обычно это решаете?
ОБНОВИТЬ:
Спасибо за вклад. К сожалению, кажется, нет простого ответа. В большой общей среде, такой как эта, пользователям, вероятно, не следует предоставлять такой большой выбор. Лучший подход, который я могу придумать, - это установить open_basedir в основной конфигурации для всех каталогов public_html, запустить suphp и разрешить только чистый php (без сценариев cgi, запуска внешних команд с обратными галочками и т. Д.).
Такое изменение политики может привести к поломке многих вещей и, вполне возможно, к тому, что пользователи схватят свои вилы и будут преследовать нас ... Я буду обсуждать это со своими коллегами и обновлять здесь, если мы примем решение о том, как изменить установку.
источник
open_basedir
ниже решение для производственных систем общего хостинга, но мы разделили всех на своих собственных виртуальных хостов - не уверен, работает ли он для отдельных каталогов ...Ответы:
Можно использовать suphp, который запускает скрипт php с идентификатором своего владельца.
http://www.suphp.org
источник
check_vhost_docroot
, но AFAIK, который применяется только к исполняемому сценарию (? Я могу ошибаться)Я бы предложил ограничить доступ PHP к файлам (через
open_basedir
& подобные директивы, для каждого хоста): вы хотите, чтобы пользователи могли открывать / читать / записывать файлы под своим рутом и, возможно, на один уровень выше (для нуля) пространство), но не каталог, в котором они будут хранить, например,htpasswd
файлы.Структура каталогов, например:
Соответствует этому требованию:
open_basedir
может быть/Client/site
безопасно указано , иhtpasswd
файлы хранятся в/Client/auth
(с.htaccess
файлами илиhttpd.conf
изменены, чтобы указывать вместо этого в соответствующем месте).Это препятствует тому, чтобы ваши клиенты открывали чьи-либо файлы, и в качестве преимущества злоумышленники не могут читать содержимое
/Client/auth
(или что-либо еще в вашей системе, например/etc/passwd
:-)Смотрите http://php.net/manual/en/ini.core.php для получения дополнительной информации о реализации open_basedir & per-vhost.
источник
suphp
Как отметил cstamas, это также действительно хорошая идея в среде виртуального хостинга. Его настройка требует небольшого объема, но я бы сказал, что повышение безопасности того стоит. Если не считать песочницу всех ваших сайтов PHP в чем-то вроде FreeBSD Jail или выделенной виртуальной машины, это одно из самых больших достижений безопасности.open_basedir
внутри директивы <Directory>, но я думаю, что это должно быть допустимо («попробуйте и посмотрите» - худшее, что можно сделать, это не работает :)Нет, это не распространенная проблема, поскольку большинство общих хостов определяют конфигурацию open_basedir в файле htaccess в каталоге public_html каждого пользователя (или в vhost, если у каждого пользователя есть собственный vhost).
например, файла .htaccess:
Но убедитесь, что вы установили правильные разрешения для файла .htaccess, чтобы предотвратить изменение пользователем open_basedir (если они пытаются переопределить его в subdir / .htaccess, это не должно работать - но вам, вероятно, следует проверить это, чтобы убедиться) ,
НТН
C.
источник
AFS игнорирует простые пользовательские разрешения Unix. suPHP выполняет setuid перед запуском программы php, но это не дает процессу токенов kerberos, необходимых для доступа к AFS, и ограничивается его разрешениями. Для получения этих токенов необходимо было бы каким-то образом изменить suPHP, прежде чем он сможет представить себя в системе AFS в качестве этого пользователя. Насколько я знаю, это не было сделано. (На самом деле, я нашел этот вопрос, когда смотрел, сделал ли это кто-нибудь еще.)
источник