Photon OS下Docker user-remap挂载目录权限及提权风险求解
问题原因说明
你遇到的权限问题本质是Docker user remap机制会把容器内的UID/GID偏移映射到宿主机/etc/subuid、/etc/subgid配置的区间,你配置的偏移起点是100000,所以容器内的任意UID在宿主机侧的实际身份都是100000 + 容器内UID,如果宿主机挂载目录的属主/属组没有对这个映射后的ID开放权限,就会出现访问失败。你之前开o+w等于给所有用户开放权限,自然有安全风险。
方案1:仅授权dockremap映射用户访问挂载目录(符合第一个要求)
不需要给目录开全局写入权限,直接调整挂载目录的属主为映射后的UID/GID即可:
- 先确认容器内运行进程的UID:如果容器默认用root运行(user remap后已经是宿主机非root用户),对应宿主机UID就是100000;如果容器内指定了普通用户运行,比如UID为1000,对应宿主机UID为
100000 + 1000 = 101000 - 宿主机侧执行权限配置:
# 替换为你实际的挂载目录路径,以及对应映射后的UID/GID chown -R 100000:100000 /path/to/host/mount/dir # 仅允许属主读写,其他用户无任何权限 chmod -R 700 /path/to/host/mount/dir
该配置下只有dockremap映射的对应容器用户可以访问目录,宿主机其他普通用户无权限,完全规避权限提升风险,Photon OS默认内核支持该配置,无需额外调整。
方案2:替代user remap的安全实现方案(符合第二个要求)
如果不想处理UID映射的计算,可以改用以下方案实现容器非root运行+防提权:
方案2.1 改用Rootless Docker模式
整个Docker守护进程以宿主机普通用户身份运行,天然杜绝守护进程层面的权限逃逸风险,容器默认无法获取宿主机root权限:
- Photon OS侧安装依赖:
tdnf install docker-rootless slirp4netns fuse-overlayfs - 创建用于运行Docker的普通用户(如
dockeruser),切换到该用户执行dockerd-rootless-setuptool.sh install,按照提示配置对应的环境变量即可 - 容器启动时指定
--user <容器内普通用户UID>:<容器内普通用户GID>运行,宿主机挂载目录直接设置属主为dockeruser即可,不需要做UID偏移计算,权限控制更直观
方案2.2 全局强制容器非root运行+禁用提权
保留user remap配置的同时,在Docker daemon层面全局禁止权限提升:
修改/etc/docker/daemon.json添加以下配置:
{ "userns-remap": "default", "no-new-privileges": true }
重启Docker服务后生效,no-new-privileges参数会禁止容器内的SUID/SGID程序执行提权操作,哪怕容器内存在漏洞也无法获取更高权限,挂载目录的权限配置参考方案1即可。
内容的提问来源于stack exchange,提问作者Subhanu Sharma
相关产品推荐
相关产品推荐

