Apache PHP uploads - ownership and permissions

Флаг -M для useradd означает "не создавать домашний каталог пользователя", поэтому программа сделала то, что вы просили.

Вы можете решить проблему, создав домашний каталог для Алисы и скопировав в него файлы шаблона:

home=$(getent passwd Alice | cut -d: -f6)
uid=$(getent passwd Alice | cut -d: -f3)
gid=$(getent passwd Alice | cut -d: -f4)
mkdir -m755 "$home"
cp -a /etc/skel/. "$home"
chown -R $uid:$gid "$home"
4
05.11.2017, 14:18
2 ответа

Ваша проблема в том, что новые файлы недоступны для групповой записи. Вместо использования setgid для каталога для установки группы используйтеACL s , которые обеспечивают большую гибкость.

Запись ACL по умолчанию наследуется для новых файлов и каталогов, предоставляя разрешения, определенные в ACL. Чтобы установить запись ACL по умолчанию для группы webadmin, чтобы разрешитьrwx:

setfacl -m default:g:webadmin:rwx /var/www/website.com/public_html/uploads

Новые файлы, созданные в каталоге, будут доступны для чтения и записи для группы webadmin.


Если ACL не является опцией , вам необходимо изменить umask , который определяет разрешения UNIX по умолчанию для новых файлов. Разумным выбором для нового umask является002(мир -с битовой маской для записи )и007(все биты разрешений для всего мира с маской, т. е. только группа и владелец имеют доступ ).

Чтобы установить Apache umask , скопируйте файл модуля systemd в /etc:

cp /lib/systemd/system/apache2.service /etc/systemd/system/

Настройте umask в /etc/systemd/system/apache2.service, добавивUMask=<umask>в секцию [Service]. Обратите внимание, что это влияет на все файлы, созданные Apache.

Изменение umask для sftp требуется только в том случае, если вам нужно изменить загруженные файлы/каталоги с PHP/Apache. Маска по умолчанию 022создает файлы, доступные для чтения для группы и для всех, но не для записи для группы. Самый простой способ настроить по умолчанию umask для sftp — этоpam_umask.

Чтобы применить ваш пользовательский umask только для пользователей в определенной группе и только при использовании sftp ,добавить /etc/pam.d/sshdс:

session [default=1 success=ignore] pam_succeed_if.so user notingroup <yourgroup>
session optional                   pam_umask.so umask=<umask>

Первое правило указывает pam пропустить следующее правило, если пользователь не входит в группу <yourgroup>, т. е. применять следующее правило только в том случае, если пользователь находится в группе <yourgroup>. Второе правило устанавливает umask равным <umask>.


Приложение:Обратите внимание, что существующие файлы, перемещенные с помощью mv, сохраняют свои первоначальные разрешения и права собственности. Вы можете применить разрешения по умолчанию из umask и каталога setgid/ACL, скопировав вместо этого файлы с cp -d.

2
27.01.2020, 21:06

Преимущество стандартов в том, что обычно есть из чего выбирать.

Спасибо, что подумали о разрешениях и запретили uid вашего веб-сервера записывать файлы, кроме загруженного контента. Я надеюсь, что вы полностью отключили выполнение php в каталоге загрузки. На данный момент ваша модель несколько ошибочна, поскольку вы добавляете apache в группу с дополнительными привилегиями. Но это только часть проблемы -, но я отвлекся от заданного вами вопроса.

То, что вы создали пользователя, означает, что у вас есть привилегии суперпользователя на поле (вы должны были явно указать это ). Но вы не сказали, используете ли вы собственное программное обеспечение или готовый пакет. Последнее создает некоторые сложности, поскольку его настройка может поставить под угрозу регулярное исправление, которое вы должны выполнять. Если apache является единственным uid, для которого вы намерены иметь строго контролируемые права на цель, вы можете решить проблему, предоставив доступ к файлу apache как «другой», а не как пользователь или группа.

В качестве альтернативы, чтобы предоставить доступ к загружаемому контенту другим учетным записям, просто используйте umask 000/chmod файлы на 666. Обратите внимание, что перемещение _загруженного _файла ()фактически создает копию и удаляет оригинал и, что особенно важно, создание файла учитывает umask . Следовательно, любой правильно написанный php может хранить загруженный http контент как доступный для чтения и записи всем без каких-либо изменений кода, установив umask 000 для веб-сервера.

В качестве альтернативы вы можете написать сценарий оболочки, чтобы изменить права доступа к контенту, загружаемому по http, на что-то, что позволит вам манипулировать контентом с помощью обычной учетной записи пользователя, а затем предоставить вашему веб-серверу uid право вызывать этот скрипт через sudo. Это должно быть вызвано вашим кодом после перемещения _загруженного _файла ().

В качестве альтернативы,довольно уродливым решением было бы поместить наблюдение inotify в каталог загрузки, связанный со сценарием для исправления разрешений (, например. используя инкрон)

В крайнем случае вы можете запустить обычное задание cron для каталога загрузки, чтобы исправить разрешения.

Я рекомендую использовать подход umask .

-3
27.01.2020, 21:06

Теги

Похожие вопросы