我可以在Docker Nginx容器中放置哪些function?

我在一个Docker容器中运行Nginx,为了安全起见,我想尽可能多地释放Linux的能力。

我可以放弃哪些function?

该图像与标准的Docker Nginx Alpine图像类似: https : //github.com/nginxinc/docker-nginx/blob/0c7611139f2ce7c​​5a6b1febbfd5b436c8c7d2d53/mainline/alpine/Dockerfile ,它以根用户身份启动Nginx,然后运行工作进程为用户'nginx',看:

root@instance-1:/opt/ed# docker-compose exec web bash bash-4.3# # Now we're inside the container. bash-4.3# ps aux PID USER TIME COMMAND 1 root 0:00 /bin/sh -c /etc/nginx/run-envsubst.sh && nginx 10 root 0:00 nginx: master process nginx 11 nginx 0:00 nginx: worker process 12 nginx 0:00 nginx: cache manager process 14 root 0:00 bash 18 root 0:00 ps aux 

侦听端口80和443,使用Docker-Compose的'volume:….'指令装载一些目录。

显然,这些是Docker默认授予容器的function:

 s.Process.Capabilities = []string{ "CAP_CHOWN", "CAP_DAC_OVERRIDE", "CAP_FSETID", "CAP_FOWNER", "CAP_MKNOD", "CAP_NET_RAW", "CAP_SETGID", "CAP_SETUID", "CAP_SETFCAP", "CAP_SETPCAP", "CAP_NET_BIND_SERVICE", "CAP_SYS_CHROOT", "CAP_KILL", "CAP_AUDIT_WRITE", } 

从这里: https : //github.com/docker/docker/blob/master/oci/defaults_linux.go#L62-L77

我发现它链接到这里: https : //docs.docker.com/engine/security/security/#linux-kernel-capabilities ,该页面说: “默认情况下,Docker会删除所有需要的function” ,这可能意味着那个人不需要放弃任何能力? …

…但是有这个红帽博客文章关于丢失这些function的丢失 – 所以似乎(一些)的默认function是不需要的。 不知道该相信什么,而且我想知道是否人们知道哪些function可以(应该)被丢弃。

(我也许可以testing一下自己,但是即使我testing了一个function,并且几个小时或者几天似乎都能正常工作 – 我可能仍然会放弃错误的function?问题可能会出现,甚至是后来呢?因此,似乎更安全问这里和testing自己,而不是testing自己)

(我很惊讶这已经没有在其他地方回答过了吗?在docker中使用Nginx的人不是很多,因此想要放弃function吗?)

我想知道同样的事情,所以我做了一些研究。 被警告,这不是一个专家的答案。

简短回答:如果以用户身份启动nginx并使用非特权端口(> 1024),则可以删除所有权限。 这在Nginx中描述在没有Root的Docker中 ,一些额外的信息可以作为非root用户运行Nginx 。

ajhaydock / nginx的 nginx图像特别推荐--cop-drop=ALL (尽pipe我不推荐使用这个图像,因为它目前相当大:700MB)。

较长的答案:所需的特权可能会有所不同,具体取决于您的configuration,以及是否要以root身份启动nginx。

让我们从官方的docker镜像及其默认configuration开始。 最小的function如下:

 docker pull nginx:alpine docker run -p 8080:80 --cap-drop=all \ --cap-add=chown --cap-add=dac_override \ --cap-add=setgid --cap-add=setuid \ --cap-add=net_bind_service \ nginx:alpine 

您可以使用这些命令检查您是否在本地端口8080上具有欢迎页面,如果删除了启动过程中崩溃的任何function。 (注意,根据使用这个奇怪的技巧来保护你的容器 ,需要dac_override意味着他们可能做错了。)

显然, net_bind_service只需要监听80和443等特权端口时才需要。由于我们可以根据需要自由redirect,因此只需在较高的端口上监听就可以将其丢弃:

 docker cp nginx:/etc/nginx/conf.d/default.conf . sed -i 's/listen\s*80;/listen 8080;/' default.conf docker rm nginx docker run -p 8080:8080 --cap-drop=all \ --cap-add=chown --cap-add=dac_override \ --cap-add=setgid --cap-add=setuid \ -v $(pwd)/default.conf:/etc/nginx/conf.d/default.conf \ nginx:alpine 

仍然有效。

通过以非root用户身份运行nginx,可以删除其他权限。 在这种情况下,你不能使用user nginx; 指令,而是在Dockerfile使用USER nginx 。 这也阻止你使用特权端口。

可能对其他人有帮助的其他资源:

  • 用这个奇怪的技巧来保护你的容器
  • man 7 capabilities