【问题标题】:Docker File Non Root User Theory QuestionDocker文件非root用户理论问题
【发布时间】:2020-07-01 07:02:30
【问题描述】:

我今天一直在阅读 uid 1001 背后的理论,特别是在 Docker 中,最好的原则是不要让您的容器以 root 用户身份运行。

到目前为止,对于 unix 系统,我能说的是......

  • root 用户的 UID 为 0 大多数 unix 发行版保留第一个
  • 为100个新用户分配了从500或1000开始的UID
  • 当你 创建一个新帐户,通常会给出下一个最高未使用的帐户 1001 的数量(不确定这与前一个点的关系是什么意思。如果有人可以澄清一下)

我见过很多 Dockerfile 示例,它们只是尝试使用 1001。

USER 1001

两个问题

理论 1001 是否可以安全使用,因为它高于主机上新用户的 uid 分配范围,即点 2?

将用户指定为 1001 是最佳做法还是最好添加一个新用户?

RUN useradd -ms /bin/bash newuser
USER newuser
WORKDIR /home/newuser

谢谢

【问题讨论】:

    标签: docker


    【解决方案1】:

    如果您的容器不需要在命名卷或从主机绑定挂载的目录中写入数据,则容器运行的用户 ID 通常根本不重要。仍然有一些限制(如果您尝试侦听小于 1024 的端口号,您的用户 ID 必须为 0,或者您必须在启动时手动添加功能)。

    我会使用你的第二种形式,除非在 Dockerfile 的 end 之前我不会切换用户。

    FROM python:3.8 # arbitrary choice
    # ... install OS packages ...
    
    # Create the user.  This doesn't need to be repeated if the
    # application code changes.  It is a "system" user without
    # a home directory and a default shell.  We don't care what
    # its numeric user ID is.
    RUN useradd -r newuser
    
    # WORKDIR creates the directory.  It does not need to be
    # under /home.  It should be owned by root.
    WORKDIR /app
    
    # Copy the application in and do its installation, still as root.
    COPY requirements.txt .
    RUN pip3 install -r requirements.txt
    COPY . .
    
    # Switch USER only at the end of the file.
    USER newuser
    CMD ["./app.py"]
    

    “主目录”在 Docker 中通常不是一个定义明确的概念;我在这里创建了没有特定主目录的用户,并且应用程序目录不在普通的 Linux /home 目录下。同样,我也没有特意为这个用户指定一个 shell 或专门使用 GNU bash。

    此设置的一个重要安全点是root 拥有应用程序文件,但newuser 正在运行代码。如果存在某种妥协,这将为您提供额外的保护层:受感染的应用程序代码无法覆盖应用程序代码或其固定的静态数据。


    我一开始就警告说,如果您不需要在文件系统中持久保存数据,这可以正常工作。如果是这样,它需要有一定的适应性,这可能意味着以 root 身份启动,然后放弃特权。我支持两种运行模式:

    1. 容器最初以一个完全空的目录启动,可能由 root 拥有(一个命名的 Docker 卷;一个 Kubernetes 命名的卷)。在这种情况下,创建您需要的数据目录,并使其在 Dockerfile 中归用户所有。

      docker run -v somevolume:/data myimage
      
    2. 容器以绑定挂载的主机目录和-u 选项启动,用于命名要使用的主机用户 ID。

      docker run -u $(id -u) "$PWD/data:data" myimage
      

    您需要使用入口点包装脚本来检测您所处的情况,创建初始存储结构,设置其权限,并在需要时切换到非 root 用户。有一些轻量级的工具,例如 gosusu-exec 专门支持这种情况。 Docker Hub consul 镜像的入口点脚本有 an example of doing this at startup time

    【讨论】:

    • 谢谢。触及了一些有趣的东西,我已经离开并做了更多的研究。
    猜你喜欢
    • 2021-12-24
    • 2017-07-03
    • 1970-01-01
    • 2023-03-03
    • 2019-04-22
    • 2018-01-30
    • 2018-07-06
    • 2020-02-10
    • 1970-01-01
    相关资源
    最近更新 更多