- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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/
我试图在 Eclipse v3.7.2 中将 loopj .jar 库添加到我的项目中 首先,我将 .jar 添加到“lib”目录中,右键单击它并选择“添加到构建路径”。它编译得很好,但在执行时出现错
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Passing two-dimensional array via pointer int table[20
我在 Grafana 中的图表每隔几秒钟就会自动更新一次。随着数据的进入,右侧的最后一个数据点会暂时下降。最终会显示正确的值,但在几次更新时该值较低。这是正常的吗?可以修复吗? 最佳答案 也许,这会有
我不明白为什么我会收到臭名昭著的“IllegalStateException”以及以下代码: private void mergeQueryStrings(String url, Map parame
您好,我正在通过 .php 文件中的 JSON 回显将测试 Android 应用程序链接到 MySQL 数据库。 我能够用整个数据填充 ArrayList,但现在我想将数据分离到变量中,但我无法真正找
我想仅将对象的数据成员的值写入文件,因此这里我不能使用序列化,因为它会写入很多内容其他我不需要的信息。这是我通过两种方式实现的。一种使用字节缓冲区,另一种则不使用它。 不使用 ByteBuffer:第
可能是个简单的问题,但我似乎找不到答案。我正在动态创建一个页面,我可以在其中共享 Twitter 链接。 var twitter = document.createElement('a'); tw
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
尝试获取我在末尾为 $_SESSION 设置的值作为查询中的 user_id,而不是 $username。我似乎无法修改查询。我确信这对于这里的一些专家来说是非常简单的。 if(isset($_POS
有没有人可以帮助我,我有 mysql 查询,我已经在 phpmyadmin 中测试了它: select items.name, items.category, items.supplier_id, i
我正在尝试 push_back()一个„ std::vector 的符号. 我一直收到错误: character too large for enclosing character literal t
我有一个存储在 char * 中的压缩图像,我想将它放回 AVPacket,以便我可以将它放入 ffmpeg 解码器。有人可以展示如何做到这一点吗?任何示例或教程将不胜感激。 提前致谢 最佳答案 我向
password = str() while password != "changeme": password = input("Password: ") print("Thou Shall
所以我有一个 Map,其中有一些值被传递到一个方法中: public String doThis(Map context){ ..... } 我正在尝试向该 map 插入附加属性 String abc
我遇到了一些我无法弄清楚的问题...我正在编写一个带有接受拖放的 JList 的 Swing Java 应用程序。我想在将文件或文件夹从我的系统拖到 Java 应用程序上时更改光标。 最佳答案 我自己
我正在尝试确定一些关于如何编写异常消息的指南。 例如,让我们假设一个假设的函数必须接收恒定数量的字节(作为 bytes 对象),我们用 [1, 2, 3]。以下是所有可能的异常(exception)情
使用 JSONObject 发送到网络服务当我们将 double(整数)放入零时,该点将被删除 代码 double d = 123.00; JSONObject json = new JSONObje
在 WPF 中,如何将 DataGrid 放在 ComboBox 中以显示多列?像下面这样的东西似乎没有做任何事情:
我正在尝试使用自定义 QStandardItem 在两个 QListViews 之间进行拖放。 除了this document,我在网上找不到我需要的信息这有点帮助,但现在我被困住了。 从一个 QLi
如何将 PDF 放入 NSData 中?我在应用程序的文档目录中以字符串形式找到了 PDF 的位置。当我尝试通过电子邮件发送时,我在电子邮件正文中看到 PDF(而不是看到附件图标。我不知道这是否正常)
我是一名优秀的程序员,十分优秀!