我可以在Docker Nginx容器中放置哪些function?
我在一个Docker容器中运行Nginx,为了安全起见,我想尽可能多地释放Linux的能力。
我可以放弃哪些function?
该图像与标准的Docker Nginx Alpine图像类似: https : //github.com/nginxinc/docker-nginx/blob/0c7611139f2ce7c5a6b1febbfd5b436c8c7d2d53/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