允许所有者创建和读取文件,但不允许修改或删除


17

我想授予用户在特定目录中创建和读取文件的权限,但不允许修改或删除文件。如果用户可以将文件追加到确定的位置,但是我宁愿不这样做。这是在Ubuntu Linux上。

我认为使用标准的Unix文件权限是不可能的,但是使用ACL可能做到这一点吗?用户将始终使用SFTP进行连接,因此,如果有某种方法可以在SFTP中进行控制(相对于OS权限),那就很好了。

绝对清楚,我想要以下几点:

  • echo hello> test#成功,因为测试不存在,并且允许创建
  • echo hello >> test#是成功还是失败,取决于是否允许附加
  • echo hello2> test#失败,因为测试已经存在,并且不允许修改
  • cat test#成功,因为允许读取
  • rm test#失败,因为不允许删除

如果您想知道为什么要这样做,那就是制作一个能够抵抗勒索软件的Duplicati备份系统。


1
文件始终创建为空。当您这样做时echo > test,shell会执行一个操作,该操作open("test", O_WRONLY|O_CREAT|O_TRUNC)创建文件,然后调用echo写入内容,从而对其进行修改。现在,您只允许第一个open(WR)成功。
斯特凡Chazelas

@StéphaneChazelas-编辑以澄清允许附加
paj28

Answers:


16

您可以这样使用bindfs

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

该目录归stephane所有,stephane组(stephane是其唯一成员)。另请注意,t该选项可防止用户重命名或删除他们不拥有的条目。

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

我们bindfs dir对文件和目录拥有固定的所有权和权限。所有文件看起来都归所有者所有root(尽管在真实目录的下面,它们仍然由stephane拥有)。

目录获得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 2015年

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.