Вопрос или проблема
В моей папке /var/www/storage/app/uploads/public
находится много подкаталогов, которые создаются моей CMS и скриптом sftp загрузки с удаленного сервера.
Теперь проблема, с которой я столкнулся, возникает из-за каталогов, созданных sftp загрузкой.
Владелец – sftpuser, и у моего пользователя www-data нет разрешения на запись в этот каталог для создания подкаталога.
Это вызывает, чтобы пользовательский скрипт php от www-data выдавал
Обратная трассировка от ‘mkdir(): Permission denied’ в /var/www/install-master/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php 336:
Если я проверю права acl на родительских каталогах с тех пор, как я сначала установил их на запись для группы, то верхний каталог имеет правильные права acl.
Но второй уровень, созданный sftp, не имеет этих прав
Я нашел этот вопрос, но на самом деле полезного ответа там не было, кроме того, что sftp игнорирует acls.
Я попробовал установить бит umask для sftp в /etc/ssh/sshd_config
но даже это не повлияло на вновь созданный каталог. Он все еще не доступен для записи группой.
Как мне использовать sftp, чтобы дать разрешения на просмотр и создание подкаталогов для владельца и группы, разрешения на чтение и запись для владельца и группы, но без разрешений на выполнение файлов в этих подкаталогах?
Или мне стоит использовать другой подход? Насколько я понимаю, sftp имеет только ограниченные возможности по изменению разрешений файлов с удаленной стороны, и acl явно игнорируются openssh sftp.
Так как мне получить эти правильные разрешения на Ubuntu 18.04 с пользователем sftpuser?
Я нашел решение в bindfs. Это позволяет копировать загруженные папки в мою целевую папку с правильными разрешениями.
Я следовал этому руководству https://www.talkerland.com/2018/08/20/howard/how-to-install-bindfs-on-ubuntu-18-04/
root@talkerland $ apt update
root@talkerland $ apt -y install bindfs
root@talkerland $ mkdir -p /home/gatekeeper/www/html
root@talkerland $ chown -Rf gatekeeper:gatekeeper /home/gatekeeper/www
root@talkerland $ chmod -Rf 770 /home/gatekeeper/www
root@talkerland $ nano /etc/fstab
Затем, на одной строчке в /etc/fstab
bindfs#/var/www/html /home/gatekeeper/www/html fuse force-user=gatekeeper,force-group=gatekeeper,create-for-user=www-data,create-for-group=www-data,create-with-perms=god=rx:ud=rwx:gof=r:uf=rw,chgrp-ignore,chown-ignore,chmod-ignore 0 0
чтобы запустить bindfs, мне нужно было всего лишь внести несколько изменений в записи fstab, чтобы получить нужные мне разрешения, которые также предполагают запись для группы, изменив god
на od
и ud
на gud
.
Здесь o
обозначает other
(другие), g
обозначает group
(группу), u
обозначает user
(пользователя), а f
обозначает file
(файл) и d
обозначает directory
(каталог).
bindfs#/var/www/html /sftp/sftpuser/app fuse force-user=sftpuser,force-group=sftpuser,create-for-user=www-data,create-for-group=www-data,create-with-perms=od=rx:gud=rwx:of=r:ugf=rw,chgrp-ignore,chown-ignore,chmod-ignore 0 0
Таким образом, теперь у меня есть довольно точный метод загрузки этих удаленных файлов с правильными разрешениями. Единственный недостаток в том, что теперь у меня дублируется контент, но с этим я готов смириться ради правильного управления разрешениями.
Ответ или решение
Настройка корректных прав на файлы и директории, создаваемые пользователем SFTP в общем каталоге, является важным аспектом администрирования серверов на базе Ubuntu, особенно в контексте веб-хостинга, где взаимодействуют разные пользователи и группы.
Задача
У вас есть директория /var/www/storage/app/uploads/public
, в которой создаются подкаталоги как вашим CMS, так и скриптом SFTP-загрузки с удалённого сервера. Проблема заключается в том, что каталоги, созданные через SFTP, имеют владельца sftpuser и недоступны для записи вашему пользователю www-data, что приводит к ошибке mkdir(): Permission denied
. Попытки задать права доступа через ACL и умаску (umask) в sshd_config
не привели к ожидаемым результатам.
Решение
Вы нашли решение с использованием утилиты BindFS. BindFS позволяет назначить правильные права доступа, создавая зеркальный каталог с необходимыми разрешениями. Давайте рассмотрим этот подход более детально.
Установка BindFS
Для начала установите BindFS на ваш сервер Ubuntu:
apt update
apt -y install bindfs
Настройка BindFS через fstab
Отредактируйте файл /etc/fstab
, чтобы смонтировать каталог с необходимыми правами доступа:
bindfs#/var/www/html /sftp/sftpuser/app fuse force-user=sftpuser,force-group=sftpuser,create-for-user=www-data,create-for-group=www-data,create-with-perms=od=rx:gud=rwx:of=r:ugf=rw,chgrp-ignore,chown-ignore,chmod-ignore 0 0
Здесь:
force-user
иforce-group
указывают на обязательного владельца и группу для всех файлов и каталогов.create-for-user
иcreate-for-group
назначают владельца и группу для новых файлов и папок.create-with-perms
определяет права доступа:od=rx
— для других пользователей доступен только просмотр каталогов.gud=rwx
— для группы права на чтение, запись и выполнение в каталогах.of=r
— для других пользователей только чтение файлов.ugf=rw
— для владельца и группы права на чтение и запись файлов.
Эта конфигурация позволяет автоматизировать установку необходимых прав доступа для новых файлов и папок, создаваемых SFTP-скриптом, обеспечивая возможность записи для других пользователей в той же группе.
Итог
С применением BindFS вы смогли настроить зеркальный каталог с правильными правами доступа, что решило проблему с ошибкой "Permission denied". Однако это привело к дублированию содержимого, что является компромиссом для обеспечения корректного управления доступом.
Рекомендации
- Мониторинг изменений: Следите за изменениями в структуре каталогов и их содержимом через периодические проверки, чтобы предотвратить возникновение новых проблем.
- Оптимизация зеркала: Рассмотрите возможность оптимизации работы с дублированным содержимым, чтобы снизить нагрузку на сервер и обеспечить эффективное использование дискового пространства.
Применяя это решение, вы не только решаете проблему совместимости файлов и прав доступа, но и повышаете уровень безопасности и надежности файловой структуры вашего веб-приложения.