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

戳蓝字“CSDN云计算”关注我们哦!

作者 | 匡大虎

责编 | 阿秃

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

什么是多租户集群?

这里首先介绍一下"租户",租户的概念不止局限于集群的用户,它可以包含为一组计算、网络、存储等资源组成的工作负载集合。

而在多租户集群中,需要在一个集群范围内(未来可能会是多集群)对不同的租户提供尽可能的安全隔离,以最大程度的避免恶意租户对其他租户的攻击,同时需要保证租户之间公平地分配共享集群资源。

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

  • 其中软隔离更多的是面向企业内部的多租需求,该形态下默认不存在恶意租户,隔离的目的是为了内部团队间的业务保护和对可能的安全攻击进行防护;

  • 而硬隔离面向的更多是对外提供服务的服务供应商,由于该业务形态下无法保证不同租户中业务使用者的安全背景,我们默认认为租户之间以及租户与 K8s 系统之间是存在互相攻击的可能,因此这里也需要更严格的隔离作为安全保障。

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

多租户应用场景


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

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

该场景下集群的所有用户均来自企业内部,这也是当前很多 K8s 集群客户的使用模式,因为服务使用者身份的可控性,相对来说这种业务形态的安全风险是相对可控的,毕竟老板可以直接裁掉不怀好意的员工:)。

根据企业内部人员结构的复杂程度,我们可以通过命名空间对不同部门或团队进行资源的逻辑隔离,同时定义以下几种角色的业务人员:

  • 集群管理员:具有集群的管理能力(扩缩容、添加节点等操作);负责为租户管理员创建和分配命名空间;负责各类策略(RAM/RBAC / networkpolicy / quota...)的 CRUD;

  • 租户管理员:至少具有集群的 RAM 只读权限;管理租户内相关人员的 RBAC 配置;

  • 租户内用户:在租户对应命名空间内使用权限范围内的 K8s 资源。

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

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

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

2. 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 原生安全能力的多租户实践。

1. 访问控制


  • AuthN & AuthZ & Admission

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

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 的有效增强。

2. 资源调度相关


  • 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 添加同样的容忍配置来访问该节点,因此仅使用节点污点和容忍机制还无法在非受信的多租集群上保证目标节点的独占性。

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

3. 敏感信息保护


  • secrets encryption at REST

在多租户集群中不同租户用户共享同一套 etcd 存储,在最终用户可以访问 Kubernetes 控制平面的场景下,我们需要保护 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 级别的细粒度访问控制;

  • 使用安全容器实现容器运行时刻内核级别的安全隔离;

  • 完备的监控、日志、存储等服务的多租隔离方案。

文章来源:阿里巴巴云原生,点击查看原文。

福利扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!
推荐阅读:
  • 详谈ARM架构与ARM内核发展史

  • 华为组织架调整,Cloud&AI升至第四大BG,打通全球第一款集成5G模组的4K直播编码器网络通信服务;谷歌宣布与IBM合作……

  • 铁打的春晚,流水的互联网公司

  • 贾扬清感谢信:阿里开源10年,致敬千万开源人

  • 2019全年盘点之一:公链生死战场

  • 鲲鹏之大,何止几千里?

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scara机器人dh参数表_两分钟带你了解机器人标定的因素

为什么机器人需要标定?影响机器人本体精度因素分为两大类:运动学因素——加工误差、机械公差/装配误差、减速器精度、减速器空程等;动力学因素——质量、惯性张量、摩擦力、关节柔性、连杆柔性。机器人本体的实际精度和理论设计模型可能会存在…

Git的3大区域

为什么使用git? 为了保存文件的每一个历史记录,以便查看每一个历史节点的文件变动情况和把错误的的历史节点回滚。 git分为3个区域,工作区、暂存区、版本库(本地)。 工作区包括git已经管理的文件区域和新增以及修改的文件区域 暂存区&#x…

python编辑学生分数_python处理excel(04)数据筛选和过滤

源数据,我们最终要找出年龄在18——30岁之间,分数大于85分的学生,为A类学生。在excel里可以使用筛选功能,先筛选age列,大于等于、小于。这两个条件限制。然后选score后边的小三角,条件为大于等于85.最终数据…

如何打通“鱼塘” ?腾讯启动“SaaS技术联盟” 共建技术中台

戳蓝字“CSDN云计算”关注我们哦!作者 | 刘丹出品 | CSDN云计算(ID:CSDNcloud)“SaaS企业迎来了最好的时代。一方面,产业互联网大潮已至,中国企业降本增效的需求提升;另一方面,云计算…

Git 回滚

文章目录1. 简述2. 命令版本3. idea 图形化版本(场景1)4. idea 图形化版本(场景2)1. 简述 Git 回滚:常见的有2种场景,第一种是回滚到之前版本,第二种是回滚到之后的版本。 2. 命令版本 用到的命令: 场景1(回滚之前的版本)&…

python开两个守护线程_python 守护线程

守护线程 如果python线程是守护线程,那么以为着这个线程是“不重要”的,“不重要”意味着如果他的父进程结束了但该守护线程没有运行完,守护进程就会被强制结束。如果线程是非守护线程,那么父进程只有等到守护线程运行完毕后才能结…

Nutanix企业云助力嘉里大通提升核心竞争力

Nutanix(纳斯达克代码:NTNX)近日宣布,物流行业领导企业嘉里大通 (Kerry EAS) 已采用Nutanix超融合基础架构(HCI)和企业云解决方案,进行企业数据中心的现代化改造。 尽管面临全球贸易和区内经济…

SoapUI 测试http接口实战

文章目录1. New SOAP project2. New TestSuite3. New TestCase4. Add HTTP Request5. 配置请求参数信息6. 选择请求报文类型1. New SOAP project 1)打开soapui–>右键Projects–>New SOAP project 2. New TestSuite 3. New TestCase 4. Add HTTP Request …

Git开发流程和工作流

开发流程: C2版本基于C1版本开发;C3版本基于C2版本开发; C4版本基于C3版本开发;C5版本基于C3版本开发; C6 是C4和C3合并后的版本 分支3个总览: 主分支、bug分支、新功能分支 Git修改变动分析:…

AI 安全在阿里业务中的实践,你了解吗?

我们知道,AI 技术将在很长一段时间占据互联网技术时代的风口。但是,有代码的地方就有缺陷,提到技术很难不讲安全,那么AI会不会碰到安全问题呢? AI安全 试想一下,未来的某个早晨,当你像往常一样…

解决idea修改html、js、css后,浏览器不能同步加载

重装了IDEA后,忽略了一些设置,导致在开发springboot项目时,启动了项目,修改了前端文件,但是浏览器中并不能实时加载修改的内容。 主要是IDEA的2个地方需要设置: 一、修改file-settings 二、在IDEA中&…

安全多方计算新突破!阿里首次实现“公开可验证” 的安全方案

阿里妹导读:近日,阿里安全双子座实验室与马里兰大学等高校合作的论文《Covert Security with Public Verifiability: Faster, Leaner, and Simpler 》【1】被欧洲密码年会(Eurocrypt)2019接收。这是国内公司在安全多方计算领域的第一篇顶会论文&#xff…

996!007!同是敲了2万行代码,为什么他却晋升了?

正在敲代码的你 ,春节假期即将来临,复盘这1年,你印象最深刻的一件事是什么?有人在群里回答了一条扎心的答案:忙碌1年,每天996,回首2019除了加班再无成长可说。你以为只要把事情搞定了&#xff0…

消息称苹果斥资2亿美元收购Xnor.ai;华为2000万英镑投资,加速发展HMS手机生态系统;国产SSD将迎来爆发……...

戳蓝字“CSDN云计算”关注我们哦! 嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

Serverless 风暴来袭,前端工程师如何应对?

阿里妹导读:尽管大部分前端的工作并不涉及server,但最近半年serverless这个词汇以及其引发的热烈的讨论,深深触动了阿里巴巴高级前端技术专家伐薪。作为接触前端十余载的老开发,伐薪认为serverless可能会是接下来引起前端领域革命…

Git免密登陆远程

文章目录1. 生成公钥和私钥2. 拷贝公钥的内容,并设置到github中3.在git本地中配置ssh地址4. 以后使用5. 其他第三方代码托管仓库1. 生成公钥和私钥 执行以下命令: ssh-keygen注: windows (默认放在C:\Users\当前登录用户名.ssh目录下面) 例…

【机器学习PAI实战】—— 玩转人工智能之美食推荐

前言 在生活中,我们经常给朋友推荐一些自己喜欢的东西,也时常接受别人的推荐。怎么能保证推荐的电影或者美食就是朋友喜欢的呢?一般来说,你们两个人经常对同一个电影或者美食感兴趣,那么你喜欢的东西就很大程度上朋友…

小网站的容器化(上)

戳蓝字“CSDN云计算”关注我们哦!作者 | 王洪鹏出品 | CSDN云计算(ID:CSDNcloud)作为一枚程序员,大家几乎基本都有自己的个人网站,这些网站有的可能是自己开发的有的可能是用一些工具自动生成的&#xff0c…

Java 8中处理集合的优雅姿势——Stream

在Java中,集合和数组是我们经常会用到的数据结构,需要经常对他们做增、删、改、查、聚合、统计、过滤等操作。相比之下,关系型数据库中也同样有这些操作,但是在Java 8之前,集合和数组的处理并不是很便捷。 不过&#…