You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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身份运行

需求

  1. 容器运行时执行的启动脚本需支持以任意非root用户运行
  2. 该任意非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 06:06:04