Contents

LXC非特权容器绑定宿主机目录nobody

简介

非特权容器使用了新内核特性user namespaces。所有的容器内部 UID(用户 ID)和 GID(组 ID)都被映射到了与宿主机上不同的ID,通常 root(UID 0)变成了 100000,1 变成了 100001,以此类推。这意味着那些容器中的大多数安全问题(容器逃逸,资源滥用等)将会影响到一个宿主机上随机的非特权用户,即使容器本身以 root 用户身份执行,一定程度上不会对宿主机造成危害,如何有问题也会成为一个通用的内核安全漏洞,LXC 团队认为,通过设计,非特权容器是安全的。

从理论上讲,非特权容器应该无需任何更改即可正常运行,与特权容器没有任何区别。他们的高 UID 映射 ID 将在主机机器的工具(ps,top 等)中显示。

问题

非特权容器挂载宿主机上的目录时,如果目录的权限设置不合理,可能会导致容器内部用户无法访问宿主机上的文件。

例如将宿主机的/mnt/sda挂载到容器的/mnt/sda

容器内查看每一个文件和目录都被映射成nobody (uid 65534),创建文件和文件夹提示无权限

root@BaseServices:/mnt/sda# ls -l
total 0
drwxr-xr-x 2 nobody nogroup  6 Oct 17 06:09 ebooks
drwxr-xr-x 2 nobody nogroup  6 Mar 30  2023 images
drwxr-xr-x 6 nobody nogroup 57 Feb 24  2023 jellyfin
drwxr-xr-x 2 nobody nogroup 45 Feb 19  2023 phone
drwxr-xr-x 3 nobody nogroup 40 Oct 17 05:57 projects

root@BaseServices:/mnt/sda# touch test.txt
touch: cannot touch 'test.txt': Permission denied

解决方式

先在宿主机创建用户和用户组sdisk

root@pve:~# useradd sdisk

查看sdisk用户的UID和GID

root@pve:~# id sdisk
uid=1000(sdisk) gid=1000(sdisk) groups=1000(sdisk)

将需要映射到宿主机的目录权限修改为sdisk

root@pve:~# chown -R sdisk:sdisk /mnt/sda
root@pve:~# ls -l /mnt/sda
total 0
drwxr-xr-x 2 sdisk sdisk  6 Oct 17 14:09 ebooks
drwxr-xr-x 2 sdisk sdisk  6 Mar 30  2023 images
drwxr-xr-x 6 sdisk sdisk 57 Feb 24  2023 jellyfin
drwxr-xr-x 2 sdisk sdisk 45 Feb 19  2023 phone
drwxr-xr-x 3 sdisk sdisk 40 Oct 17 13:57 projects

修改容器配置,将容器内部的root用户映射到宿主机的sdisk用户

root@pve:~# vim /etc/pve/lxc/110.conf

添加如下内容:

# uid map: 将容器的用户uid 0到1000,映射到宿主机的10000到101000,0..1000 (ct) → 100000..101000 (host)
lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
# 1000 (ct)1000 (host)
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
# 1001..65535 (ct) → 101001..165535 (host)
lxc.idmap = u 1001 101001 64535
lxc.idmap = g 1001 101001 64535

允许LXC守护进程在宿主机上使用1000这个用户的资源,(更多信息)

echo "root:1000:1" >> /etc/subuid
echo "root:1000:1" >> /etc/subgid

重启容器,查看权限

root@BaseServices:~# ls -l /mnt/sda/
total 0
drwxr-xr-x 4 1000 1000 28 Nov  1 03:42 ebooks
drwxr-xr-x 2 1000 1000  6 Mar 30  2023 images
drwxr-xr-x 6 1000 1000 57 Feb 24  2023 jellyfin
drwxr-xr-x 2 1000 1000 45 Feb 19  2023 phone
drwxr-xr-x 3 1000 1000 40 Oct 17 05:57 projects

Refer

Unprivileged LXC containers

Proxmox: bind mountpoint from host to unprivileged LXC container 该文章中有一个更简单的方法