Установка правильных разрешений по умолчанию на каталоги и файлы, созданные пользователем sftp в той же группе.

Вопрос или проблема

В моей папке /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.

правильный acl

Но второй уровень, созданный sftp, не имеет этих прав

неправильный acl

Я нашел этот вопрос, но на самом деле полезного ответа там не было, кроме того, что sftp игнорирует acls.

Я попробовал установить бит umask для sftp в /etc/ssh/sshd_config

изменённый umask в 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". Однако это привело к дублированию содержимого, что является компромиссом для обеспечения корректного управления доступом.

Рекомендации

  1. Мониторинг изменений: Следите за изменениями в структуре каталогов и их содержимом через периодические проверки, чтобы предотвратить возникновение новых проблем.
  2. Оптимизация зеркала: Рассмотрите возможность оптимизации работы с дублированным содержимым, чтобы снизить нагрузку на сервер и обеспечить эффективное использование дискового пространства.

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

Оцените материал
Добавить комментарий

Капча загружается...