如何防止用户更改其他用户具有写入权限的文件?

如何防止用户更改其他用户具有写入权限的文件?

最近出现了一个奇怪的情况。用户 1 需要能够更改目录中的文件,而该文件和目录属于用户 2 且位于用户 2 组中。为了方便这次编辑,将目录结构的权限递归修改为757。因此,列表如下所示。

drwxr-xrwx 3 user2 user2 4096 Nov 19 19:41 .
drwxr-xr-x 3 user2 user2 4096 Nov 19 19:41 ..
drwxr-xrwx 3 user2 user2 4096 Nov 19 19:41 directory1
drwxr-xrwx 3 user2 user2 4096 Nov 19 19:41 directory2
drwxr-xrwx 3 user2 user2 4096 Nov 19 19:41 directory3
-rwxr-xrwx 3 user2 user2   42 Nov 19 19:41 file1

用户 1 能够读取文件,但尝试创建新文件或编辑/复制现有文件失败。错误类似于以下内容。

$ touch file1
touch: cannot touch 'file1': Permission denied

用户 1 认为驱动器可能受到写保护,因此要求用户 2 更改文件。用户 2 能够毫无问题地执行此操作,因此表明驱动器未受到写保护。

查看df/etc/fstab,该文件似乎位于本地安装的硬盘驱动器上。

其他信息。用户 1 属于用户 2 组。 (最初认为情况并非如此)文件上没有锁。 SE Linux 似乎被禁用了。 (如 所示sestatus)虽然我通常认为您不会希望设置整个目录以允许任何人写入它,但这是一个特殊情况。在一台单独的机器上几乎相同的构建可以工作。 getfacl 的输出对于文件和目录是相同的。

# file: .
# owner: user
# group: user
user::rwx
group::r-x
other::rwx

什么会导致这种保护以及如何撤消它?

答案1

我本来打算简单地删除这个问题,因为原来的事实之一是不正确的。我决定,由于错过了明显的答案,并且有一个替代的不太明显的答案来发布此问题的可能原因和解决方案,以帮助那些将来可能遇到类似问题的人。

1) 如果您遇到此问题并且您认为 user1 不属于 user2,请亲自通过让 user1 检查组或检查 passwd 文件来验证这一点。在这种情况下,user1 被错误地添加了以下/etc/passwd条目,并且 中没有条目/etc/group

user1:x:1001:1000:User1:/home/user1:/bin/bash

而用户 2 有以下内容/etc/passwd

user2:x:1000:1000:User2:/home/user2:/bin/bash

user2:x:1000:user2 user1

组权限优先于其他权限,因此不允许写入。可以通过更改组权限或从 user2 组中删除 user1 来解决此问题。这是一个简单的答案,如果最初的假设是正确的,很多人可能都会得到这个答案。提醒自己,当某些事情不起作用时,请自行验证。

2)不太明显的答案来自使用文件访问控制列表(ACL)。如果相关用户已分配特定权限,则这些权限优先于一般权限。虽然使用过 ACL 的人可能都知道这一点,但我怀疑许多人甚至不知道它们的存在。以下是如何阻止用户的示例。

$ sudo setfacl -m u:user:r-x .
$ ls -la
total 0
drwxr-xrwx+  2 root root  60 Nov 21 20:46 .
drwxrwxrwt. 12 root root 300 Nov 21 20:45 ..
-rw-rw-r--.  1 user user   0 Nov 21 20:46 dog
$ touch cat
touch: cannot touch ‘cat’: Permission denied
$ getfacl .
# file: .
# owner: root
# group: root
user::rwx
user:user:r-x
group::r-x
mask::r-x
other::rwx

要撤消此操作

$ sudo setfacl -b .
$ sudo getfacl .
# file: .
# owner: root
# group: root
user::rwx
group::r-x
other::rwx

$ touch cat
$ ls -la cat
-rw-rw-r--. 1 user user 0 Nov 21 20:51 cat

感谢 @andcoz 询问最终让我回去重新验证的小组,并感谢 @Rianto Wahyudi 提到我以前从未见过/使用过的“getacl”。

相关内容