Debian 更改无人的所有者:nogroup

Debian 更改无人的所有者:nogroup

如何使用 nobody:nogroup 更改目录的所有权?我尝试的所有操作都以“不允许操作”结束。

cat /etc/debian_version
    10.2


root@torrent:/srv# chown -R rtorrent:rtorrent rtorrent 
chown: cannot read directory 'rtorrent/.local/share': Permission denied
chown: changing ownership of 'rtorrent/.local': Operation not permitted
chown: changing ownership of 'rtorrent/.bash_history': Operation not permitted
chown: changing ownership of 'rtorrent/session/rtorrent.dht_cache': Operation not permitted
chown: changing ownership of 'rtorrent/session': Operation not permitted
chown: changing ownership of 'rtorrent/.rtorrent.rc': Operation not permitted
chown: changing ownership of 'rtorrent/download': Operation not permitted
chown: changing ownership of 'rtorrent/watch': Operation not permitted
chown: changing ownership of 'rtorrent': Operation not permitted

rm -r download/
rm: cannot remove 'download/': Permission denied
root@torrent:/srv/rtorrent# ls -al
total 32
drwxr-xr-x 6 nobody nogroup 4096 Jan 24 18:16 .
drwxr-xr-x 3 root   root    4096 Jan 24 16:46 ..
-rw------- 1 nobody nogroup   47 Jan 24 18:16 .bash_history
drwxr-xr-x 3 nobody nogroup 4096 Jan 24 18:15 .local
-rw-r--r-- 1 nobody nogroup 3224 Jan 24 18:16 .rtorrent.rc
drwxr-xr-x 2 nobody nogroup 4096 Jan 24 16:46 download
drwxr-xr-x 2 nobody nogroup 4096 Jan 24 18:21 session
drwxr-xr-x 2 nobody nogroup 4096 Jan 24 16:46 watch

答案1

您的容器似乎作为用户(无根)容器运行,构建于用户命名空间

为了工作,用户容器有一个关联的uid/吉德映射到转换主机uid/吉德到容器uid/吉德。这些的总体主机范围是 2^32 宽(从 0 开始是真实的)用户)。由此看来,容器的分配范围通常保持在2^16(这与历史兼容)uid范围)。

任意主机uid没有范围转换为uid容器内将显示为没有人(分别:无组为了吉德)在用户容器内。正如这个容器的对此类产品没有任何权利uid,它无法更改它,并且操作会像普通用户运行时一样失败。

以下是 Proxmox 描述您问题的链接:

https://pve.proxmox.com/wiki/Unprivileged_LXC_containers

然而,您很快就会意识到每个文件和目录都将映射到“nobody”(uid 65534),只要满足以下条件就可以

  • 您没有设置受限权限(仅限组/用户可读文件或访问目录),并且
  • 您不想使用特定的 uid/gid 写入文件,因为所有文件都将使用高映射(100000+)uid 创建。

有专门用于转换这些范围的工具,因此可以将准备好的系统树布局转移到适合目标容器的范围。这些工具必须从主机运行(或者至少在“递归”容器的情况下,容器“生成”用户命名空间)。例如:

https://github.com/jirutka/uidmapshift

这是显然已经不存在的项目 nsexec 的 uidmapshift 的重新实现:

https://github.com/fcicq/nsexec

您当然可以通过计算正确的目标来手动执行此操作uid吉德并使用chown(来自主机)。如果有一个值和一个简单的映射,那应该很容易。这是一个示例(使用正在运行的用户 LXC 容器):

容器(称为巴斯特-amd64):

user@buster-amd64:~$ ls -n test
-rw-r--r--. 1 65534 65534 0 Jan 24 21:09 test

root@buster-amd64:/home/user# chown user:user test
chown: changing ownership of 'test': Operation not permitted

主机(显示相同文件):

user@host:~$ ls -n ~/.local/share/lxc/buster-amd64/rootfs/home/user/test
-rw-r--r--. 1 1000 1000 0 Jan 24 22:09 /home/user/.local/share/lxc/buster-amd64/rootfs/home/user/test

下面的命令获取 init 进程'PID(容器中为 1,但这里PID在容器中运行的值(在主机上看到的值)(容器的任何其他进程也可以工作):

user@host:~$ lxc-info -Hpn buster-amd64
22926
user@host:~$ cat /proc/22926/uid_map 
         0    1410720      65536

该映射应该已在 LXC 配置中定义:

user@host:~$ grep lxc.idmap ~/.local/share/lxc/buster-amd64/config 
lxc.idmap = u 0 1410720 65536
lxc.idmap = g 0 1410720 65536

如果用户容器的uid是1000并且文件/目录应该属于该用户,那么新主机的uid应该是1410720 + 1000 = 1411720

在主机上,这次是(真实的)用户:

root@host:~# chown 1411720:1411720 ~user/.local/share/lxc/buster-amd64/rootfs/home/user/test 

如果容器的文件系统没有直接安装在主机文件系统上的某个位置(例如:使用 LVM 后备存储或 tmpfs 安装),因此无法访问,这也适用于正在运行的容器(并且应该是首选):

root@host:~# chown 1411720:1411720 /proc/22926/root/home/user/test

现在在容器上:

user@buster-amd64:~$ ls -n test
-rw-r--r--. 1 1000 1000 0 Jan 24 21:09 test

还有它的用户现在拥有该文件的权限,因为它位于正确的位置uid/吉德映射。

root@buster-amd64:~# chown root:root ~user/test
root@buster-amd64:~# 

内核方面正在进行一项工作,其功能称为移位文件系统仍然是改变形式通过绑定安装进行此转换来帮助缓解这些问题。

相关内容