Як надати дозволи на читання, але не видалити файл


12

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

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

але worker 1-2-3не може видалити файли лише після створення managerта rootможе видалити worker 1-2-3створені файли .

Я спробував кілька chownі chmodхитрощів із застосуванням липкого шматочка без успіху.


1
Чи мають worker*користувачі записують в каталог певним чином? Ви згадували в коментарі, що сюди ходять файли журналів, то це означає, що для створення файлів тут запускається певний виконуваний файл? Якщо так, ви можете дати workerгрупі sudoдозвіл на запуск виконуваного файлу як manager. Тоді виконуваний файл створив би журнали як managerкористувач, який міг би читати працівники.
Centimane

Якщо користувач може змінити файл, він також може стерти його вміст, таким чином ефективно "видаливши" його. Схоже, вам потрібен якийсь інтерфейс "подання", а не файлові системи. Електронні листи були б найпростішими.
ybungalobill

Відповіді:


8

На відміну від Windows, в Unix / Linux немає чіткого дозволу на видалення. Право на видалення (або створення або перейменування) файлу пов'язане із вмістом каталогу. Видаліть дозвіл на запис працівників /manager/repository/, щоб заборонити працівникам створювати, видаляти та перейменувати файли.

Зауважте, що неможливо дозволити створення файлів, але заборонити їх видалення.


як можна видалити дозвіл на запис, оскільки файл буде записуватися весь час, коли це файл журналу
user63898

Хоча це було правдою, багато сучасних систем підтримують розширені ACL (NFSv4 ACL, підтримувані FreeBSD, Solaris або Linux (патч Richacl), які надають аналогічні можливості, як і Windows NT ACL. Ваша акція 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? чи є ще загальне рішення?
користувач63898

так, коли я намагаюся створити файл з worker1 touch /manager/repository/x.txt im get: touch: не можна торкатися `/manager/repository/x.txt ': Дозволу відмовлено
user63898

все ще отримують дозвіл відмовлено, коли я роблю репозитарій ls -ld, я отримую: drwxrwxr-t 2 користувачі менеджера 4096 7 вересня, репозиторій
7:30

коли ви робите setfacl -d -R -m користувач :: rwx, користувач: worker1: --- сховище /, а потім намагаєтесь створити файл з worker1 touch /manager/repository/x.txt їм отримання: touch: не можу торкнутися `/ manager /repository/x.txt ': Дозвіл відхилено
user63898

5
чи не все-таки це дозволить комусь написати тут порожній файл? Як echo " " > $fileби, клобує вміст файлу з "", що технічно є записом, але ефективно видаляє вміст. Здається, що справжня репо-версія, як svn, була б найкращою ставкою тут.
Centimane

3

Для цього з дозволами вам знадобиться система з підтримкою ACL, схожих на 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/

(1) Відповідно до документації, aатрибут означає лише додавання. Чи можуть користувачі редагувати ці файли? (2) Який ефект встановлення aатрибута в каталозі?
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.