以 root 权限运行ENTRYPOINT ["/bin/sh", entrypoint.sh"],然后在运行应用程序之前切换到非 root 用户,这是否被认为是一种安全的做法?
更多背景:
有许多文章(1、2、3 )建议以非 root 用户身份运行容器是安全性方面的最佳实践。这可以使用命令来实现,但是在某些情况下(4、5 ),当以 root 身份运行容器时,只有在脚本中切换到非 root是唯一的解决方法,例如:USER appuserentrypoint.sh
#!/bin/sh
chown -R appuser:appgroup /path/to/volume
exec runuser -u appuser "$@"
Run Code Online (Sandbox Code Playgroud)
在 Dockerfile 中:
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/bin/sh", "entrypoint.sh"]
CMD ["/usr/bin/myapp"]
Run Code Online (Sandbox Code Playgroud)
调用时docker top container我可以看到两个进程,一个是根进程,一个是非根进程
PID USER TIME COMMAND
5004 root 0:00 runuser -u appuser /usr/bin/myapp
5043 1000 0:02 /usr/bin/myapp
Run Code Online (Sandbox Code Playgroud)
这是否意味着我的容器运行时存在根进程的漏洞,或者它被认为是安全的?
我发现关于这个主题的讨论很少(6、7 ),而且似乎没有一个是明确的。我在 StackOverflow 上查找了类似的问题,但找不到任何可以解决安全问题的相关问题(8、9、10) …
我以rperez. 我已经设置了 Docker 以便能够通过这个用户运行,所以我正在运行一个容器,如下所示:
$ docker run -d \
-it \
-e HOST_IP=192.168.1.66 \
-e PHP_ERROR_REPORTING='E_ALL & ~E_STRICT' \
-p 80:80 \
-v ~/var/www:/var/www \
--name php55-dev reypm/php55-dev
Run Code Online (Sandbox Code Playgroud)
请注意该$符号表示我以非 root 用户身份运行命令(使用#)。上面的命令创建以下目录:/home/rperez/var/www但所有者设置为root我相信这是因为docker在root后台以用户身份运行。
有了这个设置,我无法在下面创建文件~/var/www,rperez因为所有者是root如此......
处理这个问题的正确方法是什么?我已经阅读了这个和这个,但不是很有帮助。
有什么帮助吗?