k8s实践|如何解决多租户集群的安全隔离问题?

author author     2023-04-27     311

关键词:

作者 |?匡大虎? 阿里巴巴技术专家

导读:如何解决多租户集群的安全隔离问题是企业上云的一个关键问题,本文主要介绍 Kubernetes 多租户集群的基本概念和常见应用形态,以及在企业内部共享集群的业务场景下,基于 Kubernetes 原生和 ACK 集群现有安全管理能力快速实现多租户集群的相关方案。

什么是多租户集群?

这里首先介绍一下"租户",租户的概念不止局限于集群的用户,它可以包含为一组计算,网络,存储等资源组成的工作负载集合。而在多租户集群中,需要在一个集群范围内(未来可能会是多集群)对不同的租户提供尽可能的安全隔离,以最大程度的避免恶意租户对其他租户的***,同时需要保证租户之间公平地分配共享集群资源。

在隔离的安全程度上,我们可以将其分为软隔离 (Soft Multi-tenancy) 和硬隔离 (Hard Multi-tenancy) 两种。

  • 其中软隔离更多的是面向企业内部的多租需求,该形态下默认不存在恶意租户,隔离的目的是为了内部团队间的业务保护和对可能的安全***进行防护;
  • 而硬隔离面向的更多是对外提供服务的服务供应商,由于该业务形态下无法保证不同租户中业务使用者的安全背景,我们默认认为租户之间以及租户与 K8s 系统之间是存在互相***的可能,因此这里也需要更严格的隔离作为安全保障。

关于多租户的不同应用场景,在下节会有更细致的介绍。

技术图片

多租户应用场景

下面介绍一下典型的两种企业多租户应用场景和不同的隔离需求:

企业内部共享集群的多租户

该场景下集群的所有用户均来自企业内部,这也是当前很多 K8s 集群客户的使用模式,因为服务使用者身份的可控性,相对来说这种业务形态的安全风险是相对可控的,毕竟老板可以直接裁掉不怀好意的员工:)根据企业内部人员结构的复杂程度,我们可以通过命名空间对不同部门或团队进行资源的逻辑隔离,同时定义以下几种角色的业务人员:

  • 集群管理员:具有集群的管理能力(扩缩容、添加节点等操作);负责为租户管理员创建和分配命名空间;负责各类策略(RAM/RBAC/networkpolicy/quota...)的 CRUD;
  • 租户管理员:至少具有集群的 RAM 只读权限;管理租户内相关人员的 RBAC 配置;
  • 租户内用户:在租户对应命名空间内使用权限范围内的 K8s 资源。

在建立了基于用户角色的访问控制基础上,我们还需要保证命名空间之间的网络隔离,在不同的命名空间之间只能够允许白名单范围内的跨租户应用请求。

另外,对于业务安全等级要求较高的应用场景,我们需要限制应用容器的内核能力,可以配合 seccomp / AppArmor / SELinux 等策略工具达到限制容器运行时刻 capabilities 的目的。

技术图片

当然 Kubernetes 现有的命名空间单层逻辑隔离还不足以满足一部分大型企业应用复杂业务模型对隔离需求,我们可以关注?Virtual Cluster,它通过抽象出更高级别的租户资源模型来实现更精细化的多租管理,以此弥补原生命名空间能力上的不足。

SaaS & KaaS 服务模型下的多租户

在 SaaS 多租场景下, Kubernetes 集群中的租户对应为 SaaS 平台中各服务应用实例和 SaaS 自身控制平面,该场景下可以将平台各服务应用实例划分到彼此不同的命名空间中。而服务的最终用户是无法与 Kubernetes 的控制平面组件进行交互,这些最终用户能够看到和使用的是 SaaS 自身控制台,他们通过上层定制化的 SaaS 控制平面使用服务或部署业务(如下左图所示)。

例如,某博客平台部署在多租户集群上运行。在该场景下,租户是每个客户的博客实例和平台自己的控制平面。平台的控制平面和每个托管博客都将在不同的命名空间中运行。客户将通过平台的界面来创建和删除博客、更新博客软件版本,但无法了解集群的运作方式。

KaaS 多租场景常见于云服务提供商,该场景下业务平台的服务直接通过 Kubernetes 控制平面暴露给不同租户下的用户,最终用户可以使用 K8s 原生 API 或者服务提供商基于 CRDs/controllers 扩展出的接口。出于隔离的最基本需求,这里不同租户也需要通过命名空间进行访问上的逻辑隔离,同时保证不同租户间网络和资源配额上的隔离。

与企业内部共享集群不同,这里的最终用户均来自非受信域,他们当中不可避免的存在恶意租户在服务平台上执行恶意代码,因此对于 SaaS/KaaS 服务模型下的多租户集群,我们需要更高标准的安全隔离,而 Kubernetes 现有原生能力还不足以满足安全上的需求,为此我们需要如安全容器这样在容器运行时刻内核级别的隔离来强化该业务形态下的租户安全。

技术图片

实施多租户架构

在规划和实施多租户集群时,我们首先可以利用的是 Kubernetes 自身的资源隔离层,包括集群本身、命名空间、节点、pod 和容器均是不同层次的资源隔离模型。当不同租户的应用负载能够共享相同的资源模型时,就会存在彼此之间的安全隐患。为此,我们需要在实施多租时控制每个租户能够访问到的资源域,同时在资源调度层面尽可能的保证处理敏感信息的容器运行在相对独立的资源节点内;如果出于资源开销的角度,当有来自不同租户的负载共享同一个资源域时,可以通过运行时刻的安全和资源调度控制策略减少跨租户***的风险。

虽然 Kubernetes 现有安全和调度能力还不足以完全安全地实施多租隔离,但是在如企业内部共享集群这样的应用场景下,通过命名空间完成租户间资源域的隔离,同时通过 RBAC、PodSecurityPolicy、NetworkPolicy 等策略模型控制租户对资源访问范围和能力的限制,以及现有资源调度能力的结合,已经可以提供相当的安全隔离能力。而对于 SaaS、KaaS 这样的服务平台形态,我们可以通过阿里云容器服务近期推出的安全沙箱容器来实现容器内核级别的隔离,能够最大程度的避免恶意租户通过逃逸手段的跨租户***。

本节重点关注基于 Kubernetes 原生安全能力的多租户实践。

访问控制

AuthN & AuthZ & Admission

ACK 集群的授权分为 RAM 授权和 RBAC 授权两个步骤,其中 RAM 授权作用于集群管理接口的访问控制,包括对集群的 CRUD 权限(如集群可见性、扩缩容、添加节点等操作),而 RBAC 授权用于集群内部 Kubernetes 资源模型的访问控制,可以做到指定资源在命名空间粒度的细化授权。

ACK 授权管理为租户内用户提供了不同级别的预置角色模板,同时支持绑定多个用户自定义的集群角色,此外支持对批量用户的授权。如需详细了解 ACK 上集群相关访问控制授权,请参阅相关帮助文档

NetworkPolicy

NetworkPolicy 可以控制不同租户业务 pod 之间的网络流量,另外可以通过白名单的方式打开跨租户之间的业务访问限制。

您可以在使用了 Terway 网络插件的容器服务集群上配置 NetworkPolicy,这里可以获得一些策略配置的示例。

PodSecurityPolicy

PSP 是 K8s 原生的集群维度的资源模型,它可以在apiserver中pod创建请求的 admission 阶段校验其运行时刻行为是否满足对应 PSP 策略的约束,比如检查 pod 是否使用了 host 的网络、文件系统、指定端口、PID namespace 等,同时可以限制租户内的用户开启特权(privileged)容器,限制挂盘类型,强制只读挂载等能力;不仅如此,PSP 还可以基于绑定的策略给 pod 添加对应的 SecurityContext,包括容器运行时刻的 uid,gid 和添加或删除的内核 capabilities 等多种设置。

关于如何开启 PSP admission 和相关策略及权限绑定的使用,可以参阅这里

OPA

OPA(Open Policy Agent)是一种功能强大的策略引擎,支持解耦式的 policy decisions 服务并且社区已经有了相对成熟的与 Kubernetes 的集成方案。当现有 RBAC 在命名空间粒度的隔离不能够满足企业应用复杂的安全需求时,可以通过 OPA 提供 object 模型级别的细粒度访问策略控制。

同时 OPA 支持七层的 NetworkPolicy 策略定义及基于 labels/annotation 的跨命名空间访问控制,可以作为 K8s 原生 NetworkPolicy 的有效增强。

资源调度相关

Resource Quotas & Limit Range

在多租户场景下,不同团队或部门共享集群资源,难免会有资源竞争的情况发生,为此我们需要对每个租户的资源使用配额做出限制。其中 ResourceQuota 用于限制租户对应命名空间下所有 pod 占用的总资源 request 和 limit,LimitRange 用来设置租户对应命名空间中部署 pod 的默认资源 request 和 limit 值。另外我们还可以对租户的存储资源配额和对象数量配额进行限制。

关于资源配额的详细指导可以参见这里

Pod Priority/Preemption

从 1.14 版本开始 pod 的优先级和抢占已经从 beta 成为稳定特性,其中 pod priority 标识了 pod 在 pending 状态的调度队列中等待的优先级;而当节点资源不足等原因造成高优先的 pod 无法被调度时,scheduler 会尝试驱逐低优先级的 pod 来保证高优先级 pod 可以被调度部署。

在多租户场景下,可以通过优先级和抢占设置确保租户内重要业务应用的可用性;同时 pod priority 可以和 ResouceQuota 配合使用,完成租户在指定优先级下有多少配额的限制。

Dedicated Nodes

注意:恶意租户可以规避由节点污点和容忍机制强制执行的策略。以下说明仅用于企业内部受信任租户集群,或租户无法直接访问 Kubernetes 控制平面的集群。

通过对集群中的某些节点添加污点,可以将这些节点用于指定几个租户专门使用。在多租户场景下,例如集群中的 GPU 节点可以通过污点的方式保留给业务应用中需要使用到 GPU 的服务团队使用。集群管理员可以通过如 effect: "NoSchedule" 这样的标签给节点添加污点,同时只有配置了相应容忍设置的 pod 可以被调度到该节点上。

当然恶意租户可以同样通过给自身 pod 添加同样的容忍配置来访问该节点,因此仅使用节点污点和容忍机制还无法在非受信的多租集群上保证目标节点的独占性。

关于如何使用节点污点机制来控制调度,请参阅这里

敏感信息保护

secrets encryption at REST

在多租户集群中不同租户用户共享同一套 etcd 存储,在最终用户可以访问 Kubernetes 控制平面的场景下,我们需要保护 secrets 中的数据,避免在访问控制策略配置不当情况下的敏感信息泄露。为此可以参考 K8s 原生的 secret 加密能力,请参阅这里

ACK 也提供了基于阿里云 KMS 服务的 secrets 加密开源解决方案,可以参阅这里

总结

在实施多租户架构时首先需要确定对应的应用场景,包括判断租户内用户和应用负载的可信程度以及对应的安全隔离程度。在此基础上以下几点是安全隔离的基本需求:

  • 开启 Kubernetes 集群的默认安全配置:开启 RBAC 鉴权并实现基于namespace的软隔离;开启 secrets encryption 能力,增强敏感信息保护;基于 CIS Kubernetes benchmarks 进行相应的安全配置;
  • 开启 NodeRestriction, AlwaysPullImages, PodSecurityPolicy 等相关 admission controllers;
  • 通过 PSP 限制 pod 部署的特权模式,同时控制其运行时刻 SecurityContext;
  • 配置 NetworkPolicy;
  • 使用Resource Quota & Limit Range限制租户的资源使用配额;
  • 在应用运行时刻遵循权限的最小化原则,尽可能缩小pod内容器的系统权限;
  • Log everything;
  • 对接监控系统,实现容器应用维度的监控。

而对于如 SaaS、KaaS 等服务模型下,或者我们无法保证租户内用户的可信程度时,我们需要采取一些更强有力的隔离手段,比如:

  • 使用如 OPA 等动态策略引擎进行网络或 Object 级别的细粒度访问控制;
  • 使用安全容器实现容器运行时刻内核级别的安全隔离;
  • 完备的监控、日志、存储等服务的多租隔离方案。

注意:文中图片来源

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

多租户隔离数据库上 DAL 和配置的最佳实践

】多租户隔离数据库上DAL和配置的最佳实践【英文标题】:bestpracticeforDALandconfigurationonMulti-TenantisolatedDB【发布时间】:2012-12-2305:31:32【问题描述】:我的公司拥有十几个网站和独立的数据库(相同的模式)。每个客户都有自己... 查看详情

基于k8s多集群隔离环境下的devops实现

...的自动化构建和持续部署,提高迭代效率。直达最佳实践:【基于k8s多集群隔离环境下的devops实现】云栖号 查看详情

如何基于k8s多租能力构建serverlesscontainer

...在基于K8S构建企业级ServerlessContainer平台过程中的探索与实践,涉及容器安全隔离、多租管理、Serverless理念在Kub 查看详情

k8s安全军规101:对cncf最佳实践的扩充

...分享了CNCF为广大Kubernetes用户建议的9项Kubernetes安全最佳实践,分享了用户使用Kubernetes管理集群时的9个能进一步确保集群安全的基本操作。 上篇文章中的建议非常好,但不足之处在于它们都过于依赖GKE了。对于那些使用谷歌... 查看详情

什么是多租户模式?

...用一个实例,租户的数据既有隔离又有共享,说到底就是如何解决数据存储的问题。  现在SaaSMulti-Tenant在数据存储上存在三种主要的方案,分别是—  方案一:独立数据库  这是第一种方案,即一个Tenant一个Database(见图... 查看详情

6大能力升级,自研容器网络和负载均衡能力大大增强博云容器云产品最新升级

...Overlay/Under两种部署模式,支持固定IP、DPDK、NetworkPolicy、租户隔离、Pod-security。FabricOverlay基于Vxlan,相比于Underlay网络,节省IP资源。增强网络隔离能力应用网络隔离:支持同一租户下设置应用的访问策略(NetworkPolicy)。租户网... 查看详情

互动赠书|云上云下k8s多集群如何实现集群管理和安全治理的一致体验?

简介:本文将主要为您介绍如何实现对公共云ACK集群和数据中心自建Kubernetes集群一致体验的集群管理和安全治理。作者| 郝树伟(流生)以Kubernetes为代表的云原生技术不仅屏蔽了各个云厂商和数据中心在基础设... 查看详情

灵活高效的云原生集群管理经验:用k8s管理k8s

...中一样快速触达客户环境,运维成本被进一步放大。因此如何低成本、高效率、 查看详情

基于adminlte多租户权限隔离

...用开发平台,封装和集成多种组件,提供前端、后端整体解决方案,使得运维WEB开发更简单背景需求:        当前做的系统是运维自动化平台,要做到多租户的权限隔离,直白的说如果张三具有A,B,C... 查看详情

工商银行:应用多k8s集群管理及容灾实践

...平台架构师沈一帆发表了《工商银行多k8s集群管理及容灾实践》主题演讲,分享了工商银行使用多云容器编排引擎Karmada的落地实践过程。本文分享自华为云社区《Karmada|工商银行多k8s集群管理及容灾实践》,原文作者ÿ... 查看详情

alluxio2.9新版发布|重塑架构,支持大规模多租户环境

...:增加跨环境集群同步功能,支持横向扩展的多租户架构;显著改进在Kubernetes上部署的工具集和指南,增强Alluxio的易管理性;以及通过优化S3API和POSIXAPI实现安全性和性能提升。本次,Alluxio2.9社区版和企... 查看详情

6大能力升级,自研容器网络和负载均衡能力大大增强博云容器云产品最新升级

...Overlay/Under两种部署模式,支持固定IP、DPDK、NetworkPolicy、租户隔离、Pod-security。 FabricOverlay基于Vxlan,相比于Underlay网络,节省IP资源。 2. 增强网络隔离能力应用网络隔离:支持同一租户下设置应用的访问策略(NetworkPol... 查看详情

关于k8s集群环境工作组隔离配置多集群切换的一些笔记(代码片段)

写在前面分享一些K8s中集群管理的笔记博文内容涉及集群环境隔离的相关配置:单集群多命名空间隔离及用户认证鉴权配置Demo多集群的统一管理配置,集群切换Demo理解不足小伙伴帮忙指正食用方式:需要了解K8s集群&... 查看详情

如何使用 Java Spring 在 MySql 中实现多租户 [关闭]

...:2018-02-2605:13:48【问题描述】:如何使用MySqlJavaSpring最佳实践实现多租户,并建议使用任何其他数据库代替MySql进行多租户写入和读取以用于报告目的。【问题讨论】:在此处查看具有完整源代码的有效解决方案 查看详情

k8s1.9.0安装--完整集群部署(代码片段)

...其实网络安全本身就是为了解决在某些假设成立的条件下如何防范的问题。比如一个非常重要的假设就是两个节点或者ip之间的通讯 查看详情

k8s容器编排(代码片段)

...备的集群管理能力:包括多层次的安全防护和准入机制多租户应用支撑能力透明的服务注册和服务发现机制内建智能负载均衡器强大的故障发现和自我修复能力服务滚动升级和在线扩容能力可扩展的资源自动调度机制以及多粒度... 查看详情

eeplatpaas中的多租户数据隔离模式

EEPlatPaaS支持三种租户的数据隔离技术:SparceColumn、tenantId字段隔离、每一个租户独立数据库。1)SparceColumn,和SalesforceAppforce类似,主要通过一个通用表来存放全部自己定义信息,里面有租户字段和非常多统一的数据栏位(比... 查看详情

精句k8s资源管理概述

...xff1f;主要指应用程序运行时所需的cpu资源和内存资源。k8s如何实现计算资源管理?资源分区管理:每个node都提供了cpu、内存、网络、磁盘等可以从分区的方式宏观 查看详情