在同一主机上安全地使用多个 docker 容器,就像隔离实例一样
Using multiple docker containers on the same host securely like isolated instances
我知道,多个 Docker 容器可以在同一个主机中使用,但是它们可以像隔离实例一样安全使用吗?我想要 运行 多个安全和沙盒容器,这样任何容器都不能影响或访问其他容器。
例如,我可以为监听不同端口的 nginx 和 apache 容器提供服务,完全相信每个容器只能访问它们自己的文件、资源等吗?
文件系统隔离(以及内存和进程隔离)是 docker 容器的核心功能,基于 Linux Kernel abilities.
但是如果你想完全确定,你可以将你的容器部署在不同的节点上(每个节点由它们自己的 docker 守护进程管理),每个节点都是你主机上的一个 VM(虚拟机),确保一个完整的沙盒。
然后 docker swarm or Kubernetes 将能够编排这些节点及其容器,并使它们进行通信。
当您只有几个链接容器时,通常不需要这样做:它们应该能够由单个 docker 守护程序单独管理。您可以使用 user namespace 进行额外隔离。
此外,使用节点分隔容器意味着不同的机器或同一台机器中的不同 VM。
VM 和容器的一个很大区别是 VM 将抢占资源(分配固定的最小数量 disk/memory/CPU),这意味着您不能启动一百个 VM,每个容器一个。与单个 docker 实例相反,容器如果不执行任何操作,根本不会消耗太多磁盘 space/memory/CPU。
从某种意义上说,您是在问有关容器的价值百万美元的问题,并且要清楚,恕我直言,这个问题没有黑白分明的答案 "is the platform/technology secure enough." 这是一个足够大(且重要)的问题围绕容器安全的初创公司名单——更不用说他们收到的资金数额了——数量可观!
如另一个答案所述,容器的隔离是通过 Linux 内核功能(命名空间和 cgroups)的分类实现的,而为这些功能增加更多安全性是 另一个 一组技术,如 seccomp、apparmor(或 SELinux)、用户命名空间或容器运行时和安装它的节点的一般强化(例如通过 CIS benchmark guidelines)。开箱即用的默认安装和默认运行时参数可能 不够 一般信任 Linux 的内核隔离原语。但是,这在很大程度上取决于 信任级别 什么 您在整个容器工作负载中 运行。例如,这是否全部在一个组织内部进行?可以从外部来源提交工作负载吗?显然,可能性的范围可能会极大地影响您的信任程度。
如果您的用例可能很窄(例如,您提到来自 nginx 或 apache 的网络服务内容),并且您愿意做一些工作来处理基础映像的创建、最小化和强化;添加一个 --readonly
根文件系统和一个能力限制 apparmor 和 seccomp 配置文件,绑定安装在内容服务 + 可写区域,没有可执行文件和非特权用户的所有权——所有这些东西加在一起可能是 足够用于特定用例。
但是,无法保证当前未知的安全逃逸在未来成为 Linux 容器的“0day”,这导致 轻量级虚拟化的推广 通过来自 hyper.sh or Intel Clear Containers 的垫片将容器隔离与实际硬件级虚拟化结合起来作为两个示例。这是介于 运行 具有另一个容器运行时的完全虚拟化 OS 和在单个节点上使用单个守护进程的信任内核隔离之间的一个很好的媒介。添加此隔离层仍然会产生性能成本和内存开销,但它比完全虚拟化的要少得多 OS 并且正在继续努力以减少对性能的影响。
有关可用于调优容器安全性的所有 "knobs" 的更深入信息集,我去年多次发表的演讲可在 slideshare as well as via video 上从 Skillsmatter 获得。
Aaron Grattafiori 的令人难以置信的详尽“Understanding and Hardening Linux Containers”也是一个很好的资源,其中包含许多相同主题的详尽细节。
我知道,多个 Docker 容器可以在同一个主机中使用,但是它们可以像隔离实例一样安全使用吗?我想要 运行 多个安全和沙盒容器,这样任何容器都不能影响或访问其他容器。
例如,我可以为监听不同端口的 nginx 和 apache 容器提供服务,完全相信每个容器只能访问它们自己的文件、资源等吗?
文件系统隔离(以及内存和进程隔离)是 docker 容器的核心功能,基于 Linux Kernel abilities.
但是如果你想完全确定,你可以将你的容器部署在不同的节点上(每个节点由它们自己的 docker 守护进程管理),每个节点都是你主机上的一个 VM(虚拟机),确保一个完整的沙盒。
然后 docker swarm or Kubernetes 将能够编排这些节点及其容器,并使它们进行通信。
当您只有几个链接容器时,通常不需要这样做:它们应该能够由单个 docker 守护程序单独管理。您可以使用 user namespace 进行额外隔离。
此外,使用节点分隔容器意味着不同的机器或同一台机器中的不同 VM。
VM 和容器的一个很大区别是 VM 将抢占资源(分配固定的最小数量 disk/memory/CPU),这意味着您不能启动一百个 VM,每个容器一个。与单个 docker 实例相反,容器如果不执行任何操作,根本不会消耗太多磁盘 space/memory/CPU。
从某种意义上说,您是在问有关容器的价值百万美元的问题,并且要清楚,恕我直言,这个问题没有黑白分明的答案 "is the platform/technology secure enough." 这是一个足够大(且重要)的问题围绕容器安全的初创公司名单——更不用说他们收到的资金数额了——数量可观!
如另一个答案所述,容器的隔离是通过 Linux 内核功能(命名空间和 cgroups)的分类实现的,而为这些功能增加更多安全性是 另一个 一组技术,如 seccomp、apparmor(或 SELinux)、用户命名空间或容器运行时和安装它的节点的一般强化(例如通过 CIS benchmark guidelines)。开箱即用的默认安装和默认运行时参数可能 不够 一般信任 Linux 的内核隔离原语。但是,这在很大程度上取决于 信任级别 什么 您在整个容器工作负载中 运行。例如,这是否全部在一个组织内部进行?可以从外部来源提交工作负载吗?显然,可能性的范围可能会极大地影响您的信任程度。
如果您的用例可能很窄(例如,您提到来自 nginx 或 apache 的网络服务内容),并且您愿意做一些工作来处理基础映像的创建、最小化和强化;添加一个 --readonly
根文件系统和一个能力限制 apparmor 和 seccomp 配置文件,绑定安装在内容服务 + 可写区域,没有可执行文件和非特权用户的所有权——所有这些东西加在一起可能是 足够用于特定用例。
但是,无法保证当前未知的安全逃逸在未来成为 Linux 容器的“0day”,这导致 轻量级虚拟化的推广 通过来自 hyper.sh or Intel Clear Containers 的垫片将容器隔离与实际硬件级虚拟化结合起来作为两个示例。这是介于 运行 具有另一个容器运行时的完全虚拟化 OS 和在单个节点上使用单个守护进程的信任内核隔离之间的一个很好的媒介。添加此隔离层仍然会产生性能成本和内存开销,但它比完全虚拟化的要少得多 OS 并且正在继续努力以减少对性能的影响。
有关可用于调优容器安全性的所有 "knobs" 的更深入信息集,我去年多次发表的演讲可在 slideshare as well as via video 上从 Skillsmatter 获得。
Aaron Grattafiori 的令人难以置信的详尽“Understanding and Hardening Linux Containers”也是一个很好的资源,其中包含许多相同主题的详尽细节。