LXC非特权容器绑定宿主机目录nobody
Contents
简介
非特权容器使用了新内核特性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
Proxmox: bind mountpoint from host to unprivileged LXC container 该文章中有一个更简单的方法