Docker:Nginx和PHP:为什么要更改默认用户/组?

v2g6jxz6  于 2023-10-15  发布在  PHP
关注(0)|答案(2)|浏览(160)

我开始学习Docker并设置Nginx和PHP。我看了一些例子,看到下面的例子:https://github.com/aschmelyun/lc-the-docker-tutorial/blob/main/nginx.dockerfile
有两个dockerfile,一个用于NGINX(nginx.dockerfile):

FROM nginx:stable-alpine

ENV NGINXUSER=laravel
ENV NGINXGROUP=laravel

RUN mkdir -p /var/www/html/public

ADD nginx/default.conf /etc/nginx/conf.d/default.conf

RUN sed -i "s/user www-data/user ${NGINXUSER}/g" /etc/nginx/nginx.conf

RUN adduser -g ${NGINXGROUP} -s /bin/sh -D ${NGINXUSER}

PHP(php.dockerfile):

FROM php:8-fpm-alpine

ENV PHPGROUP=laravel
ENV PHPUSER=laravel

RUN adduser -g ${PHPGROUP} -s /bin/sh -D ${PHPUSER}

RUN sed -i "s/user = www-data/user = ${PHPUSER}/g" /usr/local/etc/php-fpm.d/www.conf
RUN sed -i "s/group = www-data/group = ${PHPGROUP}/g" /usr/local/etc/php-fpm.d/www.conf

RUN mkdir -p /var/www/html/public

RUN docker-php-ext-install pdo pdo_mysql

CMD ["php-fpm", "-y", "/usr/local/etc/php-fpm.conf", "-R"]

在这两种情况下,都会创建新的用户和组(用户laravel分配给组laravel),然后使用sed命令修改配置文件:

  • 对于NGINX,它将用户/etc/nginx/nginx.conf中所有出现的www-data替换为laravel;
  • 对于PHP,它做了类似的事情:它将用户和组www-data替换为laravel

3个相互关联的问题:

**问题1:**这是否意味着NGINX和PHP(我猜只有FPM,CLI不会在那里,因为它从Docker Hub拉php:8-fpm-alpine基础镜像,其中不包括CLI,对吗?)将作为laravel用户在容器中运行?(如果是,请看问题3)。
**问题2:**是否有任何实际的理由来更改NGINX和PHP-FPM的默认用户,如上面的示例中所示?
Question 3:php.dockerfile的末尾有这样一条命令:

CMD ["php-fpm", "-y", "/usr/local/etc/php-fpm.conf", "-R"]

我在Stackoverflow上搜索了这个-R的意思,我找到了以下答案:https://stackoverflow.com/a/49178410/4437206如果我理解正确,这意味着PHP-FPM将作为root运行?如果是这样,那么它将不会以我们添加的laravel用户的身份运行,因此,添加laravel用户有什么意义呢?

ua4mk5z4

ua4mk5z41#

1.是的
1.在容器中以root身份运行东西仍然是不好的,因为root可以并且确实有能力利用漏洞来逃离容器。对于非root用户来说,这几乎是不可能的。

  1. -R只是阻止FPM抱怨它,它实际上并没有改变谁在执行它。
gajydyqb

gajydyqb2#

如果你要从一个在非特权模式下运行的orchestrator(比如kubernetes或openshift)运行你的镜像,你不允许以某些用户uid的身份运行进程。港口也是如此。
Nginx的根进程总是需要以root用户的身份启动,而它会以您提供的用户身份生成子进程。这就是为什么有unprivileged nginx图像来解决这个问题。Php-fpm不是这样工作的,它只是按照Dockerfile中的用户声明或orchestrator的声明启动。
而且作为root在映像中运行进程通常是一个不好的做法,因为主机的内核在容器中可用。如果有人访问了运行映像的shell,他们就可以访问内核,基本上可以访问整个主机。
端口也是如此,端口1到1000上的每个监听器都需要根绑定。从1001到65535的所有其他端口都没有。这就是为什么你经常在8080和8443端口上看到nginx端口配置。
为了回答最后一个问题,php-fpm -R用于允许子进程以root身份运行,而不是以root身份启动。

相关问题