如何使用 docker 的 --user 选项将 uid 设置安全地添加到 docker 容器的 /etc/passwd 中 1.使 /etc/passwd 可写2.用两个额外的环境变量替换需求 #2

问题描述

问题

对于应该以非 root 身份运行的 docker 镜像(基于 alpine),我有两个要求:

  1. 我必须在 docker 容器内挂载 FUSE 文件系统
  2. docker 镜像的用户可以设置 docker 的 UID/GID 用户docker run --user {uid}:{gid}

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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...