我想设置一个加固的 Docker 实例,主要用于运行微服务,例如静态编译的 golang 应用程序。我正在寻找的是保护主机操作系统免受流氓容器和容器的影响。我试图用以下场景来总结情况。
设想:
我们有一台运行最小操作系统的服务器,例如 alpine linux(基于 busybox 的操作系统),安装、激活和正确配置了 SElinux 和 grsec。
在此服务器上运行一个 Docker 实例,其中包含 2 个正在运行的容器 A 和 B 以及一个卷 V。
容器 A 包含一个没有依赖关系的静态编译应用程序,连接到公共 Internet(Web 应用程序或公共 API)。这个应用程序包含一个巨大的错误,比如任意代码执行/上传/完整的反向 shell,你能想到的更糟。该容器还与卷 V 联网,作为上传目的地、数据库等。
主机操作系统包含一个只能在 root 时读取的标志(由 SElinux 强制执行)。
容器 B 还包含一个标志和一个应用程序,但与外部世界没有连接。
攻击者:
- 人类,知道应用程序中的巨大错误。
- 他想拿到旗帜。V 中的数据并不重要。
- 他不是间谍机构,但仍然是高级安全专家。
- 可能可以访问一些我们不知道的零日。
假设:
- linux 内核有错误,但 grsec 足以解决这个问题。除非 grsec 被停用,否则不能成为攻击媒介
- Grsec 和 SElinux 没有错误,也没有错误配置。
- 容器中的用户根是容器外的根(也许有一天这将不再是真的......)
- Docker 是一个真实的 Docker。没有已知的错误,但过去曾受到错误的影响,并且可能再次发生。
- 已经正确建立了一个日志系统以供将来调查。
目标:
- 保护旗帜。可能不可能,因为我们假设 Docker 有错误。
- 减少攻击面。
- 使攻击者的生活变得困难。
- 设置在攻击者试图获取标志时触发的警报。最好是在他设法得到它们之前。
问题:
- 我的假设有多现实?
- 你将如何实现这些目标?
- 我的以下建议怎么样?
- 对 Docker 有什么一般的安全建议吗?
我的建议:
- 配置SElinux比如A上没有用户可以写,V上没有用户可以执行文件。
使用极小的 Docker 映像,没有任何用户空间。就像是:
FROM scratch COPY app / ENTRYPOINT ["/app"]在运行应用程序之前降低权限。(不知道这样做的正确方法是什么......)
- 一个假的busybox用户区?如果我们尝试调用会触发警报的东西
/bin/sh,/bin/ls或者类似的东西。