Docker 容器中的用户和文件权限配置(docker-compose version 3)
User and file permission configuration in Docker containers (docker-compose version 3)
Docker states 它的容器是
"...by default, quite secure; especially if you take care of running your processes inside the
containers as non-privileged users (i.e., non-root)"
因此,我尝试:
- 使用适当处理用户执行的官方图像
- 避免在生产环境中挂载主机卷,而是使用
COPY
当我 COPY
将代码和配置文件添加到我的容器卷时,所有目录和文件都创建为“...UID 和 GID 为 0”(root 所有权),如文档 here.
问题:
如果文件和目录归 root 所有,但 运行 进程归非 root 用户所有,例如 www-data
,是否仍然存在安全风险?例如,使用 php-fpm:
root@7bf71145c18c:/var/www/html# ls -l
total 1220
-rw-rw-r-- 1 root root 5931 May 10 12:28 index.php
drwxrwxr-x 3 root root 4096 May 10 12:28 logs
-rw-rw-r-- 1 root root 28 May 10 12:28 robots.txt
root@7bf71145c18c:/var/www/html# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:14 ? 00:00:00 php-fpm: master process (/usr/lo
www-data 5 1 0 14:14 ? 00:00:00 php-fpm: pool www
www-data 6 1 0 14:14 ? 00:00:00 php-fpm: pool www
root 7 0 0 14:19 ? 00:00:00 bash
root 12 7 0 14:19 ? 00:00:00 ps -ef
如果是这样,我想知道如何(以及在哪里)正确 chown
和 chmod
我的文件。根据我的研究,如果您使用 docker-compose,这似乎就不那么简单了,而我是 - 我正在使用 docker-compose YAML 文件(第 3 版)与容器特定Docker个文件。似乎当我 chown
在容器的 Docker 文件末尾时,更改不会生效 - 可能是因为卷(在 docker-[=54 中定义=]) 是之后创建的。以下是两种配置的一些片段:
docker-compose.yml:
version: '3'
services:
fpm:
build: ./fpm
container_name: "fpm"
volumes:
- data_volume:/var/www/html
ports:
- "9000"
restart: always
volumes:
data_volume:
./fpm Docker文件:
FROM php:7-fpm
RUN mkdir -p /var/www/html/
COPY . /var/www/html/
RUN find /var -exec chown www-data:www-data {} \;
RUN find /var -type d -exec chmod 755 {} \;
RUN find /var -type f -exec chmod 644 {} \;
使用不同的 docker-compose 版本,很难对围绕该主题的各种网络文章、错误修复和功能请求进行分类。我希望在这里得到一些明确的 direction/answers,面向 docker-compose 版本 3.
docker 中的命名卷在其装载点被初始化为映像的内容。之后,除非该卷完全为空,否则该初始化步骤永远不会再 运行 以避免数据丢失。
因此,当您首次创建指向 /var/www/html
的 data_volume
时,它会获得该目录的副本,包括文件权限。但是,除非您删除或清空 data_volume
,否则您对 Dockerfile 所做的任何更改都只会更新图像,并且该卷将用该卷的内容覆盖该目录。
如果您不需要 data_volume
的内容,您可以 docker-compose down -v
删除容器 和 卷。然后,当您再次 运行 docker-compose up -d
时,将使用具有新权限的文件创建卷。
如果您确实需要保留 data_volume
的内容,那么您可以挂载该卷并在卷本身上 运行 命令:
docker run -it --rm -v $(basename $(pwd))_data_volume:/var/www/html busybox
以上假定您与 docker-compose.yml 位于同一文件夹中,并且该目录全部为小写字符。否则,将 $(basename $(pwd))_data_volume
替换为 docker volume ls
中显示的卷名。从上述容器内部,您可以 运行 您的 find
命令来更新所有权和权限。
Question: Are there still security risks if the files and directories
are owned by root but the running process is owned by a non-root user,
like www-data?
不是真的。您可能只需要确保 php-fpm 具有对这些文件的读取权限。
您正在将 /var/www/html
的内容复制到映像中并在构建时设置 ownership/permissions (Dockerfile)。还行吧。这是创建图像的常见用例。
但是您的 docker-compose.yml
将 data_volume
装载到 运行 容器中,替换了映像中的 /var/www/html
。因此,该目录中的任何内容都将被隐藏。相反,您将看到已安装卷的内容。
您可能想要选择保存容器数据所需的策略。在大多数情况下,在构建时填充 /var/www/html
可能没问题。但是,如果您的应用程序将数据写入该目录中的某处,那么您可能会考虑更改该路径。当容器被销毁时,写入到挂载卷之外的任何数据都将丢失。因此,请确保您的应用程序写入一个目录,该目录作为卷从 docker-compose.yml
.
挂载
Docker states 它的容器是
"...by default, quite secure; especially if you take care of running your processes inside the containers as non-privileged users (i.e., non-root)"
因此,我尝试:
- 使用适当处理用户执行的官方图像
- 避免在生产环境中挂载主机卷,而是使用
COPY
当我 COPY
将代码和配置文件添加到我的容器卷时,所有目录和文件都创建为“...UID 和 GID 为 0”(root 所有权),如文档 here.
问题:
如果文件和目录归 root 所有,但 运行 进程归非 root 用户所有,例如 www-data
,是否仍然存在安全风险?例如,使用 php-fpm:
root@7bf71145c18c:/var/www/html# ls -l
total 1220
-rw-rw-r-- 1 root root 5931 May 10 12:28 index.php
drwxrwxr-x 3 root root 4096 May 10 12:28 logs
-rw-rw-r-- 1 root root 28 May 10 12:28 robots.txt
root@7bf71145c18c:/var/www/html# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:14 ? 00:00:00 php-fpm: master process (/usr/lo
www-data 5 1 0 14:14 ? 00:00:00 php-fpm: pool www
www-data 6 1 0 14:14 ? 00:00:00 php-fpm: pool www
root 7 0 0 14:19 ? 00:00:00 bash
root 12 7 0 14:19 ? 00:00:00 ps -ef
如果是这样,我想知道如何(以及在哪里)正确 chown
和 chmod
我的文件。根据我的研究,如果您使用 docker-compose,这似乎就不那么简单了,而我是 - 我正在使用 docker-compose YAML 文件(第 3 版)与容器特定Docker个文件。似乎当我 chown
在容器的 Docker 文件末尾时,更改不会生效 - 可能是因为卷(在 docker-[=54 中定义=]) 是之后创建的。以下是两种配置的一些片段:
docker-compose.yml:
version: '3'
services:
fpm:
build: ./fpm
container_name: "fpm"
volumes:
- data_volume:/var/www/html
ports:
- "9000"
restart: always
volumes:
data_volume:
./fpm Docker文件:
FROM php:7-fpm
RUN mkdir -p /var/www/html/
COPY . /var/www/html/
RUN find /var -exec chown www-data:www-data {} \;
RUN find /var -type d -exec chmod 755 {} \;
RUN find /var -type f -exec chmod 644 {} \;
使用不同的 docker-compose 版本,很难对围绕该主题的各种网络文章、错误修复和功能请求进行分类。我希望在这里得到一些明确的 direction/answers,面向 docker-compose 版本 3.
docker 中的命名卷在其装载点被初始化为映像的内容。之后,除非该卷完全为空,否则该初始化步骤永远不会再 运行 以避免数据丢失。
因此,当您首次创建指向 /var/www/html
的 data_volume
时,它会获得该目录的副本,包括文件权限。但是,除非您删除或清空 data_volume
,否则您对 Dockerfile 所做的任何更改都只会更新图像,并且该卷将用该卷的内容覆盖该目录。
如果您不需要 data_volume
的内容,您可以 docker-compose down -v
删除容器 和 卷。然后,当您再次 运行 docker-compose up -d
时,将使用具有新权限的文件创建卷。
如果您确实需要保留 data_volume
的内容,那么您可以挂载该卷并在卷本身上 运行 命令:
docker run -it --rm -v $(basename $(pwd))_data_volume:/var/www/html busybox
以上假定您与 docker-compose.yml 位于同一文件夹中,并且该目录全部为小写字符。否则,将 $(basename $(pwd))_data_volume
替换为 docker volume ls
中显示的卷名。从上述容器内部,您可以 运行 您的 find
命令来更新所有权和权限。
Question: Are there still security risks if the files and directories are owned by root but the running process is owned by a non-root user, like www-data?
不是真的。您可能只需要确保 php-fpm 具有对这些文件的读取权限。
您正在将 /var/www/html
的内容复制到映像中并在构建时设置 ownership/permissions (Dockerfile)。还行吧。这是创建图像的常见用例。
但是您的 docker-compose.yml
将 data_volume
装载到 运行 容器中,替换了映像中的 /var/www/html
。因此,该目录中的任何内容都将被隐藏。相反,您将看到已安装卷的内容。
您可能想要选择保存容器数据所需的策略。在大多数情况下,在构建时填充 /var/www/html
可能没问题。但是,如果您的应用程序将数据写入该目录中的某处,那么您可能会考虑更改该路径。当容器被销毁时,写入到挂载卷之外的任何数据都将丢失。因此,请确保您的应用程序写入一个目录,该目录作为卷从 docker-compose.yml
.