该镜像类似于标准的Docker Nginx Alpine镜像,链接如下:https://github.com/nginxinc/docker-nginx/blob/0c7611139f2ce7c5a6b1febbfd5b436c8c7d2d53/mainline/alpine/Dockerfile,它以root身份启动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默认授予容器的功能:
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会放弃除所需之外的所有特权”,这可能意味着不需要放弃任何特权?...
...但是有这篇Red Hat博客文章讲述了放弃很多这些能力的问题-因此似乎(某些)默认的能力实际上并不需要。我不确定该相信什么,我想知道人们知道哪些能力可以(应该)被放弃。
(我可以尝试自己测试,但即使我测试过减少了一个能力,事情在几个小时或几天内似乎运作正常-我可能仍然删除了错误的能力?问题可能会发生,甚至更晚?因此,询问别人和自己测试似乎比仅仅进行测试更安全)
(我很惊讶为什么这个问题在其他地方没有回答?很多人使用在docker中使用Nginx,因此想要放弃特权嘛?)
pscap
和filecap
来查看你的容器需要什么capabilities。使用captest
来测试它们。然后,使用--cap-drop ALL --cap-add foo
除了你需要的capability之外删除所有的capabilities。在这里查看更多信息:https://github.com/docker/labs/tree/master/security/capabilities。让我知道你的进展如何。 - Matt Schuchard