Kubernetes 多租户集群的实践
解决多租户集群的安全隔离问题对于企业上云而言至关重要。本文讨论了 Kubernetes 多租户集群的概念和常见的应用模式、企业内共享集群的业务场景以及 Kubernetes 现有的安全管理功能。
什么是多租户集群
首先,我们讨论一下“租户”是什么。租户的概念不仅是集群用户,还包括构成计算、网络、存储和其他资源的工作负载集。在多租户集群中,对单个集群中不同租户进行隔离,这样恶意租户就无法攻击其他租户,共享集群资源也能合理地分配给租户。
多租户应用场景
下面介绍两种不同隔离要求的企业多租户方案:
这种场景下,所有集群用户都来自企业,这也是许多 Kubernetes 集群客户的使用场景。由于服务用户的身份是可控的,因此这种业务模式的安全风险也相对可控,毕竟老板可以直接开掉有问题的员工。根据企业内部人员的结构,企业可以通过命名空间,按照逻辑对不同部门或团队的资源进行隔离。另外,定义具有以下角色的业务人员:
集群管理员 具有集群管理功能,例如伸缩容、添加节点等 为租户管理员创建并分配命名空间
管理各种策略,例如 RAM、RBAC、NetworkPolicy 以及 quota
租户管理员
至少拥有集群 RAM 只读权限
管理租户中相关人员的 RBAC 配置
租户用户
在租户命名空间允许范围内使用 Kubernetes 资源
实施多租户架构
在规划和实施多租户集群时,我们首先要通过资源隔离模型来使用 Kubernetes 的资源隔离层,该模型会将集群本身、命名空间、节点、Pod 和容器分别分层。当不同租户的应用程序负载共享相同的资源模型时,就可能会产生安全风险,因此,在实施多租户时,要控制每个租户可访问的资源域。在资源调度层面,还要确保处理敏感信息的容器只能运行在独立的资源节点上。当不同租户的负载共享同一资源域时,我们可以使用运行时的资源调度控制策略来降低跨租户攻击的风险。
访问控制
NetworkPolicy
Open Policy Agent(OPA)是一种功能强大的策略引擎,支持解耦的策略决策服务。目前,社区已经有了成熟的 Kubernetes 集成解决方案。当现有 RBAC 在命名空间级别上的隔离不能满足企业应用程序复杂的安全需求时,OPA 可以在对象模型级别提供细粒度的访问策略控制。另外,OPA 还支持 7 层 NetworkPolicy 定义以及基于标签和注释的跨命名空间访问控制,可以有效增强 Kubernetes 原生的 NetworkPolicy。
资源调度
资源配额(ResourceQuota)和限制范围(LimitRange)
注意:恶意租户可能绕过节点 taint 和 tolerance 机制强制实施策略。以下内容仅适用于企业内受信任租户的集群,或租户无法直接访问 Kubernetes 控制平面的集群。
但是,恶意租户会将相同的 tolerance 设置添加到 Pod 上来访问此节点,因此,仅使用节点 taint 和 tolerance 机制无法确保目标节点在非信任多租户集群中的安全性。
保护敏感信息—REST 的 secret 加密
在多租户集群中,不同的租户用户共享一套相同的 etcd 存储。当最终用户访问 Kubernetes 控制平面时,要保护好 secret 数据,以避免访问控制策略配置不正确时导致敏感信息泄漏。
总结
在部署多租户体系架构时,首先要确定相应的应用场景,包括租户内用户和应用程序的可信度和对应的安全隔离程度。另外,为满足基本的安全隔离要求,最好执行以下几点:
启用 Kubernetes 集群默认安全配置 启用 RBAC,禁止匿名用户访问 启用 secrets encryption,保护敏感信息 根据 CIS Kubernetes 基准执行安全配置 启用准入控制器,例如 NodeRestriction、AlwaysPullImages 和 PodSecurityPolicy 使用 PSP 控制 Pod 部署的特权模式,并在 Pod 运行时控制 Pod 的安全上下文 配置 NetworkPolicy Docker 运行时启用 Seccomp、AppArmor 和 SELinux 对监控、日志记录等服务进行多租户隔离
使用 OPA DENG 动态策略引擎在网络或对象级别进行细粒度的访问控制 部署安全容器,在容器运行时进行内核级隔离 对监视、日志记录、存储和其他服务实施全面的多租户隔离解决方案
https://medium.com/@Alibaba_Cloud/practices-of-kubernetes-multi-tenant-clusters-bde2b33fbd91
K8S 进阶训练营
扫描二维码获取
更多云原生知识
k8s 技术圈