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

时间:2017-05-10 18:54:41

标签: docker permissions docker-compose file-permissions user-permissions

Docker states,其容器是

  

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

结果,我试图:

  1. 使用能够正确处理用户执行的官方图片
  2. 避免在生产中装入主机卷,而是使用COPY代替
  3. 当我COPY代码和配置文件到我的容器卷时,所有目录和文件都是“...... UID和GID为0”(root所有权)创建的,如文档中所述{ {3}}

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

    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。似乎当我在容器的Dockerfile末尾chown时,更改不会生效 - 可能是因为之后创建了卷(在docker-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版。

2 个答案:

答案 0 :(得分:1)

  

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

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

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

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

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

答案 1 :(得分:0)

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

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

如果您不需要data_volume的内容,则可以data_volume删除容器卷。然后,当您再次运行docker-compose down -v时,将使用具有新权限的文件创建卷。

如果确实需要保留docker-compose up -d的内容,则可以安装卷并在卷本身上运行命令:

data_volume

以上假设您与docker-compose.yml位于同一文件夹中,并且该目录均为小写字符。否则,请使用docker run -it --rm -v $(basename $(pwd))_data_volume:/var/www/html busybox 中显示的卷名替换$(basename $(pwd))_data_volume。从上面的容器中,您可以运行docker volume ls命令来更新所有权和权限。