0x00 前言
我们在《1.3 安全边界》中简单说明了安全边界的概念和重要性。众所周知,“多租户”是云计算的一大特点,而云原生是“云计算2.0”。所以,接下来让我们来看看多租户环境下,其安全边界将面临哪些威胁。
0x01 多租户的概念
在20世纪60年代的大型机时代,多租户的概念就存在了,当时的用户可以租用共享机器上的CPU时间、内存和存储空间等资源。
这和如今的公有云并没有太大的区别。因为,现在的用户也可以在亚马逊 的AWS、微软的 Azure或谷歌的云平台等公有云平台上租用CPU时间、内存和存储空间等资源,此外,用户还可以租用公有云的其他功能和托管服务。
2006年 8月24日,亚马逊的AWS推出了EC2,此后我们便可以租用运行在世界各地数据中心机架上的虚拟机实例了。虽然很多虚拟机都运行在物理机上,但你无法知道是谁操作你邻近的虚拟机。
0x02 共享机器
一台Linux主机(或虚拟机)可能会被多个用户共享。这样的多租户的例子在大学中非常常见。
在这种情况下,不仅用户之间彼此不信任,连系统管理员也不信任用户。因此,管理员需要利用Linux 的访问控制来严格限制用户的访问权限,让每个用户都拥有一个登录ID。这时,用户只能查看并修改自己目录中的文件,不能访问并修改他人目录中的文件。
但正如我们在《第4课:容器之间的隔离》中所说到的那样:所有运行在同一宿主机上的容器都共享一个内核。因此,若这台机器正在运行 Docker 守护进程,那么任何能执行 Docker 命令的用户都拥有 root访问权限。
很明显,系统管理员不愿意将这种权限授予不受信任的用户。因此,在企业环境中,甚至在云原生环境中,你不太可能会看到这种共享机器的方式。事实上,哪怕彼此信任的用户或用户团队通常都会以虚拟机的形式进行资源分配的。
0x03 虚拟化
但请注意的是,虚拟化并不算是多租户:从定义上来说,多租户指的是不同的用户群体共享一个软件实例。而在虚拟化的环境中,用户通过无法访问hypervisor(虚拟机管理程序)来管理虚拟机,即用户不共享任何软件。
一般来说,虚拟机之间的隔离是非常强的,你的“邻居”不太可能观察或干涉到你在虚拟机中的行为。关于如何实现这种隔离,我们将在《第 5 课: 虚拟机》中进行讲解。
但也并不是说虚拟机之间的隔离就是非常完美的,曾有用户抱怨过“嘈杂邻居”的问题,即由于您与其他用户共享一台物理机,所以可能会导致性能出现意外的波动。
作为最早一批使用公有云的厂商,Netflix在2010年12月16日发表了一篇名为《5 Lessons We’ve Learned Using AWS》的博客。在这篇博客中,Netflix表示“合租模式可能在堆栈的任何层次引入吞吐量的变动。为了保证系统的可靠性和高效性,您要么在必要时放弃所运行的子任务,要么在 AWS 内管理您的资源以避免合租。”
2016年5月24日,David Linthicum发表了一篇名为《Debunking the cloud's 'noisy neighbor' myth》的博客,在这篇博客中,他认为“嘈杂邻居”已经不再是一个真正的问题了。
不仅如此,也有一些已知的软件漏洞会破坏虚拟机之间的安全边界。对于政府、金融或医疗部门等机构而言,这些漏洞所造成的后果会十分严重,因此完全的物理隔离是十分有必要的。
我们建议您搭建一个私有云来确保工作负载可以被完全地隔离起来。这个私有云可以运行在您的数据中心中,也可以让服务提供商代为管理。不仅如此,私有云有时还会附带额外的安全功能,例如,对有权访问数据中心的人员进行额外的背景调查。
许多云提供商会提供物理机或虚拟机两种租赁方式。若您租赁的是虚拟机,可以让供应商保证你是物理机上唯一的客户;若您租赁的是物理机,您将得到一个裸金属的机器。这两种方式都可以保证您是物理机上的唯一的客户,所以您将具备物理机之间的更强的隔离性,并将完全避免“嘈杂邻居”的问题。
但无论您是在私有云中使用物理机还是虚拟机,还是使用自己的服务器,只有您运行着容器,您都需要考虑容器之间多租户的安全边界问题。
0x04 容器多租户
正如您在《第4课:容器之间的隔离》中所看到的那样:容器之间的隔离比不上虚拟机之间的那么强。
虽然这取决于您的风险状况,但说实话,您可能也不希望和不信任的人在同一台机器上使用容器。退一万步来讲,即使您与完全信任的人在同一台机器上使用容器,但您应该也希望容器之间不受干扰来减轻人为失误所带来的风险。
在 Kubernetes 中,您可以使用Namespace(命名空间)来细分集群机器,以供不同的人、团队或应用程序使用。想要做到这一点,只需使用RBAC(role-based access control,基于角色的访问控制)即可。
但在这篇文章中,我们不会详细介绍如何通过RBAC来进行配置,详情请看Kubernetes的官方文档。需要注意的是,RBAC仅能控制您可以通过Kubernetes API 进行的操作。
友情提示,Namespace是一个多义词:
- 在Linux中,Namespace是可以隔离进程可见资源的底层机制;
- 在Kubernetes中,Namespace可以对集群资源应用不同的访问控制;
我们将在《第4课:容器之间的隔离》中进行讲解。
不仅如此,运行在同一宿主机上的同一个Pod的容器即使位于不同的Namespace中,但其安全边界的保护仍然依赖于容器的隔离机制,所以如果攻击者可以从容器中逃逸到宿主机上,即使容器处于不同的Namespace中,它们仍然有可能相互影响或互相干扰。
0x05容器实例
像亚马逊的AWS、微软的Azure和谷歌的云平台这样的公有云提供商都提供了许多托管服务,让用户无需安装或管理即可租用组件、存储及其他组件。
例如,亚马逊提供关系数据库服务(Relational Database Service,RDS),若您购买了该服务,您只需简单配置一下就可以使用PostgreSQL等知名的软件数据库,若您想备份数据只需简单勾选一下即可(当然还需要支付相关费用)。
如今,托管服务也扩展到了容器的领域。例如Azure的Container Instances和AWS的Fargate可以让您无需考虑底层主机(或虚拟机)就可以轻松地运行容器。
这样就可以大大地减轻管理的负担,并且您可以随意地扩展部署环境。然而,理论上,您的容器实例可能会与其他客户的容器实例运行在同一虚拟机上。如果有疑问,请咨询相应的云服务提供商。
0x06 总结
现在,您已经了解了您的部署环境可能面临的诸多潜在威胁,但在探讨其他内容之前,我们还需要学习一些基本的安全原则。
这些安全原则可以指导您如何在部署环境中引入安全工具与安全流程。
下期再见~
更多分享,关注微信公众号:喵苗安全