【问题标题】:How creating a non root user by simply setting up a random UID in a container FROM scratch works?如何通过简单地从头开始在容器中设置随机 UID 来创建非 root 用户?
【发布时间】:2019-05-09 11:30:40
【问题描述】:

我正在使用 Docker 设置 Golang 服务器,并且我希望非特权用户在其容器内启动它以确保安全。

这是我使用的简单 Dockerfile。我在容器中导入我的二进制文件并设置一个随机 UID。

FROM scratch
WORKDIR /app
COPY --chown=1001:1001 my-app-binary my-app-binary
USER 1001
CMD ["/app/my-app-binary"]

如果我的服务器监听 443 端口,它不起作用,因为它需要特权。所以我的应用程序按预期由非特权用户运行。

尽管如此,用户 1001 并未正确创建。我看到的教程告诉我在中间“构建器”容器(例如 alpine)中创建用户并从中导入 /etc/passwd。我没有找到任何做我做的事的例子。 (here 我遵循的一个教程)

谁能向我解释为什么我的解决方案有效或我不明白什么?

【问题讨论】:

    标签: docker go dockerfile


    【解决方案1】:

    披露:在我的回答中,我使用了来自 this blog post 的引号。我既不是这篇文章的作者,也不是与作者有任何关系。

    这是预期的 - 容器可以在容器不知道的用户下运行。引用docker run docs:

    root (id = 0) 是容器内的默认用户。图像开发人员可以创建其他用户。这些用户可以通过名称访问。 传递数字 ID 时,用户不必存在于容器中。

    -- https://docs.docker.com/engine/reference/#user

    它可以帮助您解决这样的问题:

    有时,当我们在 Docker 容器中运行构建时,构建会在从主机挂载到容器的文件夹中创建文件(例如源代码目录)。这可能会给我们带来痛苦,因为这些文件将归root 用户所有。当普通用户在准备下一次构建时(例如使用git clean)尝试清理这些文件时,他们会收到错误并且我们的构建失败。

    -- https://medium.com/redbubble/running-a-docker-container-as-a-non-root-user-7d2e00f8ee15#7d3a

    这是可能的,因为:

    幸运的是,docker run 为我们提供了一种方法:the --user parameter。我们将使用它来指定 Docker 应该使用的用户 ID (UID) 和组 ID (GID)。这是因为 Docker 容器都共享相同的内核,因此具有相同的 UID 和 GID 列表,即使容器不知道相关的用户名(稍后会详细介绍)。

    -- https://medium.com/redbubble/running-a-docker-container-as-a-non-root-user-7d2e00f8ee15#b430

    以上内容也适用于USER dockerfile command

    使用容器不知道的 UID 有一些问题:

    您的用户将无需 $HOME

    我们实际上在这里做的是要求我们的 Docker 容器使用它一无所知的用户的 ID 来做事,这会产生一些复杂性。也就是说,这意味着用户错过了一些我们已经学会的东西,只是期望用户拥有 —— 诸如主目录之类的东西。这可能很麻烦,因为这意味着所有存在于 $HOME  中的东西—— 临时文件、应用程序设置、包缓存 —— 现在都无处可去。容器化的过程只是无法知道将它们放在哪里。

    当我们尝试做特定于用户的事情时,这可能会影响我们。我们发现使用gem install(尽管使用Bundler 是可以的)或运行依赖ENV['HOME'] 的代码会导致问题。所以这可能意味着如果你做这些事情,你需要做一些调整。

    你的用户也将是无名的

    事实证明,我们无法在 Docker 主机及其容器之间轻松共享用户名。这就是为什么我们不能只使用docker run --user=$(whoami) — 容器不知道您的用户名。它只能通过其 UID 了解您的用户。

    这意味着当您在容器中运行whoami 时,您将得到类似I have no name! 的结果。这很有趣,但如果您的代码依赖于知道您的用户名,您可能会得到一些令人困惑的结果。

    -- https://medium.com/redbubble/running-a-docker-container-as-a-non-root-user-7d2e00f8ee15#e295

    【讨论】:

    • 很好的答案。谢谢你。同样来自doc:“使用数字 ID 不需要查找,并且不依赖于容器根文件系统内容。”
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2017-12-25
    • 2014-04-02
    • 1970-01-01
    • 2011-09-08
    • 2020-04-14
    • 1970-01-01
    相关资源
    最近更新 更多