如何授予用户更改目录中文件/目录所有权的权限

如何授予用户更改目录中文件/目录所有权的权限

如何授予特定用户更改特定目录内文件和目录的用户和组所有权的权利?

我用谷歌搜索了一下,发现有这样的东西setfacl,它允许授予用户更改文件和目录权限的特定权限。但据我了解,此命令不允许授予 chown 权限。

所以,假设一个文件有

user1 user1 theFile1
user1 user1 theDirectory1

发出以下命令将失败。

[user1@THEcomputer]$ chown user2 theFile

我确实拥有计算机的 root 访问权限。有没有办法授予用户chown在目录内发出命令?

更新:如何将用户添加到组。

这里是文章我曾经添加datamoverhts组中。

[root@Venus ~]# usermod -a -G datamover hts
[root@Venus ~]# exit
logout
[hts@Venus Receive]$ groups
hts wireshark datamover
[hts@Venus Receive]$ 

更新(RuiFRibeiro 的地址评论):

将目录的所有权更改为该目录不起作用,请参见屏幕截图。

[datamover@Venus root]$ ls -la
total 311514624
drwxrwxrwx. 6 datamover datamover         4096 Oct 14 14:05 .
drwxr-xr-x  4 root      root              4096 Aug 20 16:52 ..
-rwxrwxrwx. 1 datamover datamover          674 Aug 31 16:47 create_files.zip
drwxrwxrwx  2 datamover datamover         4096 Oct 17 17:07 dudi
-rwxrwxrwx. 1 datamover datamover 318724299315 Oct 13 15:47 Jmr400.mov
-rwxrwxrwx. 1 datamover datamover    182693854 Aug 31 16:47 Jmr_Commercial_WithSubtitles.mov
-rwxrwxrwx. 1 datamover datamover     80607864 Aug 31 16:47 Jmr_DataMover_Final.mov
drwxrwxrwx. 2 datamover datamover       122880 Aug 23 11:54 ManyFiles
drwxrwxrwx. 3 datamover datamover         4096 Oct 25 07:18 Receive
drwxrwxrwx  2 datamover datamover         4096 Oct 14 13:40 sarah
-rwxrwxrwx  1 datamover datamover      3184449 Oct 14 14:05 SourceGrid_4_40_bin.zip
[datamover@Venus root]$ cd ./Receive/
[datamover@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover      4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover      4096 Oct 14 14:05 ..
-rwxrwxrwx  1 hts       hts       182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx  2 datamover datamover    122880 Oct 23 13:33 ManyFiles
[datamover@Venus Receive]$ chown datamover:datamover ./Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of './Jmr_Commercial_WithSubtitles.mov': Operation not permitted

这是作为文件所有者的尝试:

[hts@Venus Receive]$ chown datamover:datamover Jmr_Commercial_WithSubtitles.mov
chown: changing ownership of 'Jmr_Commercial_WithSubtitles.mov': Operation not permitted

正如您所看到的,这两种可能性都行不通。

更新(地址计数器模式的答案)

文件所有者(和 root)可以更改组所有权。但是,这仅限于所有者所属的组。

是的,必须先注销。这是我尝试的结果:

[hts@Venus ~]$ groups hts
hts : hts wireshark datamover
[hts@Venus ~]$ cd /mnt/DataMover/root/Receive/
[hts@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover      4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover      4096 Oct 14 14:05 ..
-rwxrwxrwx  1 hts       hts       182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx  2 datamover datamover    122880 Oct 23 13:33 ManyFiles
[hts@Venus Receive]$ chown hts:datamover ./Jmr_Commercial_WithSubtitles.mov 
[hts@Venus Receive]$ ls -la
total 178540
drwxrwxrwx. 3 datamover datamover      4096 Oct 25 07:18 .
drwxrwxrwx. 6 datamover datamover      4096 Oct 14 14:05 ..
-rwxrwxrwx  1 hts       datamover 182693854 Oct 25 07:18 Jmr_Commercial_WithSubtitles.mov
drwxrwxrwx  2 datamover datamover    122880 Oct 23 13:33 ManyFiles
[hts@Venus Receive]$ chown datamover:datamover ./Jmr_Commercial_WithSubtitles.mov 
chown: changing ownership of ‘./Jmr_Commercial_WithSubtitles.mov’: Operation not permitted
[hts@Venus Receive]$ 

将 hts 添加到 datamover 组确实允许我更改组部分的所有权,因此现在对该语句进行部分回答和验证。

答案1

只有 root 才有权更改文件的所有权。相当现代的 Linux 版本提供了这种CAP_CHOWN功能;具有此功能的用户还可以更改任意文件的所有权。CAP_CHOWN是全局的,一旦授予,它适用于本地文件系统中的任何文件。

文件所有者(和 root)可以更改组所有权。但是,这仅限于所有者所属的组。因此,如果用户 U 属于组 A、B 和 C,但不属于组 D,则 U 可以将 U 拥有的任何文件的组更改为 A、B 或 C,但不能更改为 D。如果您寻求任意更改,那么CAP_CHOWN就是要走的路。

警告 CAP_CHOWN具有严重的安全隐患,具有能力的 shell 的用户CAP_CHOWN可以获得 root 权限。 (例如,chown您自己的 libc,修补您的特洛伊木马,chown它返回并等待 root 进程将其拾取。)

由于您想要限制更改某些目录的所有权的能力,因此没有任何可用的工具可以帮助您。相反,您可以编写自己的变体chown来处理预期的限制。该程序需要具有以下功能CAP_CHOWN

setcap cap_chown+ep /usr/local/bin/my_chown

警告 您的程序可能会模仿正版chown,例如my_chownuser:group filename(s)。请务必非常仔细地执行输入验证。检查每个文件是否满足预期的限制,特别是要注意指向越界的软链接。

如果您想限制某些用户访问您的程序,您可以创建一个特殊组,将组所有权设置my_chown为该组,将权限设置为 0750,然后添加允许加入该组的所有用户。或者,您可以使用sudo合适的规则(在这种情况下,您也不需要能力魔法)。如果您需要更大的灵活性,那么您需要将您想到的规则编码到my_chown.

答案2

我也遇到过同样的问题,并且已经在使用 ACL。这可能不适用于您的情况,但就我而言,特定用户具有对目录树的写访问权限,而所有其他用户具有读访问权限,因此我的策略是编写一个小的 setuid 程序来检查调用用户的写访问权限并允许更改其他人的读取权限。

这里有一个讨论这个问题的问题:

如何让用户在不属于他们的目录上设置 ACL?

相关内容