如何在没有 sudo 的情况下将文件 chown 到 subuid

Tec*_*aos 6 linux uid chown user-permissions

基本上,这里发生了什么,我不明白什么?

我为我的用户设置了一组 subuid。我想将文件 chown 到特定的 subuid,这是该用户分配的一部分

administrator@host:/home/administrator$ cat /etc/subuid
root:100000:65536
administrator:165536:65536
administrator:1000000:9000001

administrator@host:/home/administrator$ cat /etc/subgid
root:100000:65536
administrator:165536:65536
administrator:1000000:9000001
Run Code Online (Sandbox Code Playgroud)

尽管此 subuid 是分配的一部分,但尝试 chown 此文件失败。

administrator@host:/home/administrator$ ls -lhat
...
-rw-rw-r-- 1 administrator administrator  229 Aug  2 13:00 file
drwxrwxr-x 7 administrator administrator 4.0K Aug  2 13:00 ..

administrator@host:/home/administrator$ chown 1500000:1500000 file
chown: changing ownership of 'file': Operation not permitted

administrator@host:/home/administrator$ stat file
  File: file
  Size: 229             Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 658357      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/administrator)   Gid: ( 1004/administrator)
Access: 2018-08-02 13:00:36.529197108 +0000
Modify: 2018-08-02 13:00:36.529197108 +0000
Change: 2018-08-02 13:00:36.529197108 +0000
 Birth: -
administrator@host:/home/administrator$
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 sudo 来删除它,我可以以用户身份删除该文件 - 但是当我这样做时它显示为写保护文件。这表明我实际上有权使用此 subuid 修改文件。

administrator@host:~$ touch file
administrator@host:~$ chown 1500000:1500000 file
chown: changing ownership of 'file': Operation not permitted

administrator@host:~$ sudo chown 1500000:1500000 file    
administrator@host:~$ rm file
rm: remove write-protected regular empty file 'testfile.txt'?
administrator@host:~$
Run Code Online (Sandbox Code Playgroud)

谁能解释这里发生的内部工作原理?我可能在某处误解了一些基本的东西。我不能将其标记为 subuid,因为没有足够的代表,所以我将使用 uid。

谢谢!

Lac*_*cek 11

Subuid 并不意味着按照您期望的方式工作。它们旨在将用户命名空间中的 UID 映射到该命名空间之外的不同 UID,这对于容器来说非常方便(并且实际上是为容器设计的)。

但是,一个进程仍然只能有一个 UID 集(用户命名空间),并且出于明显的安全原因,不允许用户更改文件的所有权。就进程本身而言,如果用户实际上是命名空间之外的其他人,这并不重要。

这就是chown命令失败的原因:如果命名空间不同,您是否可以拥有其他 UID并不重要,此时您没有该 UID,因此,您无法更改任何 UID文件(因为你不是 root)。

至于为什么可以删除文件:它实际上与 subuids 无关,相反,这完全取决于您拥有文件所在目录的所有权。由于文件删除更改的是目录,而不是文件本身,如果您可以写入目录,也可以从中删除任何文件(“粘性”目录除外)。


小智 6

有一个程序lxc-usernsexec随附lxc。这允许您使用地图/etc/subuid/etc/subgid.

具体来说,您可以执行以下操作。

  1. lxc-usernsexec -- touch /tmp/test
  2. ls -l /tmp/test 将显示该文件是 owner:group,与地图中的第一个 subuid:subgid 对相同。
  3. rm /tmp/test 应该给出错误,因为您目前没有正确的 uid/gid。
  4. lxc-usernsexec -- rm /tmp/test 应该删除文件。

希望这可以帮助!以上可能需要为非特权 LXC 容器使用进行各种设置。特别是,我认为/proc/sys/kernel/unprivileged_userns_clone应该是1。


小智 5

作为对 @Kapil 答案的补充,并且由于如果您不是 root 可能很难安装其他工具,因此您还可以使用podman unshare(随 Podman 附带)或rootlesskit(随 Rootless Docker 附带)作为lxc-usernsexec(随 LXC 附带)的替代品。