gpt4 book ai didi

linux - 我可以将哪些功能放入 Docker Nginx 容器中?

转载 作者:太空狗 更新时间:2023-10-29 11:17:30 25 4
gpt4 key购买 nike

我在 Docker 容器中运行 Nginx,出于安全原因,我想放弃尽可能多的 Linux 功能。

然后我可以放弃哪些功能?

图像类似于此处的标准 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 会删除所有需要的功能”,这可能意味着不需要删除任何功能? ...

... 但是有 this Red Hat blog post关于放弃丢失这些功能——因此似乎不需要(某些)默认功能。不确定该相信什么,我想知道人们是否知道可以(应该)放弃哪些功能。

(我也许可以测试自己,但即使我测试删除一个功能并且事情似乎在几个小时或几天内工作正常 - 我可能仍然删除了错误的功能?问题可能会出现,甚至更晚?所以看起来像在这里提问和 self 测试比 self 测试更安全)

(我很惊讶这个问题还没有在其他地方得到解答?不是很多人在 docker 中使用 Nginx,因此想要放弃功能吗?)

最佳答案

我也在想同样的事情,所以我做了一些研究。请注意,这不是专家回答。

简短回答:如果您以用户身份启动 nginx 并使用非特权端口 (>1024),您可以放弃所有特权。这在 Nginx in Docker without Root 中有描述。和一些额外的信息可以在 Running Nginx as non root user 中找到.

ajhaydock/nginx nginx 镜像特别推荐 --cap-drop=ALL(虽然我不推荐使用这个镜像,因为它目前相当大:700MB)。

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

让我们从官方 docker 镜像及其默认配置开始。最低能力如下:

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 上拥有欢迎页面,如果您删除任何功能,进程将在启动时崩溃。 (注意,根据 Secure Your Containers with this One Weird Trick ,需要 dac_override 意味着他们可能做错了..)

显然,net_bind_service 仅在监听 80 和 443 等特权端口时才需要。由于我们可以根据需要自由重定向,因此可以通过简单地监听更高端口来删除它:

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。这也会阻止您使用特权端口。

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

关于linux - 我可以将哪些功能放入 Docker Nginx 容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43467670/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com