如何在Docker中以任意非root用户运行需root权限的update-ca-certificates脚本
非root用户容器执行update-ca-certificates权限问题
当前现状
- 我有一个基于openSUSE构建的Docker基础镜像,其他镜像均基于该镜像构建
- 该基础镜像运行时会执行若干启动脚本,脚本中包含命令
update-ca-certificates update-ca-certificates会写入root所有的目录/var/lib/ca-certificates,同时会对该目录执行chmod操作,而chmod仅能由目录所有者执行,因此update-ca-certificates默认必须以root身份运行
需求
- 容器运行时执行的启动脚本需支持以任意非root用户运行
- 该任意非root用户可通过Dockerfile中的
USER指令或docker run传入的--user=xxx:yyy参数指定
已尝试的方案
方案1:配置sudo免密执行
在基础镜像的/etc/sudoers.d下添加如下配置,允许任意用户免密执行目标命令:
ALL ALL=(ALL) NOPASSWD: /usr/sbin/update-ca-certificates
之后修改启动脚本,在命令前添加sudo前缀:
sudo update-ca-certificates
存在问题:
sudo校验权限时需要从passwd文件解析uid对应用户名,匿名用户、域用户这类不存在于容器passwd文件中的用户执行时会报错:
sudo: unknown uid xxx: who are you?
方案2:设置setuid权限位
利用setuid权限位使程序运行时继承所有者(root)的有效用户ID,操作如下:
chmod u+s /usr/sbin/update-ca-certificates /usr/sbin/update-ca-certificates
存在问题:
setuid仅对二进制可执行文件生效,update-ca-certificates本身是shell脚本,会忽略setuid位。即使将其封装为二进制程序,也存在较高安全风险。
方案3:放开目标目录权限
构建镜像时临时放开/var/lib/ca-certificates目录权限,允许任意用户写入:
RUN chmod -R ugo+rwx /var/lib/ca-certificates
存在问题:
该配置仅在update-ca-certificates执行chmod操作前生效,chmod只能由目录所有者(root)执行,运行时会报错:
p11-kit: couldn't set directory permissions: /var/lib/ca-certificates/openssl: Operation not permitted
方案4:运行时变更目录所有者
尝试临时变更/var/lib/ca-certificates目录的所有者为当前运行用户,但构建基础镜像时无法预知运行时的具体用户,该方案无法落地:
RUN sudo chown -R <DON'T KNOW THE USER YET?> /var/lib/ca-certificates
内容的提问来源于stack exchange,提问作者rmf
相关产品推荐
相关产品推荐

