Разрешения на загрузку файлов PHP

Я настраиваю общий хостинг. Мои пользователи имеют доступ к серверу по протоколу SFTP для загрузки своего содержимого. Я использую отдельные процессы PHP, работающие от имени соответствующих пользователей (по одному на сайт). Я хочу, чтобы пользователи не видели содержимое других пользователей по умолчанию (кроме как через веб-сервер, как любой другой непривилегированный клиент), но веб-сервер (работающий как пользователь / группа www-данных) должен иметь возможность читать все. Прямо сейчас я передаю права владения файлами в www отдельным пользователям и принадлежность группы для www-данных и использую бит GID набора, чтобы распространять владение группой на новые файлы / каталоги (пользователи не входят в группу www-data).

Работало нормально, но теперь я столкнулся с проблемой. Некоторые сайты используют WordPress, и при загрузке файлов установленный бит GID теряется, что означает, что веб-сервер не имеет к нему доступа. Есть ли способ настроить PHP или WordPress (более вероятно) для chmod файлов и каталогов в правильные разрешения?

Примечание: я не использую безопасный режим в PHP, поэтому он должен быть в состоянии добавить установленный бит GID.

Обновление: я попытался настроить значения FS_CHMOD_DIR и FS_CHMOD_FILE в конфигурации WordPress. Я предполагал, что это позволит мне chmod загруженные файлы к тому, что я хотел. Однако это не повлияло на разрешения вновь загружаемых файлов. Из информации в кодексе, я думаю, эти настройки применимы только к функции обновления ядра.

Спасибо!

2 ответа

Решение

Это не ответ на точный вопрос, а скорее решение проблемы в целом. Присвойте владельцу веб-каталога пользователя user / www-data и установите права доступа 750, без бита SGID. Пользователи не должны входить в группу www-data. Однако внутри этого каталога принадлежность группы может быть установлена ​​для основной группы пользователей (например, пользователи). Разрешения внутри могут быть 644 и 755 для файлов и подкаталогов соответственно. Безопасность обеспечивается тем фактом, что другие пользователи не смогут войти или пройти через этот веб-каталог и, следовательно, не смогут получить доступ к каким-либо файлам внутри, даже если у них достаточно прав для доступа к самим файлам. Это ограничит как пользователей, подключающихся через SFTP, так и выполняющих команды PHP.

Поскольку это решение не использует установленный бит GID, оно решает исходную проблему. Загруженные файлы можно оставить с их владельцем по умолчанию и разрешениями.

Небольшая демонстрация:

transistor# mkdir www
transistor# chown :www-data www
transistor# chmod 750 www
transistor# ls -l
total 4
drwxr-x--- 2 root www-data 4096 Feb 20 20:59 www
transistor# touch www/file1.txt
transistor# mkdir www/subdir
transistor# touch www/subdir/file2.txt
transistor# ls -l www
total 4
-rw-r--r-- 1 root root    0 Feb 20 21:00 file1.txt
drwxr-xr-x 2 root root 4096 Feb 20 21:00 subdir
transistor# ls -l www/subdir 
total 0
-rw-r--r-- 1 root root 0 Feb 20 21:00 file2.txt
transistor# exit
giedrius@transistor:/tmp/sandbox$ cd www
bash: cd: www: Permission denied
giedrius@transistor:/tmp/sandbox$ ls www/subdir
ls: cannot access www/subdir: Permission denied
giedrius@transistor:/tmp/sandbox$ cat www/file1.txt
cat: www/file1.txt: Permission denied
giedrius@transistor:/tmp/sandbox$ cat www/subdir/file2.txt
cat: www/subdir/file2.txt: Permission denied
giedrius@transistor:/tmp/sandbox$ sudo -su www-data
transistor% ls www 
file1.txt  subdir
transistor% cat www/file1.txt 
transistor% cat www/subdir/file2.txt 
transistor% 

Пожалуйста, смотрите эту статью.
и это.

Другие вопросы по тегам