假设我有:
user1111
有ID的用户1111
user2222
有ID的用户2222
- 具有上述两个用户所属
group3333
ID 的组3333
我创建:
- 与
user1111
, 文件夹a
- 与
user1111
, 一个文件a/b
- 与
user2222
, 一个文件a/c
该文件夹和两个文件都有 777 权限:
$ stat --printf='%a %u %g %n\n' a a/b a/c
777 1111 1111 a
777 1111 3333 a/b
777 2222 3333 a/c
我理解不允许这样做的含义是user1111
:
user1111$ chown -v 2222 a/b
chown: changing ownership of 'a/b': Operation not permitted
failed to change ownership of 'a/b' from user1111 to 2222
即不允许用户这样做是可以的分配所有权归其他用户。
我不明白为什么这是不允许的:
user2222$ chown -v 2222 a/b
chown: changing ownership of 'a/b': Operation not permitted
failed to change ownership of 'a/b' from user1111 to 2222
即为什么用户不能拿其他用户的所有权?
编辑以添加 @binarysta 的更多信息:
user1111$ chown -v user2222: a/b
chown: changing ownership of 'a/b': Operation not permitted
failed to change ownership of 'a/b' from user1111:group3333 to user2222:group2222
user1111$ chown -v user2222:group3333 a/b
chown: changing ownership of 'a/b': Operation not permitted
failed to change ownership of 'a/b' from user1111:group3333 to user2222:group3333
user2222$ chown -v user2222: a/b
chown: changing ownership of 'a/b': Operation not permitted
failed to change ownership of 'a/b' from user1111:group3333 to user2222:group2222
user2222$ chown -v user2222:group3333 a/b
chown: changing ownership of 'a/b': Operation not permitted
failed to change ownership of 'a/b' from user1111:group3333 to user2222:group3333
答案1
只有 root 可以更改文件的所有者。所有者无法转让所有权,除非所有者是
root
或用于sudo
运行该命令。文件的所有者可以更改文件的所属组(如果文件所有者属于该组)。文件的所属组可以通过 更改
root
为任何组。除所有者之外的所属组的成员无法更改文件的所属组。
setuid :当设置了可执行文件的 setuid 权限时,用户可以使用与用户匹配的访问级别来执行该程序拥有该文件。
能够使用非特权用户更改文件的所有权可能会导致许多安全问题,例如:
- 用户可以为可执行脚本设置uid,然后将所有权更改为root,在这种情况下,脚本将以root权限执行。
- 通过更改所有权,就无法追踪谁真正创建了文件。
- 如果为每个用户定义了配额,可能会导致磁盘配额问题。
- 只有文件的所有者才能更改权限/元数据 (
chmod
)
答案2
只有root
具有该功能的进程CAP_CHOWN
才能更改文件所有者(请参阅参考资料man capabilities
)。
但是您可以使用 ACL 为某些用户或组设置特殊权限(请参阅 参考资料man setfacl
)。
使用 NFSv4 ACL,您甚至可以授予非所有者用户或组更改 ACL 的权限(通常仅限于 root、文件所有者和带有 的进程CAP_FOWNER
),请参阅man nfs4_acl
。