如何解决以非 root 用户身份运行需要 root 的脚本?
现状
我有一个基础 docker 镜像(构建在 opensuse 上),其他镜像也构建在该镜像之上。
基础镜像在运行时运行一些启动脚本。
启动脚本运行的命令之一是:
update-ca-certificates
update-ca-certificates
写入以下属于 root 的目录:
/var/lib/ca-certificates
update-ca-certificates
还会在目录上调用 chmod
,因为 chmod
只能以目录的所有者身份运行,这意味着 update-ca-certificates
必须以 root 身份运行:
https://github.com/p11-glue/p11-kit/blob/master/trust/save.c#L614
要求
-
容器在运行时执行的启动脚本应该能够以任意非 root 用户身份运行。
-
这个任意的非 root 用户应该能够由 dockerfile 中的
USER
指令或传递给--user=xxx:yyy
的docker run
标志提供
尝试了什么
选项 1:sudo
尝试的第一件事是将任何用户都可以使用 sudo 运行的有限数量的命令引入基本映像,这将允许非 root 用户运行启动脚本。
例如,将以下文件添加到 /etc/sudoers.d:
ALL ALL=(ALL) NOPASSWD: /usr/sbin/update-ca-certificates
然后更新启动脚本以将 sudo 添加到命令中:
sudo update-ca-certificates
选项 1 的问题:
sudo 检查 passwd 文件,将 uid 解析为用户名进行权限检查,因此用户需要先存在于容器中。此选项不适用于匿名用户或域用户,因为它们不存在于 passwd 文件中。看到以下错误:
sudo: unknown uid xxx: who are you?
选项 2:setuid
setuid 权限位告诉 Linux 使用所有者(root)而不是执行者的有效用户 ID 运行程序。
如果我们使用 setuid 标志运行 /usr/sbin/update-ca-certificates
,它可能会起作用。类似的东西:
chmod u+s /usr/sbin/update-ca-certificates
/usr/sbin/update-ca-certificates
选项 2 的问题:
setuid 仅适用于可执行文件,shell 脚本(例如 update-ca-certificates
)忽略 setuid 位。
我们可以将 update-ca-certificates
包装在一个二进制文件中,如下所述:
https://unix.stackexchange.com/a/369
然而,正如上述帖子的评论所述,这可能是一种不安全的方法。
选项 3:临时开放 /var/lib/ca-certificates
目录的权限
接下来尝试的是打开 /var/lib/ca-certificates
目录上的权限(临时),以便任何用户都可以写入它们。类似的东西:
RUN chmod -R ugo+rwx /var/lib/ca-certificates
选项 3 的问题:
选项 3 仅适用于 update-ca-certificates
在目录上调用 chmod
的点:
https://github.com/p11-glue/p11-kit/blob/master/trust/save.c#L614
由于 chmod
只能由目录的所有者(root)运行,因此出现以下错误:
p11-kit: couldn't set directory permissions: /var/lib/ca-certificates/openssl: Operation not permitted
选项 4:临时更改 /var/lib/ca-certificates
目录的所有者
继选项 3 的问题之后,我想看看是否可以临时更改 /var/lib/ca-certificates
目录的所有者。
但是,我认为这是不可能的,因为在构建时基本映像不会知道任意的非 root 用户:
RUN sudo chown -R <DON'T KNOW THE USER YET?> /var/lib/ca-certificates
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。