顾名思义,多租户就是很多人租用容器平台上的资源来满足自己的应用托管和运维需求。有了资源,谁来管理这些资源的运维分配和使用?多租户的一个重要点是资源的安全隔离。即使是专用容器,也需要考虑相应的安全和业务隔离需求。从多租户的角度来看,租户租用容器云平台的资源来托管、开发、部署和维护自己的应用和服务。容器云平台需要提供和维护租户正常使用这些资源,同时为应用提供服务注册、服务发现、服务配置、日志、监控、预警、弹性伸缩、负载均衡、安全等能力由租户主持。我们需要了解的是,租户只是租用这些能力,他们不负责维护。那么谁来管理这些资源的运维分配和使用呢?那么什么是容器云中的资源呢?谁应该管理资源?如何分配?谁来运营和维护这些资源?谁将使用这些资源?这就是我写这篇文章的原因,其中包含我对通用多租户安全容器编排器的详细安全考虑。我将通过具体的例子来说明如何安全地隔离运行第三方代码。更多内容,请点击这里。测试环境配置1.运行Docker镜像的API,每个进程与其他进程完全隔离;2.滥用可以立即终止;3.代理应该可以自动更新以处理出现的安全问题;4.能够使用整个系统调用接口来运行进程;配置性能要求1.禁用和删除挖矿工具使用的任何基础设施和跟踪器;2.防火墙可以关闭任何现有的网络端点;3.防火墙运行该进程的容器可以与其所有关联的本地链接和任何可访问的内部IP隔离;4.如果多租户容器之间的一层安全隔离被破坏,另一层隔离需要立即赶上。如果两层安全隔离同时被破坏,会有隔离机制保护;5.主机操作系统是否安全;在测试过程中,我们要求每个容器按照以下条件运行:1.Block/iocgroups,使磁盘不受噪音干扰。Cgroups是控制组的缩写。它是Linux内核提供的一种机制,可以限制、记录、隔离进程组使用的物理资源(如:cpu、内存、IO等)。最初由Google工程师提出,后来被集成到Linux内核中。2.CPU限制;3.内存限制;4.网络或带宽限制;5、有一个与测试主机其他网络隔离的网络(bpf或iptables);主机操作系统主机操作系统应该是一个简化的操作系统,具有尽可能简单的功能,与容器内使用的操作系统共享尽可能多的功能。这是为了最大限度地减少主机环境中的操作漏洞。这些操作系统的例子包括:1.ContainerLinuxwithCoreOS;2.容器优化操作系统;3.IntelClearLinux,Intel的ClearLinux项目的目标是让用户充分利用虚拟机的隔离技术和容器的部署优势;4.LinuxKit,linuxkit这个工具可以理解为使用多个docker图像以形成最小化和定制的操作系统。定制系统只有几十兆;宿主操作系统的特点是CoreOSContainerLinux和ContainerOptimizedOS具有以下功能:1.Verifiedboot;2.Read-onlyorusr:2.1ContainerOptimizedOS会将根文件系统(/)挂载为只读,重新挂载其中部分为可写;2.2/tmp、/run、/media、/mnt/disks和/var/lib/cloud都是使用tmpfs挂载的。虽然它们是可写的,但是重启后它们的内容不会被保留;2.3目录/mnt/stateful/partition、/var和/home是从有状态磁盘分区挂载的,这意味着这些位置可用于存储在重启后仍然存在的数据。例如,Docker的工作目录/var/lib/docker在重新启动时是有状态的;2.4可写位置中只有/var/lib/docker和/var/lib/cloud被挂载为“可执行”,即没有noexec挂载标志;2.5CoreOSContainerLinux的根文件系统(/)挂载为read_write,而/usr为只读;3、所有操作系统允许无缝升级,解决安全问题;containersruncontainers运行时应该是一个管理程序,以确保Linux容器的用户配置不会降低集群的安全性。如果要允许使用整个系统调用接口,Firecracker似乎是最合适的。Firecracker是一种虚拟化技术,致力于创建和管理多租户容器和基于功能的服务,使用Rust开发,旨在加速AWSLambda和AWSFargate等服务的速度和效率。网络要求默认情况下,网络应该被锁定,拒绝所有入口和出口策略。这创建了一种安全形式,可确保网络环境的绝对安全。这可以通过iptables或直接使用BPF来实现。DNS不允许任何集群间DNS,不在主节点和系统节点上进行调度:确保集群中的主节点和系统节点不能被调度,这允许将系统进程的焦点转移到其他地方。调度程序调度程序不应打包bin文件,这在许多具有临时工作负载的场景中可能会发生,当前几个节点耗尽而所有其他节点未被使用时。因为工作负载不断地释放前几个节点上的资源(在批处理作业的情况下)。Kube-batch目前是KubernetesSIGs下的一个孵化项目。它是一个运行在Kubernetes上的用于机器学习/大数据/HPC的批量调度器(batchscheduler)。支持以PodGroup为单位进行资源调度,支持抢占和优先级。对于暂时不能满足资源条件的Pod,在Kubernetes中会处于pending状态,直到资源释放后继续执行。Kube-batch是基于IBM多年的HPC集群经验构建的,它更适合批处理作业,所以如果我们打算长期应用这个程序,需要对其进行修改。如果我们在裸机上运行,??我们需要考虑电源管理、BIOS更新、硬件故障等。资源约束使用cgroups来管理资源和设置限制:1.磁盘IO;2.网络带宽;3.内存;4.中央处理器;如果没有波动,则可能是挖矿工具;2.二进制跟踪器负责查找具有特定名称的二进制文件或进程;3.Webtrackers负责查找与已知挖矿工具端点相关的进程;为什么不使用kubernetes?kubernetes,简称K8s,是将8个字符“ubernete”替换为8而形成的缩写。它是一个开源的,用于管理云平台中多个主机上的容器化应用程序。Kubernetes的目标是让容器化应用程序的部署变得简单高效(功能强大)。Kubernetes提供应用部署、规划、更新和维护。一种机制。由于我不希望任何允许任意代码执行的容器只有一层安全性,所以我认为kubernetes将无法满足这一要求。Kubernetes的etcd集群之间没有隔离,kubelet和apiserver之间的通信也无法隔离。Etcd是Kubernetes集群中非常重要的一个组件,用于保存集群中对象的所有网络配置和状态信息。总而言之,Kubernetes太复杂了,第三方驱动太多了。攻击面如此之大,以至于我们不需要它的大部分(90%)功能集。默认情况下,Kubernetes最多会为每个节点调度110个pod。这是您可以修改的内容,但同样重要的是要注意kubernetes中的默认调度程序不是资源感知的,我们必须修复它。有关详细信息,请参阅上面的“调度程序”部分。由于默认调度器的逻辑,集群中的前几个节点将被销毁。即使谷歌内部也没有使用Kubernetes来调度虚拟机,Kubernetes在容器中插入了一些额外的env变量,我们也需要处理这些变量。存在影响隔离的内核零日漏洞怎么办?首先更新内核,如果无法更新内核,我们可以使用ebpf来捕获易受攻击的内核函数,并删除任何试图利用该漏洞的容器。假设我们已经有了可以持续构建内核和应用补丁的系统,我们可以考虑威胁模型。大多数时候,有人会攻击我们的基础设施,因此我们应该确保所有这些服务器在网络上与堆栈的其余部分隔离开来。另一个威胁是,用我们运行的用户名和密码打开容器后,黑客会通过虚拟机进行拦截。通常,当容器运行不正确时会发生这种情况。
