Как дать разрешения на чтение, запись, а не удаление файла

12

Я хочу дать пользователям возможность создавать файлы записи и чтения в другом пользовательском каталоге, но не иметь возможности удалить файл после создания (закрепление не будет работать здесь ...), например:

У меня есть пользователь manager с каталогом. У repository
меня есть пользователь, worker1которому нужно записывать файлы, /manager/repositoryно я не могу удалить файлы. У
меня есть пользователь, worker2которому нужно записать файлы, /manager/repository но я не могу удалить файлы, в
которые есть пользователь, worker3которому нужно записать файлы, /manager/repository но я не могу удалить файлы

но worker 1-2-3не может удалить файлы только после создания managerи rootможет удалить worker 1-2-3созданные файлы .

Я попробовал немного chownи chmodуловок с применением липкой части без успеха.

user63898
источник
1
worker*Пишут ли пользователи в каталог определенным образом? Вы упомянули в комментарии, что файлы журналов идут сюда, значит ли это, что для создания файлов здесь запускается определенный исполняемый файл? Если это так, вы можете дать workerгруппе sudoразрешение на запуск исполняемого файла от имени manager. Затем исполняемый файл будет создавать журналы как managerпользователь, который может быть доступен для чтения рабочим.
Сентиман
Если пользователь может изменить файл, он также может стереть его содержимое, тем самым фактически «удалив» его. Похоже, вам нужен какой-то интерфейс представления, а не файловые системы. Письма были бы самыми простыми.
ybungalobill

Ответы:

8

В отличие от Windows, в Unix / Linux нет четкого разрешения на удаление. Право на удаление (или создание или переименование) файла привязано к каталогу, в котором он находится. Удалите разрешение на запись для рабочих /manager/repository/, чтобы запретить рабочим создавать, удалять и переименовывать файлы.

Обратите внимание, что невозможно разрешить создание файлов, но запретить их удаление.

countermode
источник
как можно удалить разрешение на запись, так как файл будет записываться все время, пока он является файлом журнала
user63898
Хотя раньше это было правдой, многие современные системы поддерживают расширенные списки ACL (ACL NFSv4, поддерживаемые FreeBSD, Solaris или Linux (патч Richacl), которые предоставляют возможности, аналогичные ACL Windows NT. Однако в вашем стандартном дистрибутиве Linux его, вероятно, нет.
Стефан Шазелас
@ user63898 вы удаляете права на запись из каталога, в котором находится файл, а не из самого файла.
GnP
6

Прежде всего убедитесь, что ACL включен в вашей системе, затем выполните эту команду

setfacl -d -R -m user::rwx,user:worker1:---,user:worker2:---,user:worker3:--- \
/manager/repository

Как это устроено

  • Эта команда предоставит права на чтение, запись и выполнение для владельца каталога /manager/repository. Он будет отменить все разрешения на worker1, worker2и worker3.

  • Это даст другим пользователям доступ для чтения и записи, но запретит удаление.


От man setfacl:

-d, --default
       All  operations  apply to the Default ACL.

-R, --recursive
       Apply operations to all files and directories recursively.

-m, --modify
       Options to modify the ACL of a file or directory.
Рахул
источник
спасибо, но проблема в том, что пользователи создаются все время. а некоторые удаляются администратором. так что это значит, что мне нужно каждый раз обновлять каталог с помощью setfacl? Есть ли более общее решение?
user63898
да, когда я пытаюсь создать файл из worker1 touch /manager/repository/x.txt я получаю: touch: не могу коснуться `/manager/repository/x.txt ': разрешение запрещено
user63898
по-прежнему получаю разрешение Отказано в доступе, когда я делаю репозиторий ls -ld, я получаю: drwxrwxr-t 2 пользователя-менеджера 4096 7 сентября, репозиторий 11:30 /
user63898
при выполнении setfacl -d -R -m user :: rwx, user: worker1: --- репозиторий / и затем при попытке создать файл из worker1 touch /manager/repository/x.txt im получение: touch: не может коснуться `/ manager /repository/x.txt ': В доступе отказано
user63898
5
Разве это не позволило бы кому-то написать здесь пустой файл? Похоже на echo " " > $fileто, что содержимое файла будет "" ", что технически является записью, но эффективно удаляет содержимое. Похоже, что реальный репозиторий, такой как svn, будет лучшим выбором.
Сентиман
3

Чтобы сделать это с разрешениями, вам потребуется система с поддержкой списков ACL, аналогичных спискам управления доступом NFSv4. Например, во FreeBSD, если файловая система смонтирована с nfsv4aclsфлагом, вы можете сделать:

mkdir testdir
chown manager:worker-group testdir
chmod 775 testdir
setfacl -m group@:D::deny testdir

Чтобы явно отказать в delete_childразрешении членам worker-groupгруппы.

Однако обратите внимание, что, поскольку работники будут владельцами создаваемых ими файлов, они все равно смогут изменять списки ACL для них и, предоставляя себе deleteразрешение, это будет иметь приоритет над delete_childразрешением родительского каталога, и я не Конечно, есть способ обойти это (по крайней мере, в файловых системах UFS во FreeBSD). Например, они могут сделать:

$ touch file
$ rm -f file
rm: file: Operation not permitted
$ setfacl -m owner@:d::allow file
$ rm -f file
$
Стефан Шазелас
источник
0

Чтобы взять разрешения на запись из /manager/repositoryпапки. Таким образом, все пользователи, не являющиеся root, смогут писать или удалять файлы внутри /manager/repository, но не удалять файлы из этого каталога.

chmod 755 /manager/repository
Йозеф Климук
источник
0

мы можем изменить файлы и папки, но не можем удалить.

Чтобы удалить атрибуты, выполните следующие команды:

Для файлов:

$ sudo chattr -R -a file.txt

Для каталогов:

$ sudo chattr -R -a dir1/
Ankitsrivasta
источник
(1) Согласно документации, aатрибут означает «только добавление». Могут ли пользователи редактировать эти файлы? (2) Каково влияние установки aатрибута на каталог?
Скотт