问题描述
问题
对于应该以非 root 身份运行的 docker 镜像(基于 alpine),我有两个要求:
FUSE 的 fusermount
命令要求用户在 /etc/passwd
中有一个有效的条目,否则它不会挂载文件系统。鉴于我在构建时不知道用户的 UID/GID,我无法在构建时调用 adduser
。而且我也无法在运行时执行此操作,因为用户没有相应的权限。
找到解决方案
到目前为止,我发现了两个都觉得不合适/不安全的解决方案
1.使 /etc/passwd 可写
将 chmod 555 /etc/passwd
添加到 Dockerfile 时,我可以在运行时执行
echo "someuser:x:${my_uid}:$(id -g)::/tmp:/sbin/nologin" >> /etc/passwd
这完成了 fusermount 的工作。不幸的是,我没有找到在运行时将 passwd 文件改回只读的方法,否则我担心有人可能会滥用它来重新获得 root 权限。虽然我找不到一种简单的方法来使用打开的 passwd 文件进行某些漏洞利用(虽然我能够直接在 /etc/passwd 中为所有用户添加/修改密码和配置,然后通过 login
更改用户,alpine不允许用户 root 这样做(既不是通过 login
也不是通过 su
)。但我想那里有比我更聪明的人,不知何故,整个解决方案感觉就像一个非常肮脏的黑客。任何人都有具体的想法如何使用容器内的可写密码文件来获取容器内的不当权限?
2.用两个额外的环境变量替换需求 #2
通过引入 DUID 和 DGID 作为环境变量并将 USER 设置为 Dockerfile 中一些新添加的非 root 用户,我在 sudo 和 /etc/sudoers 的帮助下找到了一个解决方案:在我用作入口点的启动脚本中,我可以为给定的 DUID/DGID 调用 sudo adduser/addgroup,然后使用通过 sudo -u someuser someprog
指定的用户启动实际程序。
除了整个设置变得非常丑陋之外,我不喜欢我的 docker 镜像的用户无法再使用常规的 docker run --user
选项,因为这会破坏 sudo 配置。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)