Дозволити власнику створювати та читати файли, але не змінювати чи видаляти


17

Я хотів би дати користувачеві дозволи на створення та читання файлів у певному каталозі, але не змінювати чи видаляти файли. Якщо користувач може додавати файли, це нормально, але я краще не став би. Це на Ubuntu Linux.

Я думаю, що це неможливо зі стандартними дозволами на файли Unix, але, можливо, це можливо за допомогою ACL? Користувач завжди підключатиметься за допомогою SFTP, тому, якщо був би якийсь спосіб контролювати це в SFTP (на відміну від дозволів ОС), це було б добре.

Щоб було абсолютно зрозуміло, я хочу:

  • echo hello> test # успішно, тому що тест не існує, і створення дозволено
  • echo hello >> test # може бути успішним чи невдалим, залежно від того, чи дозволено додавання
  • echo hello2> тест # не вдається, тому що тест вже існує, і модифікація заборонена
  • тест на кішку # вдається, тому що читання дозволено
  • rm test # не вдається, оскільки видалення заборонено

Якщо вам цікаво, чому я хочу це зробити, це зробити систему резервного копіювання Duplicati стійкою до Ransomware.


1
Файли завжди створюються порожніми. Коли ви робите це echo > test, оболонка робить a, open("test", O_WRONLY|O_CREAT|O_TRUNC)який створює файл, а потім викликає, echoщо записує вміст, так що модифікує його. Тепер ви могли дозволити досягти успіху лише першому відкритому (WR).
Стефан Шазелас

@ StéphaneChazelas - відредаговано, щоб уточнити, що додавання дозволено
paj28

Відповіді:


16

Ви можете використовувати bindfs:

$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/

Цей каталог належить stephane, причому група Stephane (стефан є єдиним його членом). Також зауважте, tщо заважає користувачам перейменовувати або видаляти записи, якими вони не володіють.

$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir

Ми bindfs dirзакінчуємо себе з фіксованим правом власності та дозволами на файли та каталоги. Усі файли виявляються у власності root(хоча в реальному каталозі вони все ще належать Стефану).

Довідники отримують drwxrwxr-x root stephaneдозволи, тоді як інші типи файлів отримують -rw-r--r-- root stephaneтакі.

$ ls -ld dir
drwxrwxr-t   2 root     stephane   4096 Aug 12 12:28 dir

Зараз створення файлу працює, тому що в каталог можна записати:

$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file

Однак повторно записати open() цей файл неможливо, оскільки ми не маємо на нього дозволу:

$ echo test > dir/file
zsh: permission denied: dir/file

(зауважте, що додавання там заборонено (як це не є частиною ваших початкових вимог)).

Обмеження: хоча ви не можете видалити або перейменувати записи dirчерез tбіт, нові каталоги, які ви створюєте там, не матимуть цього tбіту, тому ви зможете перейменовувати або видаляти записи там.


Це геніально! Дякую, що знайшли час для розробки такого елегантного рішення. Я чув про bindfs раніше, але це перший раз, коли я його фактично використовував.
paj28

4

Ця chattr +aопція дозволить лише додавати. Файли можуть бути змінені таким чином, але лише додавши до них (тобто додаючи рядки). Ви не можете видалити існуючі файли, але створити нові. Це може відповідати вашим потребам:

sudo chattr -R +a /dir/to/apply/to

з man chattr

Файл із набором атрибутів `a 'може бути відкритим лише в режимі додавання для запису. Лише суперпользователь або процес, що володіє функцією CAP_LINUX_IMMUTABLE, може встановити або очистити цей атрибут.

(зауважте, що це стосується і каталогів)

Так ваш список виглядатиме так:

echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed

Гаразд, це звучить багатообіцяюче. Він правильно запобігає видаленню, і якщо файл має атрибут, він перешкоджає перезапису. Однак, коли створюються нові файли, вони не отримують атрибут автоматично. Чи є спосіб, щоб це відбулося автоматично?
paj28

Якщо каталог має атрибут, файли будуть вести себе відповідно, не маючи явно встановленого атрибуту. Проблема - файли в нових підкаталогах. Наприклад, dir1 - chattr +aтоді я можу створити файл, видалити його не дозволено, можу додавати. Якщо я створю dir1 / dir2, я можу робити так, як мені подобається IN
dir2

1
На жаль, ні: dpaste.com/042XQ7X
paj28

Ааа, вибачте - я зробив неправильний тест раніше
Fiximan

@ paj28 ваше посилання порушено :-(
mjaggard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.