繁体   English   中英

Docker容器中的用户和文件权限配置(docker-compose版本3)

[英]User and file permission configuration in Docker containers (docker-compose version 3)

码头工人 ,它的容器

“...默认情况下,非常安全;特别是如果您负责将容器内的进程作为非特权用户(即非root用户)运行”

结果,我试图:

  1. 使用能够正确处理用户执行的官方图像
  2. 避免在生产中安装主机卷,而是使用COPY

当我COPY代码和配置文件到我的集装箱量,所有的目录和文件的创建” ......一个UID和0"的GID(根所有权),如文档中说明这里

问题:如果文件和目录由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

如果是这样,我想知道如何(和在哪里)正确chownchmod我的文件。 从我的研究来看,如果你使用的是docker-compose,这似乎不太直白,我就是这样 - 我正在使用docker-compose YAML文件(版本3)和特定于容器的Dockerfiles。 看来,当我chown在容器的Dockerfile结束,所做的更改不会生效-可能是因为体积(这是在泊坞窗,compose.yml定义)是继创建。 以下是两种配置的一些片段:

泊坞窗,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 Dockerfile:

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版本,很难对围绕此主题的各种Web文章,错误修复和功能请求进行排序。 我希望在这里获得一些明确的方向/答案,面向docker-compose第3版。

问题:如果文件和目录由root拥有但是运行进程由非root用户拥有,如www-data,是否还存在安全风险?

并不是的。 您可能只需要确保php-fpm具有对这些文件的读取权限。

您正在将/var/www/html的内容复制到映像中,并在构建时设置所有权/权限(Dockerfile)。 还行吧。 这是创建图像的常用用例。

但是,你的docker-compose.yml坐骑data_volume到正在运行的容器,替换/var/www/html从图像。 因此,无论您在该目录中拥有什么,都将被隐藏。 您将看到已安装卷的内容。

您可能希望选择持久化容器数据所需的策略。 在构建时/var/www/html在大多数情况下可能都可以。 但是,如果您的应用程序将数据写入该目录中的某个位置,那么您可以考虑更改该路径。 当容器被销毁时,写入outisde已安装卷的任何数据都将丢失。 因此,请确保yoru app写入从docker-compose.yml作为卷挂载的目录。

docker中的命名卷初始化为其挂载点处图像的内容。 之后,除非卷完全为空,否则永远不会再次运行该初始化步骤以避免数据丢失。

因此,当您第一次创建指向/var/www/html data_volume时,它获得了该目录的副本,包括文件权限。 但除非您删除或清空data_volume ,否则您对data_volume任何更改都只会更新映像,而卷将使用卷的内容覆盖该目录。

如果您不需要data_volume的内容,可以使用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替换$(basename $(pwd))_data_volume docker volume ls显示的卷名。 从上面的容器中,您可以运行find命令来更新所有权和权限。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM