如何在云平台上实现多租户的资源分配与安全隔离?

想了解一下云平台上实现多租户的资源分配、审计授权收费,与各租户的安全隔离,和金融行业相关云计算的监管指引。

参与5

1同行回答

GaryyGaryy  系统工程师 , 某保险
用户、租户与多租户是一个适用于多个行业的普遍性概念。一个环境/系统的一个使用者即该环境/系统的一个用户。系统允许其用户通过一个登录流程(enrollment process)进入该系统,并获取访问系统及其资源的权限。用户在管理粒度上被分到若干组内,每组成为一个租户(tenant)。一个简...显示全部

用户、租户与多租户是一个适用于多个行业的普遍性概念。

一个环境/系统的一个使用者即该环境/系统的一个用户。系统允许其用户通过一个登录流程(enrollment process)进入该系统,并获取访问系统及其资源的权限。用户在管理粒度上被分到若干组内,每组成为一个租户(tenant)。一个简单的层级中,一个用户只属于一个租户;但是,复杂情况下,一个租户还可以有自租户。因此,用户可以分为几类,包括管理员用户,租户管理员用户和普通租户用户等。

多租户(multi-tenancy)是指一个建立在共同的底层资源上的环境被被多个租户共同使用。就像一个大楼一样,许多租户共享大楼的基础设施,比如电梯,但是使用墙和门来在租户之间做隔离;在一个公司内部,敏感部门还需要进一步隔离。多租户的含义包括两个方面:(1)共享带来经济性 (2)隔离保证安全性。

以公有云为例来说明多租户共享带来的安全问题。公有 IaaS 云,比如 AWS EC2 和 Google GCE 等,允许其客户在共享的物理基础设上创建和运行虚机。这种资源共享能够带来规模化成本效益,但是也带来了在一个服务器上一个虚机和故意或者无意的恶意虚机共存的可能。研究表明,当两个虚机共同存在于一个物理服务器上时,存在突破虚拟化逻辑隔离而获取其它虚机/用户的机密信息或者降低其性能的可能性。最著名的也许是旁侧攻击(side-channel attacks),这种攻击可以通过聪明地监控共享资源的使用来突破虚拟化边界而窃取用户数据。

以 SaaS 应用来说明。通过在多个客户组织(称为租户,tenant)之间共享硬件和软件资源,多租户已经取得了令人信服的降低运营成本的效果。在云计算领域中,通过划分/共用资源、减少管理和运维成本来降低运行成本。最大的成本降低效果是通过应用层面多租户(application-level multi-tenancy)来实现的,然而,这种方式会带来不同租户之间性能如何隔离(一个租户的行为不能太影响别的租户)的问题,以及如何实现不同租户不同SLA。

在 SaaS 层面,多租户是一种应用的架构形式,它使得 SaaS 提供商可以通过搭建在共享的硬件和软件架构上的一个应用来同时地服务不同租户中的用户。这么做,可以通过更好地利用基础架构资源,以及简化维护和管理来显著降低运行费用,比如,对应用做一次升级就可以使得所有用户获得最新版本。

SaaS 多租户可以在不同的层面实现:(1)利用虚拟化技术在基础架构层实现,比如给不同的租户创建单独的虚机,在虚机中运行应用 (2)在中间件层实现:共享操作系统和中间件,租户拥有单独的应用,比如容器 (3)在应用层实现:所有租户共享单个或者若干个应用,在应用内或者应用访问层实现租户隔离。其中,在应用层实现可以最大限度地提高效率:所有底层架构,包括存储、操作系统、中间件和应用都在不同的租户之间共享。

然而,在应用层实现多租户,是最难实现性能隔离的。性能隔离的目标包括:(1)阻止一个租户使用应用影响到别的租户使用应用的性能 (2)确保每个租户的可能不同的 SLA。根据租户的需求,往往是价格,每个租户的 SLA 可以不同。

举个例子,一个 SaaS 供应商提供一个在线酒店预订系统作为一个在线软件服务给他的租户,比如旅游中介。每个旅游中介的员工和客户都是该租户的一个终端用户。这种应用在季节性需求旺盛或者举行促销时,租户的请求往往达到短期的峰值。因此,对于 SaaS 供应商来说,如果确保一个需求达到峰值的租户(比如正在做促销的租户)不会影响其它租户使用该应用的性能就非常关键了。除此以外,每个租户可以要求不同的 SLA,根据他们的需要。比如,一个大型的旅游中介往往要求在峰值期间能够处理更大量的请求。

为了说明这种租户的影响,我们使用两种方式来部署应用。第一种方式,给每个租户分配一个虚机,这种情况下,应用不是多租户的。性能隔离通过虚机实现,请求大的租户也没法获得分配给他们的虚机的资源以外的更多资源。第二种方式,在物理基础设施集群上部署一个多租户的应用集群。每个虚机中运行同样应用的一个实例,所有租户都可以访问。这个集群使用一个 FIFO 的负载均衡器来转发所有租户的请求到三个虚机上。而在应用层,没有做别的事情来做性能隔离。

第一种方式中,实现了不同租户之间的性能隔离,但是,这种方式有可能造成某个应用示例出现空闲。但是,第二种方式中的应用层面的多租户,一个租户的峰值请求明显地将会影响别的租户。理想情况下,云管理系统会监控访问请求的增长,并会在它出现峰值时增加新的虚机到集群中来处理新增请求。但是,这种方式需要至少几分钟的时间来启动新的虚机。

一个私有云往往是单租户的,因为它部署在一个企业的数据中心内,被该企业内的员工使用。一个公有云往往是多租户的,因为从成本考虑,所有的租户都共享硬件或者软件资源,租户隔离粒度相对较高。但是在某些时候,私有云或者公有云也需要较高的隔离粒度,比如一个公司内的财务部门,出于安全性考虑,需要它所使用的虚机与别的部门使用的虚机隔离开来;比如一个政企部门,在公有云上,要求它的所有虚机或者存储必须在单独的服务器上。这种情况下,可以分为两种隔离粒度:

在一个云内的有限隔离粒度:虚机被物理地隔离在指定的服务器上,但是存储和网络实现逻辑隔离就够了。
在多个云内的完全隔离:这就是专有云,一个用户完全使用专属物理资源来搭建它的专有云。
隔离可以在不同的层面,使用不同的技术实现:

物理层面的隔离:这是最完全的隔离,不同的租户使用不同的物理硬件,包括计算和存储服务器和网络设备等。
计算在操作系统层面的隔离:虚机,一方面它提供较高的安全隔离性,另一方面,它结合其它技术比如 Linux cgroup 来实现性能保证。
计算在中间件层面的隔离:比如容器,它共享操作系统等底层资源,使用 Linux namespace 等技术提供一般的隔离性。
网络在逻辑层面的隔离:使用 VLAN, VxLAN,GRE 等方式来实现网络流量的逻辑隔离。
存储在应用层面的隔离:比如 Ceph 和 Swift 等共享存储,提供应用层面的租户隔离性。
存储在应用层面提供隔离的局限性:

以 OpenStack Swift 为例,它跟其它大多数的云存储系统一样,在应用层级实现租户隔离,它的各种服务都是运行在特权级别(privileged level),使得特权用户能够访问 Swift 存储或者 Proxy节点上的所有租户和用户的数据。Swift 使用可插拔式访问控制模块来加强租户隔离,比如使用 OpenStack Keystone 或者 tempAuth。 同时,Swift 支持 container ACL,这些 ACL 数据保存在某个节点上的数据库中,然后被 swift-proxy 从数据库中获取并保存在 memcached 内,来实现高速数据访问。因此,一方面,这种实现可以使 Swift 非常轻量级,能够支持大量的租户,但是,它也带来一个潜在的问题,就是一个攻击者(attacker)能够获取属于任何租户的任何用户的数据。而且,在 Swift 组件内来阻止这种攻击非常困难,因为每个节点本身会保存不同租户的数据,包括使用 memcached 来保存敏感的访问控制数据。
收起
保险 · 2018-08-03
浏览9984

提问者

xushenggao
系统工程师西藏银行

问题来自

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2018-08-01
  • 关注会员:2 人
  • 问题浏览:10746
  • 最近回答:2018-08-03
  • X社区推广