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


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.