如何授予特定用户更改特定目录内文件和目录的用户和组所有权的权利?
我用谷歌搜索了一下,发现有这样的东西setfacl
,它允许授予用户更改文件和目录权限的特定权限。但据我了解,此命令不允许授予 chown 权限。
所以,假设一个文件有
user1 user1 theFile1
user1 user1 theDirectory1
发出以下命令将失败。
[user1@THEcomputer]$ chown user2 theFile
我确实拥有计算机的 root 访问权限。有没有办法授予用户chown
在目录内发出命令?
更新:如何将用户添加到组。
这里是文章我曾经添加datamover
到hts
组中。
[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_chown
user:group filename(s)
。请务必非常仔细地执行输入验证。检查每个文件是否满足预期的限制,特别是要注意指向越界的软链接。
如果您想限制某些用户访问您的程序,您可以创建一个特殊组,将组所有权设置my_chown
为该组,将权限设置为 0750,然后添加允许加入该组的所有用户。或者,您可以使用sudo
合适的规则(在这种情况下,您也不需要能力魔法)。如果您需要更大的灵活性,那么您需要将您想到的规则编码到my_chown
.
答案2
我也遇到过同样的问题,并且已经在使用 ACL。这可能不适用于您的情况,但就我而言,特定用户具有对目录树的写访问权限,而所有其他用户具有读访问权限,因此我的策略是编写一个小的 setuid 程序来检查调用用户的写访问权限并允许更改其他人的读取权限。
这里有一个讨论这个问题的问题: