据我理解,docker设置所需的cgroup和命名空间的so容器(即容器进程),独立运行(主机系统上的隔离环境),并且对主机系统有有限的权限和访问权限。因此,即使进程在容器中以根用户身份运行,它也不会在主机系统上具有根访问权限。
但是,从本文:processes-in-containers-should-not-run-as-root中,我看到作为根用户运行的容器进程仍然有可能访问主机文件,这些文件只有主机系统上的根用户才能访问。
关于东道系统:
root@srv:/root# ls -l
total 4
-rw------- 1 root root 17 Sep 26 20:29 secrets.txtDockerfile -
FROM debian:stretch
CMD ["cat", "/tmp/secrets.txt"]在运行上述Dockerfile的相应图像时,
marc@srv:~$ docker run -v /root/secrets.txt:/tmp/secrets.txt <img>
top secret stuff如果,top secret stuff是可读的,它是如何可能的。那么容器隔离的意义是什么。我错过了什么,似乎还有更多的东西我错过了。
(这与我如何使用docker run有关,默认情况下是基于运行docker run命令的用户赋予容器的所有权限/功能。
发布于 2021-11-13 15:49:23
容器只能访问主机文件系统,前提是操作员显式地给予它访问权限。例如,尝试不使用任何docker run -v选项
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命令的人都可以很小地根治整个主机。
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拥有,因此它们不能意外地被覆盖。
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文件中。
docker run \
-v "$PWD:/app/data" \ # bind-mount the current directory as data
-u $(id -u) \ # specify the user ID to use
...https://stackoverflow.com/questions/69954423
复制相似问题