首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker(容器)cgroup/命名空间设置与以root用户身份运行Dockerfile命令的比较?

Docker(容器)cgroup/命名空间设置与以root用户身份运行Dockerfile命令的比较?
EN

Stack Overflow用户
提问于 2021-11-13 12:51:12
回答 1查看 532关注 0票数 0

据我理解,docker设置所需的cgroup和命名空间的so容器(即容器进程),独立运行(主机系统上的隔离环境),并且对主机系统有有限的权限和访问权限。因此,即使进程在容器中以根用户身份运行,它也不会在主机系统上具有根访问权限。

但是,从本文:processes-in-containers-should-not-run-as-root中,我看到作为根用户运行的容器进程仍然有可能访问主机文件,这些文件只有主机系统上的根用户才能访问。

关于东道系统:

代码语言:javascript
复制
root@srv:/root# ls -l
total 4
-rw------- 1 root root 17 Sep 26 20:29 secrets.txt

Dockerfile -

代码语言:javascript
复制
FROM debian:stretch
CMD ["cat", "/tmp/secrets.txt"]

在运行上述Dockerfile的相应图像时,

代码语言:javascript
复制
marc@srv:~$ docker run -v /root/secrets.txt:/tmp/secrets.txt <img>
top secret stuff

如果,top secret stuff是可读的,它是如何可能的。那么容器隔离的意义是什么。我错过了什么,似乎还有更多的东西我错过了。

(这与我如何使用docker run有关,默认情况下是基于运行docker run命令的用户赋予容器的所有权限/功能。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-13 15:49:23

容器只能访问主机文件系统,前提是操作员显式地给予它访问权限。例如,尝试不使用任何docker run -v选项

代码语言:javascript
复制
docker run        \
  --rm            \  # clean up the container when done
  -u root         \  # explicitly request root user
  busybox         \  # image to run
  cat /etc/shadow    # dumps the _container's_ password file

更普遍的情况是,如果文件从主机绑定到容器中,则如果容器的数字用户或组ID与文件的所有权和权限匹配,则规则(在本机Linux上没有重新映射用户名称空间)是可以访问的。如果一个文件在模式0600的主机上为uid 1000所拥有,则可以通过容器中的uid 0或1000读取它,而不管相应的容器和主机用户的名称如何。

由此得出的结论是,任何能够运行任何docker run命令的人都可以很小地根治整个主机。

代码语言:javascript
复制
docker run             \
  --rm                 \
  -u root              \
  -v /:/host           \  # bind-mount the host filesystem into the container
  busybox              \
  cat /host/etc/shadow    # dumps the host's encrypted password file

容器中的根用户进一步受到Linux功能的限制:如果不提供特殊的附加Docker选项,即使以root方式运行,容器也不能更改文件系统挂载、修改网络配置、加载内核模块、重新启动主机或做其他一些额外的特权操作。(通常在容器之外做这些事情要比给予Docker更多的权限好;不要随意运行containers --privileged。)

作为非根用户运行容器仍然是更好的实践。用户ID不需要匹配任何用户ID,特别是,它只需要不是0(匹配特定的主机uid不能跨主机移植,也不推荐)。容器中的文件通常应该由root拥有,因此它们不能意外地被覆盖。

代码语言:javascript
复制
FROM debian

# Create the non-root user
RUN adduser --system --no-create-home nonroot

# Do the normal installation, as root
COPY ...  # no --chown option
RUN ...   # does not run chown either

# Specify the non-root user only for the final container
EXPOSE 12345
USER nonroot
CMD the main container command

如果容器确实需要读取或(特别是)写入主机文件,则将主机目录绑定到容器中特定于数据的目录(不要用此挂载覆盖应用程序代码),并使用docker run -u选项指定容器需要运行的主机uid。用户不需要具体地存在于容器的/etc/passwd文件中。

代码语言:javascript
复制
docker run            \
  -v "$PWD:/app/data" \  # bind-mount the current directory as data
  -u $(id -u)         \  # specify the user ID to use
  ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69954423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档