Разрешить владельцу создавать и читать файлы, но не изменять и не удалять


17

Я хотел бы дать пользователю разрешения на создание и чтение файлов в определенном каталоге, но не изменять или удалять файлы. Если пользователь может добавлять файлы, это нормально, но я бы не стал. Это на Ubuntu Linux.

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

Чтобы быть абсолютно ясным, я хочу следующее:

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

Если вам интересно, почему я хочу это сделать, это сделать систему резервного копирования Duplicati устойчивой к вымогателям.


1
Файлы всегда создаются пустыми. Когда вы это делаете echo > test, оболочка 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/

Этот каталог принадлежит Стефану с группой Стефан (Стефан является его единственным членом). Также обратите внимание на 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, тогда я могу делать все, что
— захочу

1
К сожалению, нет: dpaste.com/042XQ7X
— paj28

Ааа, извините - я сделал неправильный тест раньше
— Fiximan

@ paj28 ваша ссылка не работает :-(
— mjaggard
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.